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';
|
||||
// Viewer Project
|
||||
// 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 appInit from './appInit.js';
|
||||
|
||||
@ -23,7 +24,6 @@ let appConfig, commandsManager, extensionManager, servicesManager;
|
||||
|
||||
function App({ config, defaultExtensions }) {
|
||||
const init = appInit(config, defaultExtensions);
|
||||
const { appRoutes } = init;
|
||||
|
||||
// Set above for named export
|
||||
appConfig = init.appConfig;
|
||||
@ -33,11 +33,23 @@ function App({ config, defaultExtensions }) {
|
||||
|
||||
// TODO: Expose configuration w/ context?
|
||||
// See: `setConfiguration` in master
|
||||
const appConfigImp = useAppConfig();
|
||||
console.log('appConfigImp: ', appConfigImp);
|
||||
|
||||
return (
|
||||
<Router basename={appConfig.routerBasename}>
|
||||
<ThemeWrapper>{createRoutes(appRoutes)}</ThemeWrapper>
|
||||
</Router>
|
||||
<appConfigContext.Provider value={appConfigImp}>
|
||||
<Router basename={appConfig.routerBasename}>
|
||||
<ThemeWrapper>
|
||||
{createRoutes(
|
||||
appConfig.modes,
|
||||
appConfig.dataSources,
|
||||
extensionManager,
|
||||
appConfig,
|
||||
appConfigImp
|
||||
)}
|
||||
</ThemeWrapper>
|
||||
</Router>
|
||||
</appConfigContext.Provider>
|
||||
);
|
||||
}
|
||||
|
||||
@ -53,7 +65,8 @@ App.propTypes = {
|
||||
extensions: PropTypes.array,
|
||||
}),
|
||||
]).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,
|
||||
};
|
||||
|
||||
@ -11,8 +11,6 @@ import {
|
||||
// redux as reduxOHIF,
|
||||
} from '@ohif/core';
|
||||
|
||||
import buildModeRoutes from './routes/buildModeRoutes';
|
||||
|
||||
/**
|
||||
* @param {object|func} appConfigOrFunc - application configuration, or a function that returns application configuration
|
||||
* @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 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 {
|
||||
appConfig,
|
||||
commandsManager,
|
||||
extensionManager,
|
||||
servicesManager,
|
||||
appRoutes,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import ViewportGrid from './ViewportGrid.js';
|
||||
import { MODULE_TYPES } from '@ohif/core';
|
||||
import { connect } from 'react-redux';
|
||||
import { extensionManager } from './../../App.js';
|
||||
import { extensionManager } from './../../App.jsx';
|
||||
import memoize from 'lodash/memoize';
|
||||
|
||||
const getAvailableViewportModules = memoize(viewportModules => {
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import { ContextMenu } from '@ohif/ui';
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import { commandsManager } from './../App.js';
|
||||
import { commandsManager } from './../App.jsx';
|
||||
|
||||
const toolTypes = [
|
||||
'Angle',
|
||||
|
||||
@ -12,7 +12,7 @@ import {
|
||||
} from '@ohif/ui';
|
||||
|
||||
import './ToolbarRow.css';
|
||||
import { commandsManager, extensionManager } from './../App.js';
|
||||
import { commandsManager, extensionManager } from './../App.jsx';
|
||||
|
||||
import ConnectedCineDialog from './ConnectedCineDialog';
|
||||
import ConnectedLayoutButton from './ConnectedLayoutButton';
|
||||
|
||||
@ -11,7 +11,7 @@ import ToolbarRow from './ToolbarRow.js';
|
||||
import ConnectedStudyBrowser from './ConnectedStudyBrowser.js';
|
||||
import ConnectedViewerMain from './ConnectedViewerMain.js';
|
||||
import SidePanel from './../components/SidePanel.js';
|
||||
import { extensionManager } from './../App.js';
|
||||
import { extensionManager } from './../App.jsx';
|
||||
|
||||
// Contexts
|
||||
import WhiteLabelingContext from '../context/WhiteLabelingContext.js';
|
||||
|
||||
@ -3,7 +3,7 @@ import { metadata, utils } from '@ohif/core';
|
||||
|
||||
import ConnectedViewer from './ConnectedViewer.js';
|
||||
import PropTypes from 'prop-types';
|
||||
import { extensionManager } from './../App.js';
|
||||
import { extensionManager } from './../App.jsx';
|
||||
import Dropzone from 'react-dropzone';
|
||||
import filesToStudies from '../lib/filesToStudies';
|
||||
import './ViewerLocalFileData.css';
|
||||
|
||||
@ -4,7 +4,7 @@ import usePrevious from '../customHooks/usePrevious';
|
||||
|
||||
import ConnectedViewer from './ConnectedViewer.js';
|
||||
import PropTypes from 'prop-types';
|
||||
import { extensionManager } from './../App.js';
|
||||
import { extensionManager } from './../App.jsx';
|
||||
import { useSnackbarContext } from '@ohif/ui';
|
||||
|
||||
const { OHIFStudyMetadata, OHIFSeriesMetadata } = metadata;
|
||||
|
||||
@ -5,7 +5,7 @@ import './googleCloud.css';
|
||||
import { withTranslation } from 'react-i18next';
|
||||
import * as GoogleCloudUtilServers from './utils/getServers';
|
||||
|
||||
import { servicesManager } from './../App.js';
|
||||
import { servicesManager } from './../App.jsx';
|
||||
|
||||
function DicomStorePickerModal({
|
||||
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 ReactDOM from 'react-dom';
|
||||
import App from './App.js';
|
||||
import App from './App.jsx';
|
||||
|
||||
function installViewer(config, containerId = 'root', callback) {
|
||||
const container = document.getElementById(containerId);
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
* Packaged (NPM) builds go through `index-umd.js`
|
||||
*/
|
||||
import 'regenerator-runtime/runtime';
|
||||
import App from './App.js';
|
||||
import App from './App.jsx';
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
// test
|
||||
|
||||
@ -3,7 +3,7 @@ import React, { useEffect, useState } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
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
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import React, { useContext, useEffect, useCallback } from 'react';
|
||||
import React, { useEffect, useCallback } from 'react';
|
||||
import {
|
||||
displaySetManager,
|
||||
ToolBarManager,
|
||||
|
||||
@ -1,23 +1,31 @@
|
||||
import React from 'react';
|
||||
import { Switch, Route } from 'react-router-dom';
|
||||
|
||||
// Route Components
|
||||
import DataSourceWrapper from './DataSourceWrapper';
|
||||
import StudyListContainer from './StudyListContainer';
|
||||
import NotFound from './NotFound';
|
||||
import buildModeRoutes from './buildModeRoutes';
|
||||
|
||||
// TODO: Make these configurable
|
||||
const bakedInRoutes = [
|
||||
// WORK LIST
|
||||
{
|
||||
path: '/',
|
||||
exact: true,
|
||||
component: DataSourceWrapper,
|
||||
props: { children: StudyListContainer },
|
||||
},
|
||||
// NOT FOUND (404)
|
||||
{ component: NotFound },
|
||||
];
|
||||
|
||||
const createRoutes = routes => {
|
||||
const createRoutes = (modes, dataSources, extensionManager, t, t2) => {
|
||||
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?
|
||||
const allRoutes = [...(routes || []), ...bakedInRoutes];
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user