import React, { useEffect, useState } from 'react'; import classnames from 'classnames'; import PropTypes from 'prop-types'; import { SidePanel } from '@ohif/ui'; import Header from './Header.jsx'; import NestedToolbar from './NestedToolbar.jsx'; function ViewerLayout({ // From Extension Module Params extensionManager, servicesManager, commandsManager, // From Modes leftPanels, rightPanels, viewports, children, ViewportGridComp, }) { const { ToolBarService } = servicesManager.services; /** * Set body classes (tailwindcss) that don't allow vertical * or horizontal overflow (no scrolling). Also guarantee window * is sized to our viewport. */ useEffect(() => { document.body.classList.add('bg-black'); document.body.classList.add('overflow-hidden'); return () => { document.body.classList.remove('bg-black'); document.body.classList.remove('overflow-hidden'); }; }, []); const getPanelData = id => { const entry = extensionManager.getModuleEntry(id); // TODO, not sure why sidepanel content has to be JSX, and not a children prop? const content = entry.component; return { iconName: entry.iconName, iconLabel: entry.iconLabel, label: entry.label, name: entry.name, content, }; }; const getViewportComponentData = viewportComponent => { const entry = extensionManager.getModuleEntry(viewportComponent.namespace); return { component: entry.component, displaySetsToDisplay: viewportComponent.displaySetsToDisplay, }; }; const [toolbars, setToolbars] = useState({ primary: [], secondary: [] }); useEffect(() => { const { unsubscribe } = ToolBarService.subscribe( ToolBarService.EVENTS.TOOL_BAR_MODIFIED, () => { console.warn('~~~ TOOL BAR MODIFIED EVENT CAUGHT'); const updatedToolbars = { primary: ToolBarService.getButtonSection('primary'), secondary: ToolBarService.getButtonSection('secondary'), }; setToolbars(updatedToolbars); } ); return unsubscribe; }, [ToolBarService]); const leftPanelComponents = leftPanels.map(getPanelData); const rightPanelComponents = rightPanels.map(getPanelData); const viewportComponents = viewports.map(getViewportComponentData); return (
{toolbars.primary.map(toolDef => { const isNested = Array.isArray(toolDef); if (!isNested) { const { id, Component, componentProps } = toolDef; return ; } else { return (
{toolDef.map(x => { const { id, Component, componentProps } = x; return ; })}
); } })}
{/* LEFT SIDEPANELS */} {leftPanelComponents.length && ( )} {/* TOOLBAR + GRID */}
{toolbars.secondary.map(toolDef => { const { id, Component, componentProps } = toolDef; return ; })}
{rightPanelComponents.length && ( )}
); } ViewerLayout.propTypes = { // From extension module params extensionManager: PropTypes.shape({ getModuleEntry: PropTypes.func.isRequired, }).isRequired, commandsManager: PropTypes.object, // From modes leftPanels: PropTypes.array, rightPanels: PropTypes.array, /** Responsible for rendering our grid of viewports; provided by consuming application */ children: PropTypes.oneOfType(PropTypes.node, PropTypes.func).isRequired, }; ViewerLayout.defaultProps = { leftPanels: [], rightPanels: [], }; export default ViewerLayout;