157 lines
4.1 KiB
TypeScript
157 lines
4.1 KiB
TypeScript
// External
|
|
import React, { useEffect, useState } from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import i18n from '@ohif/i18n';
|
|
import { I18nextProvider } from 'react-i18next';
|
|
import { BrowserRouter } from 'react-router-dom';
|
|
import Compose from './routes/Mode/Compose';
|
|
import { ServicesManager, ExtensionManager, CommandsManager, HotkeysManager } from '@ohif/core';
|
|
import {
|
|
DialogProvider,
|
|
Modal,
|
|
ModalProvider,
|
|
SnackbarProvider,
|
|
ThemeWrapper,
|
|
ViewportDialogProvider,
|
|
ViewportGridProvider,
|
|
CineProvider,
|
|
UserAuthenticationProvider,
|
|
} from '@ohif/ui';
|
|
// Viewer Project
|
|
// TODO: Should this influence study list?
|
|
import { AppConfigProvider } from '@state';
|
|
import createRoutes from './routes';
|
|
import appInit from './appInit.js';
|
|
import OpenIdConnectRoutes from './utils/OpenIdConnectRoutes';
|
|
|
|
let commandsManager: CommandsManager,
|
|
extensionManager: ExtensionManager,
|
|
servicesManager: ServicesManager,
|
|
hotkeysManager: HotkeysManager;
|
|
|
|
function App({ config, defaultExtensions, defaultModes }) {
|
|
const [init, setInit] = useState(null);
|
|
useEffect(() => {
|
|
const run = async () => {
|
|
appInit(config, defaultExtensions, defaultModes).then(setInit).catch(console.error);
|
|
};
|
|
|
|
run();
|
|
}, []);
|
|
|
|
if (!init) {
|
|
return null;
|
|
}
|
|
|
|
// Set above for named export
|
|
commandsManager = init.commandsManager;
|
|
extensionManager = init.extensionManager;
|
|
servicesManager = init.servicesManager;
|
|
hotkeysManager = init.hotkeysManager;
|
|
|
|
// Set appConfig
|
|
const appConfigState = init.appConfig;
|
|
const { routerBasename, modes, dataSources, oidc, showStudyList } = appConfigState;
|
|
|
|
const {
|
|
uiDialogService,
|
|
uiModalService,
|
|
uiNotificationService,
|
|
uiViewportDialogService,
|
|
viewportGridService,
|
|
cineService,
|
|
userAuthenticationService,
|
|
customizationService,
|
|
} = servicesManager.services;
|
|
|
|
const providers = [
|
|
[AppConfigProvider, { value: appConfigState }],
|
|
[UserAuthenticationProvider, { service: userAuthenticationService }],
|
|
[I18nextProvider, { i18n }],
|
|
[ThemeWrapper],
|
|
[ViewportGridProvider, { service: viewportGridService }],
|
|
[ViewportDialogProvider, { service: uiViewportDialogService }],
|
|
[CineProvider, { service: cineService }],
|
|
[SnackbarProvider, { service: uiNotificationService }],
|
|
[DialogProvider, { service: uiDialogService }],
|
|
[ModalProvider, { service: uiModalService, modal: Modal }],
|
|
];
|
|
const CombinedProviders = ({ children }) => Compose({ components: providers, children });
|
|
|
|
let authRoutes = null;
|
|
|
|
// Should there be a generic call to init on the extension manager?
|
|
customizationService.init(extensionManager);
|
|
|
|
// Use config to create routes
|
|
const appRoutes = createRoutes({
|
|
modes,
|
|
dataSources,
|
|
extensionManager,
|
|
servicesManager,
|
|
commandsManager,
|
|
hotkeysManager,
|
|
routerBasename,
|
|
showStudyList,
|
|
});
|
|
|
|
if (oidc) {
|
|
authRoutes = (
|
|
<OpenIdConnectRoutes
|
|
oidc={oidc}
|
|
routerBasename={routerBasename}
|
|
userAuthenticationService={userAuthenticationService}
|
|
/>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<CombinedProviders>
|
|
<BrowserRouter basename={routerBasename}>
|
|
{authRoutes}
|
|
{appRoutes}
|
|
</BrowserRouter>
|
|
</CombinedProviders>
|
|
);
|
|
}
|
|
|
|
App.propTypes = {
|
|
config: PropTypes.oneOfType([
|
|
PropTypes.func,
|
|
PropTypes.shape({
|
|
routerBasename: PropTypes.string.isRequired,
|
|
oidc: PropTypes.array,
|
|
whiteLabeling: PropTypes.object,
|
|
extensions: PropTypes.array,
|
|
}),
|
|
]).isRequired,
|
|
/* Extensions that are "bundled" or "baked-in" to the application.
|
|
* These would be provided at build time as part of they entry point. */
|
|
defaultExtensions: PropTypes.array,
|
|
};
|
|
|
|
App.defaultProps = {
|
|
config: {
|
|
/**
|
|
* Relative route from domain root that OHIF instance is installed at.
|
|
* For example:
|
|
*
|
|
* Hosted at: https://ohif.org/where-i-host-the/viewer/
|
|
* Value: `/where-i-host-the/viewer/`
|
|
* */
|
|
routerBaseName: '/',
|
|
/**
|
|
*
|
|
*/
|
|
showLoadingIndicator: true,
|
|
showStudyList: true,
|
|
oidc: [],
|
|
extensions: [],
|
|
},
|
|
defaultExtensions: [],
|
|
};
|
|
|
|
export default App;
|
|
|
|
export { commandsManager, extensionManager, servicesManager };
|