Centralize route generation to a single place
This commit is contained in:
parent
eecdb62dda
commit
a99badd011
@ -5,7 +5,8 @@ import { BrowserRouter, HashRouter } from 'react-router-dom';
|
|||||||
import { ThemeWrapper } from '@ohif/ui';
|
import { ThemeWrapper } from '@ohif/ui';
|
||||||
// Viewer Project
|
// Viewer Project
|
||||||
// TODO: Should this influence study list?
|
// TODO: Should this influence study list?
|
||||||
// import AppContextProvider from './contexts/AppContextProvider.js';
|
import { appConfigContext } from './state/appConfig.context';
|
||||||
|
import { useAppConfig } from './hooks/useAppConfig';
|
||||||
import createRoutes from './routes';
|
import createRoutes from './routes';
|
||||||
import appInit from './appInit.js';
|
import appInit from './appInit.js';
|
||||||
|
|
||||||
@ -23,7 +24,6 @@ let appConfig, commandsManager, extensionManager, servicesManager;
|
|||||||
|
|
||||||
function App({ config, defaultExtensions }) {
|
function App({ config, defaultExtensions }) {
|
||||||
const init = appInit(config, defaultExtensions);
|
const init = appInit(config, defaultExtensions);
|
||||||
const { appRoutes } = init;
|
|
||||||
|
|
||||||
// Set above for named export
|
// Set above for named export
|
||||||
appConfig = init.appConfig;
|
appConfig = init.appConfig;
|
||||||
@ -33,11 +33,23 @@ function App({ config, defaultExtensions }) {
|
|||||||
|
|
||||||
// TODO: Expose configuration w/ context?
|
// TODO: Expose configuration w/ context?
|
||||||
// See: `setConfiguration` in master
|
// See: `setConfiguration` in master
|
||||||
|
const appConfigImp = useAppConfig();
|
||||||
|
console.log('appConfigImp: ', appConfigImp);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Router basename={appConfig.routerBasename}>
|
<appConfigContext.Provider value={appConfigImp}>
|
||||||
<ThemeWrapper>{createRoutes(appRoutes)}</ThemeWrapper>
|
<Router basename={appConfig.routerBasename}>
|
||||||
</Router>
|
<ThemeWrapper>
|
||||||
|
{createRoutes(
|
||||||
|
appConfig.modes,
|
||||||
|
appConfig.dataSources,
|
||||||
|
extensionManager,
|
||||||
|
appConfig,
|
||||||
|
appConfigImp
|
||||||
|
)}
|
||||||
|
</ThemeWrapper>
|
||||||
|
</Router>
|
||||||
|
</appConfigContext.Provider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,7 +65,8 @@ App.propTypes = {
|
|||||||
extensions: PropTypes.array,
|
extensions: PropTypes.array,
|
||||||
}),
|
}),
|
||||||
]).isRequired,
|
]).isRequired,
|
||||||
/* Extensions that are "bundled" or "baked-in" to the application */
|
/* 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,
|
defaultExtensions: PropTypes.array,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -11,8 +11,6 @@ import {
|
|||||||
// redux as reduxOHIF,
|
// redux as reduxOHIF,
|
||||||
} from '@ohif/core';
|
} from '@ohif/core';
|
||||||
|
|
||||||
import buildModeRoutes from './routes/buildModeRoutes';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {object|func} appConfigOrFunc - application configuration, or a function that returns application configuration
|
* @param {object|func} appConfigOrFunc - application configuration, or a function that returns application configuration
|
||||||
* @param {object[]} defaultExtensions - array of extension objects
|
* @param {object[]} defaultExtensions - array of extension objects
|
||||||
@ -61,24 +59,11 @@ function appInit(appConfigOrFunc, defaultExtensions) {
|
|||||||
// TODO: We no longer init webWorkers at app level
|
// TODO: We no longer init webWorkers at app level
|
||||||
// TODO: We no longer init the user Manager
|
// TODO: We no longer init the user Manager
|
||||||
|
|
||||||
// TODO: After extensions are registered, add modes and datasources to buildModeRoutes.js
|
|
||||||
|
|
||||||
const { modes } = appConfig;
|
|
||||||
|
|
||||||
// Temporarily for testing
|
|
||||||
if (!modes.length) {
|
|
||||||
modes.push(window.exampleMode);
|
|
||||||
}
|
|
||||||
|
|
||||||
const appRoutes =
|
|
||||||
buildModeRoutes(modes, appConfig.dataSources, extensionManager) || [];
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
appConfig,
|
appConfig,
|
||||||
commandsManager,
|
commandsManager,
|
||||||
extensionManager,
|
extensionManager,
|
||||||
servicesManager,
|
servicesManager,
|
||||||
appRoutes,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import ViewportGrid from './ViewportGrid.js';
|
import ViewportGrid from './ViewportGrid.js';
|
||||||
import { MODULE_TYPES } from '@ohif/core';
|
import { MODULE_TYPES } from '@ohif/core';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { extensionManager } from './../../App.js';
|
import { extensionManager } from './../../App.jsx';
|
||||||
import memoize from 'lodash/memoize';
|
import memoize from 'lodash/memoize';
|
||||||
|
|
||||||
const getAvailableViewportModules = memoize(viewportModules => {
|
const getAvailableViewportModules = memoize(viewportModules => {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { ContextMenu } from '@ohif/ui';
|
import { ContextMenu } from '@ohif/ui';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { commandsManager } from './../App.js';
|
import { commandsManager } from './../App.jsx';
|
||||||
|
|
||||||
const toolTypes = [
|
const toolTypes = [
|
||||||
'Angle',
|
'Angle',
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import {
|
|||||||
} from '@ohif/ui';
|
} from '@ohif/ui';
|
||||||
|
|
||||||
import './ToolbarRow.css';
|
import './ToolbarRow.css';
|
||||||
import { commandsManager, extensionManager } from './../App.js';
|
import { commandsManager, extensionManager } from './../App.jsx';
|
||||||
|
|
||||||
import ConnectedCineDialog from './ConnectedCineDialog';
|
import ConnectedCineDialog from './ConnectedCineDialog';
|
||||||
import ConnectedLayoutButton from './ConnectedLayoutButton';
|
import ConnectedLayoutButton from './ConnectedLayoutButton';
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import ToolbarRow from './ToolbarRow.js';
|
|||||||
import ConnectedStudyBrowser from './ConnectedStudyBrowser.js';
|
import ConnectedStudyBrowser from './ConnectedStudyBrowser.js';
|
||||||
import ConnectedViewerMain from './ConnectedViewerMain.js';
|
import ConnectedViewerMain from './ConnectedViewerMain.js';
|
||||||
import SidePanel from './../components/SidePanel.js';
|
import SidePanel from './../components/SidePanel.js';
|
||||||
import { extensionManager } from './../App.js';
|
import { extensionManager } from './../App.jsx';
|
||||||
|
|
||||||
// Contexts
|
// Contexts
|
||||||
import WhiteLabelingContext from '../context/WhiteLabelingContext.js';
|
import WhiteLabelingContext from '../context/WhiteLabelingContext.js';
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import { metadata, utils } from '@ohif/core';
|
|||||||
|
|
||||||
import ConnectedViewer from './ConnectedViewer.js';
|
import ConnectedViewer from './ConnectedViewer.js';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { extensionManager } from './../App.js';
|
import { extensionManager } from './../App.jsx';
|
||||||
import Dropzone from 'react-dropzone';
|
import Dropzone from 'react-dropzone';
|
||||||
import filesToStudies from '../lib/filesToStudies';
|
import filesToStudies from '../lib/filesToStudies';
|
||||||
import './ViewerLocalFileData.css';
|
import './ViewerLocalFileData.css';
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import usePrevious from '../customHooks/usePrevious';
|
|||||||
|
|
||||||
import ConnectedViewer from './ConnectedViewer.js';
|
import ConnectedViewer from './ConnectedViewer.js';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { extensionManager } from './../App.js';
|
import { extensionManager } from './../App.jsx';
|
||||||
import { useSnackbarContext } from '@ohif/ui';
|
import { useSnackbarContext } from '@ohif/ui';
|
||||||
|
|
||||||
const { OHIFStudyMetadata, OHIFSeriesMetadata } = metadata;
|
const { OHIFStudyMetadata, OHIFSeriesMetadata } = metadata;
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import './googleCloud.css';
|
|||||||
import { withTranslation } from 'react-i18next';
|
import { withTranslation } from 'react-i18next';
|
||||||
import * as GoogleCloudUtilServers from './utils/getServers';
|
import * as GoogleCloudUtilServers from './utils/getServers';
|
||||||
|
|
||||||
import { servicesManager } from './../App.js';
|
import { servicesManager } from './../App.jsx';
|
||||||
|
|
||||||
function DicomStorePickerModal({
|
function DicomStorePickerModal({
|
||||||
isOpen = false,
|
isOpen = false,
|
||||||
|
|||||||
17
platform/viewer/src/hooks/useAppConfig.js
Normal file
17
platform/viewer/src/hooks/useAppConfig.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { useCallback, useState } from 'react';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements the state/methods defined in `appConfig.context`.
|
||||||
|
*/
|
||||||
|
export const useAppConfig = initialValue => {
|
||||||
|
const [config, setConfig] = useState(initialValue || {});
|
||||||
|
|
||||||
|
const setCurrentConfig = useCallback(updatedConfig => {
|
||||||
|
setConfig(updatedConfig);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return {
|
||||||
|
config,
|
||||||
|
setCurrentConfig,
|
||||||
|
};
|
||||||
|
};
|
||||||
@ -5,7 +5,7 @@ import 'regenerator-runtime/runtime';
|
|||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import ReactDOM from 'react-dom';
|
import ReactDOM from 'react-dom';
|
||||||
import App from './App.js';
|
import App from './App.jsx';
|
||||||
|
|
||||||
function installViewer(config, containerId = 'root', callback) {
|
function installViewer(config, containerId = 'root', callback) {
|
||||||
const container = document.getElementById(containerId);
|
const container = document.getElementById(containerId);
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
* Packaged (NPM) builds go through `index-umd.js`
|
* Packaged (NPM) builds go through `index-umd.js`
|
||||||
*/
|
*/
|
||||||
import 'regenerator-runtime/runtime';
|
import 'regenerator-runtime/runtime';
|
||||||
import App from './App.js';
|
import App from './App.jsx';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import ReactDOM from 'react-dom';
|
import ReactDOM from 'react-dom';
|
||||||
// test
|
// test
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import React, { useEffect, useState } from 'react';
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { MODULE_TYPES } from '@ohif/core';
|
import { MODULE_TYPES } from '@ohif/core';
|
||||||
//
|
//
|
||||||
import { appConfig, extensionManager } from '../App.js';
|
import { appConfig, extensionManager } from '../App.jsx';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Uses route properties to determine the data source that should be passed
|
* Uses route properties to determine the data source that should be passed
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import React, { useContext, useEffect, useCallback } from 'react';
|
import React, { useEffect, useCallback } from 'react';
|
||||||
import {
|
import {
|
||||||
displaySetManager,
|
displaySetManager,
|
||||||
ToolBarManager,
|
ToolBarManager,
|
||||||
|
|||||||
@ -1,23 +1,31 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Switch, Route } from 'react-router-dom';
|
import { Switch, Route } from 'react-router-dom';
|
||||||
|
|
||||||
// Route Components
|
// Route Components
|
||||||
import DataSourceWrapper from './DataSourceWrapper';
|
import DataSourceWrapper from './DataSourceWrapper';
|
||||||
import StudyListContainer from './StudyListContainer';
|
import StudyListContainer from './StudyListContainer';
|
||||||
import NotFound from './NotFound';
|
import NotFound from './NotFound';
|
||||||
|
import buildModeRoutes from './buildModeRoutes';
|
||||||
|
|
||||||
|
// TODO: Make these configurable
|
||||||
const bakedInRoutes = [
|
const bakedInRoutes = [
|
||||||
|
// WORK LIST
|
||||||
{
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
exact: true,
|
exact: true,
|
||||||
component: DataSourceWrapper,
|
component: DataSourceWrapper,
|
||||||
props: { children: StudyListContainer },
|
props: { children: StudyListContainer },
|
||||||
},
|
},
|
||||||
|
// NOT FOUND (404)
|
||||||
{ component: NotFound },
|
{ component: NotFound },
|
||||||
];
|
];
|
||||||
|
|
||||||
const createRoutes = routes => {
|
const createRoutes = (modes, dataSources, extensionManager, t, t2) => {
|
||||||
console.log('Creating Routes: ', routes, bakedInRoutes);
|
console.log('Creating Routes: ', routes, bakedInRoutes);
|
||||||
|
console.log(modes, dataSources, extensionManager, t, t2);
|
||||||
|
if (!modes.length) {
|
||||||
|
modes.push(window.exampleMode);
|
||||||
|
}
|
||||||
|
const routes = buildModeRoutes(modes, dataSources, extensionManager) || [];
|
||||||
// TODO: Shouldn't need to guard input routes with an empty array?
|
// TODO: Shouldn't need to guard input routes with an empty array?
|
||||||
const allRoutes = [...(routes || []), ...bakedInRoutes];
|
const allRoutes = [...(routes || []), ...bakedInRoutes];
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user