Centralize route generation to a single place

This commit is contained in:
dannyrb 2020-05-17 21:42:38 -04:00
parent eecdb62dda
commit a99badd011
15 changed files with 57 additions and 34 deletions

View File

@ -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,
};

View File

@ -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,
};
}

View File

@ -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 => {

View File

@ -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',

View File

@ -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';

View File

@ -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';

View File

@ -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';

View File

@ -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;

View File

@ -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,

View 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,
};
};

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -1,4 +1,4 @@
import React, { useContext, useEffect, useCallback } from 'react';
import React, { useEffect, useCallback } from 'react';
import {
displaySetManager,
ToolBarManager,

View File

@ -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];