) {
const { children } = props
const me = useAppSelector((state) => state.me)
- const jtoolUsers = JTOOL_USERS.split(',').map((id: string) => id.trim())
+ const appConfig = useContext(AppConfig)
- if (!!jtoolUsers.find((id: string) => id === me?.id)) {
+ if (!!appConfig.system.jToolUsers.find((id: string) => id === me?.id)) {
return <>{children}>
}
return
diff --git a/src/components/Impersonation/index.tsx b/src/components/Impersonation/index.tsx
index e20a38542..f7a9c0c04 100644
--- a/src/components/Impersonation/index.tsx
+++ b/src/components/Impersonation/index.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react'
+import React, { useContext, useEffect, useState } from 'react'
import { InternalAxiosRequestConfig } from 'axios'
import ModalImpersonation from './ModalImpersonation'
import Overlay from './Overlay'
@@ -9,12 +9,11 @@ import { useAppDispatch, useAppSelector } from 'state'
import PeopleAltIcon from '@mui/icons-material/PeopleAlt'
import { IconButton } from '@mui/material'
import { User } from 'types'
-import { CODE_DISPLAY_JWT } from 'constants.js'
import { impersonate, updatePerimeters as updatePerimetersAction } from 'state/me'
import { updatePerimeters } from 'views/Login/utils'
import { saveRights } from 'state/scope'
-
-export const IMPERSONATED_USER = 'impersonated_user'
+import { AppConfig } from 'config'
+import { IMPERSONATED_USER } from 'constants.js'
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const addImpersonationToken = (config: InternalAxiosRequestConfig
) => {
@@ -34,6 +33,7 @@ type ImpersonationProps = {
const Impersonation = (props: ImpersonationProps) => {
const { UserInfo } = props
const dispatch = useAppDispatch()
+ const appConfig = useContext(AppConfig)
const me = useAppSelector((state) => state.me)
const [modalOpen, setModalOpen] = useState(false)
const [haveRightFullAdmin, setHaveRightFullAdmin] = useState(false)
@@ -69,7 +69,7 @@ const Impersonation = (props: ImpersonationProps) => {
}, [me?.userName])
useEffect(() => {
- const code_display_jwt = CODE_DISPLAY_JWT.split(',')
+ const code_display_jwt = appConfig.system.codeDisplayJWT.split(',')
let code_display_jwtPosition = 0
const keyHandler = (event: KeyboardEvent) => {
diff --git a/src/components/Patient/PatientImaging/PatientImaging.tsx b/src/components/Patient/PatientImaging/PatientImaging.tsx
index 2919e5cec..efba7c7c7 100644
--- a/src/components/Patient/PatientImaging/PatientImaging.tsx
+++ b/src/components/Patient/PatientImaging/PatientImaging.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useMemo, useRef, useState } from 'react'
+import React, { useContext, useEffect, useMemo, useRef, useState } from 'react'
import { CanceledError } from 'axios'
import { useAppDispatch, useAppSelector } from 'state'
import { fetchImaging } from 'state/patient'
@@ -32,13 +32,14 @@ import List from 'components/ui/List'
import services from 'services/aphp'
import { BlockWrapper } from 'components/ui/Layout'
import EncounterStatusFilter from 'components/Filters/EncounterStatusFilter'
-import { MAIL_SUPPORT } from '../../../constants'
import { SourceType } from 'types/scope'
import { Hierarchy } from 'types/hierarchy'
+import { AppConfig } from 'config'
const PatientImaging: React.FC = ({ groupId }) => {
const dispatch = useAppDispatch()
+ const appConfig = useContext(AppConfig)
const patient = useAppSelector((state) => state.patient)
const [loadingStatus, setLoadingStatus] = useState(LoadingStatus.FETCHING)
const [toggleFilterByModal, setToggleFilterByModal] = useState(false)
@@ -156,7 +157,7 @@ const PatientImaging: React.FC = ({ groupId }) => {
actuellement disponibles. Le flux alimentant les métadonnées associées aux séries et aux examens est suspendu
depuis le 01/02/2023 suite à la migration du PACS AP-HP. Aucun examen produit après cette date n'est
disponible via Cohort360. Pour tout besoin d'examen post 01/02/2023, merci de contacter le support Cohort360 :{' '}
- {MAIL_SUPPORT}.
+ {appConfig.system.mailSupport}.
diff --git a/src/components/Patient/PatientTimeline/PatientTimeline.tsx b/src/components/Patient/PatientTimeline/PatientTimeline.tsx
index e16416e87..ad84d4c6f 100644
--- a/src/components/Patient/PatientTimeline/PatientTimeline.tsx
+++ b/src/components/Patient/PatientTimeline/PatientTimeline.tsx
@@ -31,7 +31,7 @@ import { Condition, DocumentReference, Encounter, Period, Procedure } from 'fhir
import { FilterKeys, LabelObject } from 'types/searchCriterias'
import { Hierarchy } from 'types/hierarchy'
import { getExtension } from 'utils/fhir'
-import { CONDITION_STATUS, ORBIS_STATUS_EXTENSION_NAME } from 'constants.js'
+import { getConfig } from 'config'
const dateFormat = 'YYYY-MM-DD'
@@ -112,8 +112,11 @@ const generateTimelineFormattedData = (
? !!selectedTypes.find(
(selectedType) =>
selectedType.id ===
- getExtension(item, ORBIS_STATUS_EXTENSION_NAME)?.valueCodeableConcept?.coding?.find(
- (elem) => elem?.system === CONDITION_STATUS
+ getExtension(
+ item,
+ getConfig().features.condition.extensions.orbisStatus
+ )?.valueCodeableConcept?.coding?.find(
+ (elem) => elem?.system === getConfig().features.condition.valueSets.conditionStatus.url
)?.code
)
: true
diff --git a/src/components/Requests/ProjectsTable/VersionRow/index.tsx b/src/components/Requests/ProjectsTable/VersionRow/index.tsx
index 5901a2829..c866b6251 100644
--- a/src/components/Requests/ProjectsTable/VersionRow/index.tsx
+++ b/src/components/Requests/ProjectsTable/VersionRow/index.tsx
@@ -1,4 +1,4 @@
-import React from 'react'
+import React, { useContext } from 'react'
import { useNavigate } from 'react-router-dom'
import moment from 'moment'
@@ -34,13 +34,14 @@ import { Cohort, CohortJobStatus } from 'types'
import displayDigit from 'utils/displayDigit'
import useStyles from '../styles'
-import { ODD_EXPORT } from '../../../../constants'
+import { AppConfig } from 'config'
const VersionRow: React.FC<{ requestId: string; cohortsList: Cohort[] }> = ({ requestId, cohortsList }) => {
const { classes } = useStyles()
const dispatch = useAppDispatch()
const navigate = useNavigate()
+ const appConfig = useContext(AppConfig)
const [selectedExportableCohort, setSelectedExportableCohort] = React.useState(null)
const cohorts: Cohort[] =
@@ -87,7 +88,8 @@ const VersionRow: React.FC<{ requestId: string; cohortsList: Cohort[] }> = ({ re
cohort.request_job_status === CohortJobStatus.NEW ||
!!cohort.request_job_fail_msg
- const canExportThisCohort = !!ODD_EXPORT && !isError ? cohort.rights?.export_csv_nomi : false
+ const canExportThisCohort =
+ !!appConfig.features.export.enabled && !isError ? cohort.rights?.export_csv_nomi : false
return (
@@ -178,7 +180,7 @@ const VersionRow: React.FC<{ requestId: string; cohortsList: Cohort[] }> = ({ re
- {!!ODD_EXPORT && (
+ {!!appConfig.features.export.enabled && (
{
const { classes } = useStyles()
const dispatch = useAppDispatch()
const navigate = useNavigate()
+ const appConfig = useContext(AppConfig)
const me = useAppSelector((state) => state.me)
const isOpen = useAppSelector((state) => state.autoLogout.isOpen)
@@ -41,7 +43,7 @@ const AutoLogoutContainer = () => {
const { reset, pause, start } = useIdleTimer({
crossTab: true,
syncTimers: 0,
- timeout: SESSION_TIMEOUT,
+ timeout: appConfig.system.sessionTimeout,
promptBeforeIdle: 1 * 60 * 1000,
throttle: 1 * 60 * 1000,
onPrompt: handleOnPrompt,
@@ -88,12 +90,12 @@ const AutoLogoutContainer = () => {
start()
const interval = setInterval(() => {
refreshToken()
- }, REFRESH_TOKEN_INTERVAL)
+ }, appConfig.system.refreshTokenInterval)
return () => {
clearInterval(interval)
pause()
}
- }, [me])
+ }, [me, appConfig.system.refreshTokenInterval])
if (!me) return <>>
diff --git a/src/components/Routes/LeftSideBar/LeftSideBar.tsx b/src/components/Routes/LeftSideBar/LeftSideBar.tsx
index 99b858f1d..b9c11cc4e 100644
--- a/src/components/Routes/LeftSideBar/LeftSideBar.tsx
+++ b/src/components/Routes/LeftSideBar/LeftSideBar.tsx
@@ -1,4 +1,4 @@
-import React, { useState, useEffect, ReactElement } from 'react'
+import React, { useState, useEffect, ReactElement, useContext } from 'react'
import { useNavigate } from 'react-router-dom'
import {
@@ -38,12 +38,12 @@ import { logout as logoutAction } from 'state/me'
import { open as openAction, close as closeAction } from 'state/drawer'
import { resetCohortCreation } from 'state/cohortCreation'
-import { ODD_CONTACT } from '../../../constants'
import useStyles from './styles'
import versionInfo from 'data/version.json'
import Impersonation from 'components/Impersonation'
import { Egg1, Egg2 } from 'components/Impersonation/Eggs'
import JToolEggWrapper from 'components/Impersonation/JTool'
+import { AppConfig } from 'config'
const smallDrawerWidth = 52
const largeDrawerWidth = 260
@@ -54,6 +54,7 @@ const LeftSideBar: React.FC<{ open?: boolean }> = (props) => {
const navigate = useNavigate()
const dispatch = useAppDispatch()
+ const appConfig = useContext(AppConfig)
const practitioner = useAppSelector((state) => state.me)
const open = useAppSelector((state) => state.drawer)
const cohortCreation = useAppSelector((state) => state.cohortCreation)
@@ -380,7 +381,7 @@ const LeftSideBar: React.FC<{ open?: boolean }> = (props) => {
)}
- {ODD_CONTACT &&
+ {appConfig.features.contact.enabled &&
(open ? (
- {!!ODD_EXPORT && openModal === 'edit' && (
+ {!!appConfig.features.export.enabled && openModal === 'edit' && (
{
diff --git a/src/components/WebSocket/WebSocketProvider.tsx b/src/components/WebSocket/WebSocketProvider.tsx
index 71951e7c5..1448e769c 100644
--- a/src/components/WebSocket/WebSocketProvider.tsx
+++ b/src/components/WebSocket/WebSocketProvider.tsx
@@ -1,5 +1,6 @@
-import { ACCESS_TOKEN, BACK_API_URL, SOCKET_API_URL } from '../../constants'
-import React, { PropsWithChildren, createContext, useEffect, useRef } from 'react'
+import { AppConfig } from 'config'
+import { ACCESS_TOKEN } from '../../constants'
+import React, { PropsWithChildren, createContext, useContext, useEffect, useRef } from 'react'
import useWebSocket, { ReadyState } from 'react-use-websocket'
import { WebSocketHook } from 'react-use-websocket/dist/lib/types'
import { WebSocketMessage } from 'types'
@@ -13,12 +14,16 @@ type WebSocketContentType = {
export const WebSocketContext = createContext(null)
export const WebSocketProvider = ({ children }: PropsWithChildren) => {
- const websocket = useWebSocket(`${SOCKET_API_URL}${window.location.host}${BACK_API_URL}/ws/`, {
- share: true,
- onError: () => console.error('An error occured.'),
- onClose: () => console.info('Disconnected from WebSocket.'),
- shouldReconnect: () => true
- })
+ const appConfig = useContext(AppConfig)
+ const websocket = useWebSocket(
+ `${appConfig.system.wsProtocol}${window.location.host}${appConfig.system.backendUrl}/ws/`,
+ {
+ share: true,
+ onError: () => console.error('An error occured.'),
+ onClose: () => console.info('Disconnected from WebSocket.'),
+ shouldReconnect: () => true
+ }
+ )
const websocketRef = useRef(Object.assign({}, websocket))
diff --git a/src/components/ui/ValidationDialog/index.tsx b/src/components/ui/ValidationDialog/index.tsx
index d368b125f..42dcc33ab 100644
--- a/src/components/ui/ValidationDialog/index.tsx
+++ b/src/components/ui/ValidationDialog/index.tsx
@@ -1,11 +1,11 @@
-import React from 'react'
+import React, { useContext } from 'react'
import { Dialog, DialogContent, DialogActions, Button, Typography, CircularProgress, Grid } from '@mui/material'
import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'
import WarningIcon from '@mui/icons-material/Warning'
-import { MAIL_SUPPORT } from '../../../constants'
import { LoadingStatus } from 'types'
import useStyles from './styles'
+import { AppConfig } from 'config'
type ValidationDialogProps = {
open: boolean
@@ -17,6 +17,7 @@ type ValidationDialogProps = {
const ValidationDialog: React.FC = ({ open, onClose, message, loading, error }) => {
const { classes } = useStyles()
+ const appConfig = useContext(AppConfig)
return (