ohif-viewer/src/App.js

188 lines
5.6 KiB
JavaScript
Raw Normal View History

2019-05-29 14:39:54 +02:00
import './config';
// Imported flat feature since is not transpiled for old browser versions
import 'core-js/features/array/flat';
import 'core-js/stable';
import 'regenerator-runtime/runtime';
2019-05-30 18:57:46 +02:00
2019-06-03 21:41:49 +02:00
import {
CommandsManager,
ExtensionManager,
2019-06-03 21:41:49 +02:00
HotkeysManager,
utils,
} from 'ohif-core';
2019-05-30 18:57:46 +02:00
import React, { Component } from 'react';
import {
getUserManagerForOpenIdConnectClient,
initWebWorkers,
2019-05-29 14:39:54 +02:00
} from './utils/index.js';
2019-05-30 18:57:46 +02:00
import { I18nextProvider } from 'react-i18next';
import initCornerstoneTools from './initCornerstoneTools.js';
// ~~ EXTENSIONS
import { GenericViewerCommands, MeasurementsPanel } from './appExtensions';
2019-05-30 18:57:46 +02:00
import OHIFCornerstoneExtension from '@ohif/extension-cornerstone';
2019-06-18 20:49:45 +02:00
import OHIFDicomHtmlExtension from '@ohif/extension-dicom-html';
2019-06-17 21:42:11 +02:00
import OHIFDicomMicroscopyExtension from '@ohif/extension-dicom-microscopy';
2019-06-17 21:05:51 +02:00
import OHIFDicomPDFExtension from '@ohif/extension-dicom-pdf';
2019-05-30 18:57:46 +02:00
import OHIFStandaloneViewer from './OHIFStandaloneViewer';
2019-06-17 05:11:43 +02:00
import OHIFVTKExtension from '@ohif/extension-vtk';
// ~~ EXTENSIONS
2019-05-31 17:55:44 +02:00
import { OidcProvider } from 'redux-oidc';
2019-05-30 18:57:46 +02:00
import PropTypes from 'prop-types';
import { Provider } from 'react-redux';
import { BrowserRouter as Router } from 'react-router-dom';
import WhiteLabellingContext from './WhiteLabellingContext';
import { getActiveContexts } from './store/layout/selectors.js';
import i18n from '@ohif/i18n';
import setupTools from './setupTools.js';
2019-05-31 17:55:44 +02:00
import store from './store';
import UserManagerContext from './UserManagerContext';
// ~~~~ APP SETUP
initCornerstoneTools({
globalToolSyncEnabled: true,
showSVGCursors: true,
});
2019-06-03 21:41:49 +02:00
const commandsManagerConfig = {
getAppState: () => store.getState(),
getActiveContexts: () => getActiveContexts(store.getState()),
2019-06-03 21:41:49 +02:00
};
const commandsManager = new CommandsManager(commandsManagerConfig);
const hotkeysManager = new HotkeysManager(commandsManager);
const extensionManager = new ExtensionManager({ commandsManager });
// CornerstoneTools and labeling/measurements?
2019-05-29 14:39:54 +02:00
setupTools(store);
// ~~~~ END APP SETUP
/** TODO: extensions should be passed in as prop as soon as we have the extensions as separate packages and then registered by ExtensionsManager */
extensionManager.registerExtensions([
// Core
GenericViewerCommands,
MeasurementsPanel,
//
2019-06-17 05:11:43 +02:00
OHIFCornerstoneExtension,
OHIFVTKExtension,
2019-06-17 21:05:51 +02:00
OHIFDicomPDFExtension,
2019-06-18 20:49:45 +02:00
OHIFDicomHtmlExtension,
2019-06-17 21:42:11 +02:00
OHIFDicomMicroscopyExtension,
]);
// Must run after extension commands are registered
if (window.config && window.config.hotkeys) {
hotkeysManager.setHotkeys(window.config.hotkeys, true);
}
// TODO[react] Use a provider when the whole tree is React
2019-05-29 14:39:54 +02:00
window.store = store;
function handleServers(servers) {
if (servers) {
utils.addServers(servers, store);
}
}
function isAbsoluteUrl(url) {
return url.includes('http://') || url.includes('https://');
}
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;
}
class App extends Component {
2019-01-17 17:39:08 +01:00
static propTypes = {
routerBasename: PropTypes.string.isRequired,
servers: PropTypes.object.isRequired,
oidc: PropTypes.array,
2019-04-29 21:06:17 +02:00
whiteLabelling: PropTypes.object,
2019-05-29 14:39:54 +02:00
};
2019-01-30 12:24:34 +01:00
static defaultProps = {
whiteLabelling: {},
oidc: [],
2019-05-29 14:39:54 +02:00
};
2019-01-30 12:24:34 +01:00
constructor(props) {
2019-05-29 14:39:54 +02:00
super(props);
if (this.props.oidc.length) {
2019-05-29 14:39:54 +02: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';
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, {
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,
openIdConnectConfiguration,
2019-05-29 14:39:54 +02:00
);
}
2019-05-29 14:39:54 +02:00
handleServers(this.props.servers);
initWebWorkers();
2019-01-17 17:39:08 +01:00
}
render() {
2019-05-29 14:39:54 +02:00
const userManager = this.userManager;
if (userManager) {
return (
<Provider store={store}>
2019-06-04 23:16:07 +02:00
<I18nextProvider i18n={i18n}>
2019-05-30 20:41:15 +02:00
<OidcProvider store={store} userManager={userManager}>
<UserManagerContext.Provider value={userManager}>
<Router basename={this.props.routerBasename}>
<WhiteLabellingContext.Provider
value={this.props.whiteLabelling}
>
<OHIFStandaloneViewer userManager={userManager} />
</WhiteLabellingContext.Provider>
</Router>
</UserManagerContext.Provider>
2019-05-30 20:41:15 +02:00
</OidcProvider>
2019-06-04 23:16:07 +02:00
</I18nextProvider>
</Provider>
2019-05-29 14:39:54 +02:00
);
}
return (
<Provider store={store}>
2019-06-06 23:57:45 +02:00
<I18nextProvider i18n={i18n}>
<Router basename={this.props.routerBasename}>
<WhiteLabellingContext.Provider value={this.props.whiteLabelling}>
<OHIFStandaloneViewer />
</WhiteLabellingContext.Provider>
</Router>
</I18nextProvider>
</Provider>
2019-05-29 14:39:54 +02:00
);
}
}
2019-05-29 14:39:54 +02:00
export default App;
// Make our managers accessible
export { commandsManager, extensionManager, hotkeysManager };