From f54fa4cb34f35e0004eb253877fbe48c9401e99d Mon Sep 17 00:00:00 2001 From: dannyrb Date: Thu, 7 May 2020 14:02:51 -0400 Subject: [PATCH] Begin playing with how/where modes should be wrapped and have data provided --- platform/viewer/src/routes/Compose.js | 19 +++++ platform/viewer/src/routes/ModeRoute.js | 79 ++++++++----------- platform/viewer/src/routes/buildModeRoutes.js | 13 ++- platform/viewer/src/routes/index.js | 12 +-- 4 files changed, 69 insertions(+), 54 deletions(-) create mode 100644 platform/viewer/src/routes/Compose.js diff --git a/platform/viewer/src/routes/Compose.js b/platform/viewer/src/routes/Compose.js new file mode 100644 index 000000000..a8aed2a94 --- /dev/null +++ b/platform/viewer/src/routes/Compose.js @@ -0,0 +1,19 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +export default function Compose(props) { + const { components = [], children } = props; + + return ( + <> + {components.reduceRight((acc, Comp) => { + return {acc}; + }, children)} + + ); +} + +Compose.propTypes = { + components: PropTypes.array, + children: PropTypes.node.isRequired, +}; diff --git a/platform/viewer/src/routes/ModeRoute.js b/platform/viewer/src/routes/ModeRoute.js index d206ef440..467d1bcc6 100644 --- a/platform/viewer/src/routes/ModeRoute.js +++ b/platform/viewer/src/routes/ModeRoute.js @@ -1,68 +1,53 @@ -export default function ModeRoute(mode, dataSourceId) { - const [displaySets, setDisplaySets] = useState([]); - const { routes, sopClassHandlers, extensions } = getMode(modeId); +import React, { useContext } from 'react'; +import SOPClassHandlerManager from './SOPClassHandlerManager'; +import ViewModelContext from './ViewModelContext'; +import Compose from './Compose'; +export default function ModeRoute({ + location, + mode, + dataSourceId, + extensionManager, +}) { + const { routes, sopClassHandlers, extensions } = mode; + const dataSource = extensionManager.getDataSource(dataSourceId); + + const { displaySetInstanceUids, setDisplaySetInstanceUids } = useContext( + ViewModelContext + ); // Deal with toolbar. // Only handling one route per mode for now - const LayoutComponent = routes[0].layoutTemplate; + const LayoutComponent = extensionManager.getModuleEntry( + routes[0].layoutTemplate + ); // Add SOPClassHandlers to a new SOPClassManager. - const manager = new SOPClassHandlerManager(sopClassHandlers); + const manager = new SOPClassHandlerManager( + extensionManager, + sopClassHandlers + ); - const dataSource = getDataSource(dataSourceId); const queryParams = location.search; // Call the data source to start building the view model? - dataSource(queryParams); + //dataSource(queryParams); - metadataStore.onModified(); + //metadataStore.onModified(); const onUpdatedCallback = () => { // TODO: This should append, not create from scratch so we don't nuke existing display sets // when e.g. a new series arrives - manager.createDisplaySets.then(setDisplaySets); + manager.createDisplaySets.then(setDisplaySetInstanceUids); }; - // TODO: Should extensions provide an array of these or one nested context? const contextModules = extensions.getContextModules(); - const ExtensionContexts = contextModules => {}; - - /* - TODO: How are contexts provided by extensions passed into the mode? + const contextModuleProviders = contextModules.map(a => a.context.Provider); + const CombinedContextProvider = Compose(contextModuleProviders); return ( - - - - );*/ - - return ; + + + + ); } - -/*const ViewModelContext = React.createContext( - displaySets: [], - setDisplaySets: () => {} -); - - -class ViewModelProvider extends Component { - state = { - displaySets: [] - }; - - const setDisplaySets = displaySets => { - this.setState({displaySets}); - }; - - render() { - return ( - - {this.props.children} - - ); - } -}*/ diff --git a/platform/viewer/src/routes/buildModeRoutes.js b/platform/viewer/src/routes/buildModeRoutes.js index c43476bc8..22187e3c2 100644 --- a/platform/viewer/src/routes/buildModeRoutes.js +++ b/platform/viewer/src/routes/buildModeRoutes.js @@ -1,5 +1,6 @@ import { React } from 'react'; import ModeRoute from './ModeRoute'; +import ViewModelProvider from './ViewModelContext'; /* Routes uniquely define an entry point to: @@ -25,14 +26,22 @@ export default function buildModeRoutes(modes, extensionManager) { const routes = []; // TODO: Build api for this. - const dataSources = extensionManager.getDataSources(); + const dataSources = extensionManager.getDataSource(); modes.forEach(mode => { dataSources.forEach(dataSource => { const dataSourceId = dataSource.id; const path = `/${mode.id}/${dataSourceId}`; - const component = ; + const component = ( + + + + ); routes.push({ path, diff --git a/platform/viewer/src/routes/index.js b/platform/viewer/src/routes/index.js index 2741337b8..5f06d0150 100644 --- a/platform/viewer/src/routes/index.js +++ b/platform/viewer/src/routes/index.js @@ -5,16 +5,18 @@ import { Switch, Route } from 'react-router-dom'; import StudyListContainer from './StudyListContainer'; import NotFound from './NotFound'; -const appRoutes = [ +const bakedInRoutes = [ { path: '/', exact: true, component: StudyListContainer }, - { path: '/viewer/:studyInstanceUids', component: NotFound }, { component: NotFound }, ]; -const routes = () => { +const createRoutes = routes => { + console.log('Creating Routes: ', routes, bakedInRoutes); + const allRoutes = [...(routes || []), ...bakedInRoutes]; + return ( - {appRoutes.map((route, i) => { + {allRoutes.map((route, i) => { return ( { ); }; -export default routes; +export default createRoutes;