Files
ohif-viewer/platform/viewer/src/App.js
T

232 lines
6.6 KiB
JavaScript
Raw Normal View History

2019-08-15 09:12:48 +02:00
import { hot } from 'react-hot-loader/root';
2019-10-28 14:47:57 -04:00
// TODO: This should not be here
2019-05-29 08:39:54 -04:00
import './config';
2019-08-15 09:12:48 +02:00
2019-06-03 15:41:49 -04:00
import {
CommandsManager,
ExtensionManager,
ServicesManager,
2019-06-03 15:41:49 -04:00
HotkeysManager,
createUiNotificationService,
2019-06-03 15:41:49 -04:00
utils,
2019-08-13 15:36:46 -04:00
} from '@ohif/core';
2019-05-30 12:57:46 -04:00
import React, { Component } from 'react';
2019-01-24 10:22:40 +01:00
import {
2019-04-29 15:39:09 -04:00
getUserManagerForOpenIdConnectClient,
initWebWorkers,
2019-05-29 08:39:54 -04:00
} from './utils/index.js';
2019-05-30 12:57:46 -04:00
import { I18nextProvider } from 'react-i18next';
2019-07-04 14:09:13 -04:00
// ~~ EXTENSIONS
import { GenericViewerCommands, MeasurementsPanel } from './appExtensions';
2019-05-30 12:57:46 -04:00
import OHIFCornerstoneExtension from '@ohif/extension-cornerstone';
import OHIFStandaloneViewer from './OHIFStandaloneViewer';
2019-05-31 11:55:44 -04:00
import { OidcProvider } from 'redux-oidc';
2019-05-30 12:57:46 -04:00
import PropTypes from 'prop-types';
import { Provider } from 'react-redux';
import { BrowserRouter as Router } from 'react-router-dom';
import { getActiveContexts } from './store/layout/selectors.js';
import i18n from '@ohif/i18n';
2019-05-31 11:55:44 -04:00
import store from './store';
2019-11-04 12:55:05 -03:00
import { SnackbarProvider, ModalProvider, OHIFModal } from '@ohif/ui';
// Contexts
import WhiteLabellingContext from './context/WhiteLabellingContext';
import UserManagerContext from './context/UserManagerContext';
import AppContext from './context/AppContext';
2019-01-24 10:22:40 +01:00
// ~~~~ APP SETUP
2019-06-03 15:41:49 -04:00
const commandsManagerConfig = {
getAppState: () => store.getState(),
getActiveContexts: () => getActiveContexts(store.getState()),
2019-06-03 15:41:49 -04:00
};
// Services
const UINotificationService = createUiNotificationService();
const commandsManager = new CommandsManager(commandsManagerConfig);
const hotkeysManager = new HotkeysManager(commandsManager);
const servicesManager = new ServicesManager();
const extensionManager = new ExtensionManager({
commandsManager,
servicesManager,
});
2019-07-04 14:09:13 -04:00
// ~~~~ END APP SETUP
2019-01-24 10:22:40 +01:00
// TODO[react] Use a provider when the whole tree is React
2019-05-29 08:39:54 -04:00
window.store = store;
2019-01-24 10:22:40 +01:00
class App extends Component {
2019-01-17 17:39:08 +01:00
static propTypes = {
routerBasename: PropTypes.string.isRequired,
servers: PropTypes.object.isRequired,
2019-08-13 15:36:46 -04:00
//
2019-01-24 10:22:40 +01:00
oidc: PropTypes.array,
2019-04-29 15:06:17 -04:00
whiteLabelling: PropTypes.object,
2019-08-13 15:36:46 -04:00
extensions: PropTypes.arrayOf(
PropTypes.shape({
id: PropTypes.string.isRequired,
})
),
2019-05-29 08:39:54 -04:00
};
2019-01-24 10:22:40 +01:00
2019-01-30 11:24:34 +00:00
static defaultProps = {
2019-04-28 15:54:56 -04:00
whiteLabelling: {},
oidc: [],
2019-08-13 15:36:46 -04:00
extensions: [],
2019-05-29 08:39:54 -04:00
};
2019-01-30 11:24:34 +00:00
_appConfig;
_userManager;
2019-01-24 10:22:40 +01:00
constructor(props) {
2019-05-29 08:39:54 -04:00
super(props);
2019-01-24 10:22:40 +01:00
2019-09-16 11:26:59 -03:00
this._appConfig = props;
const { servers, extensions, hotkeys, oidc } = props;
this.initUserManager(oidc);
_initServices([UINotificationService]);
_initExtensions(extensions, hotkeys);
_initServers(servers);
initWebWorkers();
}
render() {
2019-11-04 12:55:05 -03:00
const { whiteLabelling, routerBasename } = this.props;
const userManager = this._userManager;
const config = {
appConfig: this._appConfig,
};
if (userManager) {
return (
<AppContext.Provider value={config}>
<Provider store={store}>
<I18nextProvider i18n={i18n}>
<OidcProvider store={store} userManager={userManager}>
<UserManagerContext.Provider value={userManager}>
2019-11-04 12:55:05 -03:00
<Router basename={routerBasename}>
<WhiteLabellingContext.Provider value={whiteLabelling}>
<SnackbarProvider service={UINotificationService}>
2019-11-04 12:55:05 -03:00
<ModalProvider modal={OHIFModal}>
<OHIFStandaloneViewer userManager={userManager} />
</ModalProvider>
2019-10-14 12:39:31 -03:00
</SnackbarProvider>
</WhiteLabellingContext.Provider>
</Router>
</UserManagerContext.Provider>
</OidcProvider>
</I18nextProvider>
</Provider>
</AppContext.Provider>
);
}
return (
<AppContext.Provider value={config}>
<Provider store={store}>
<I18nextProvider i18n={i18n}>
2019-11-04 12:55:05 -03:00
<Router basename={routerBasename}>
<WhiteLabellingContext.Provider value={whiteLabelling}>
<SnackbarProvider service={UINotificationService}>
2019-11-04 12:55:05 -03:00
<ModalProvider modal={OHIFModal}>
<OHIFStandaloneViewer />
</ModalProvider>
2019-10-14 12:39:31 -03:00
</SnackbarProvider>
</WhiteLabellingContext.Provider>
</Router>
</I18nextProvider>
</Provider>
</AppContext.Provider>
);
}
initUserManager(oidc) {
if (oidc && !!oidc.length) {
2019-05-29 08:39:54 -04:00
const firstOpenIdClient = this.props.oidc[0];
const { protocol, host } = window.location;
const { routerBasename } = this.props;
const baseUri = `${protocol}//${host}${routerBasename}`;
const redirect_uri = firstOpenIdClient.redirect_uri || '/callback';
2019-08-13 15:36:46 -04:00
const silent_redirect_uri =
firstOpenIdClient.silent_redirect_uri || '/silent-refresh.html';
const post_logout_redirect_uri =
firstOpenIdClient.post_logout_redirect_uri || '/';
const openIdConnectConfiguration = Object.assign({}, firstOpenIdClient, {
2019-08-13 15:36:46 -04:00
redirect_uri: _makeAbsoluteIfNecessary(redirect_uri, baseUri),
silent_redirect_uri: _makeAbsoluteIfNecessary(
silent_redirect_uri,
baseUri
),
post_logout_redirect_uri: _makeAbsoluteIfNecessary(
post_logout_redirect_uri,
baseUri
),
});
this._userManager = getUserManagerForOpenIdConnectClient(
store,
2019-08-13 15:36:46 -04:00
openIdConnectConfiguration
2019-05-29 08:39:54 -04:00
);
}
}
}
function _initServices(services) {
services.forEach(service => servicesManager.register(service));
}
2019-08-13 15:36:46 -04:00
/**
* @param
*/
function _initExtensions(extensions, hotkeys) {
2019-08-13 15:36:46 -04:00
const defaultExtensions = [
GenericViewerCommands,
OHIFCornerstoneExtension,
// WARNING: MUST BE REGISTERED _AFTER_ OHIFCORNERSTONEEXTENSION
MeasurementsPanel,
2019-08-13 15:36:46 -04:00
];
const mergedExtensions = defaultExtensions.concat(extensions);
extensionManager.registerExtensions(mergedExtensions);
// Must run after extension commands are registered
if (hotkeys) {
hotkeysManager.setHotkeys(hotkeys, true);
2019-08-13 15:36:46 -04:00
}
}
function _initServers(servers) {
if (servers) {
utils.addServers(servers, store);
}
}
function _isAbsoluteUrl(url) {
return url.includes('http://') || url.includes('https://');
}
2019-08-13 15:36:46 -04:00
function _makeAbsoluteIfNecessary(url, base_url) {
if (_isAbsoluteUrl(url)) {
return url;
}
// Make sure base_url and url are not duplicating slashes
if (base_url[base_url.length - 1] === '/') {
base_url = base_url.slice(0, base_url.length - 1);
}
return base_url + url;
}
// Only wrap/use hot if in dev
const ExportedApp = process.env.NODE_ENV === 'development' ? hot(App) : App;
export default ExportedApp;
export { commandsManager, extensionManager, hotkeysManager, servicesManager };