2024-04-10 05:57:34 +02:00
|
|
|
import React, { useEffect, useState, useCallback } from 'react';
|
2024-10-18 17:42:44 +02:00
|
|
|
import { SidePanel } from '@ohif/ui-next';
|
2024-05-08 18:12:49 +02:00
|
|
|
import { Types } from '@ohif/core';
|
2023-09-22 21:36:44 +02:00
|
|
|
|
|
|
|
|
export type SidePanelWithServicesProps = {
|
2024-05-08 18:12:49 +02:00
|
|
|
servicesManager: AppTypes.ServicesManager;
|
2023-09-22 21:36:44 +02:00
|
|
|
side: 'left' | 'right';
|
2024-11-06 13:15:27 +01:00
|
|
|
className?: string;
|
2023-09-22 21:36:44 +02:00
|
|
|
activeTabIndex: number;
|
|
|
|
|
tabs: any;
|
2024-01-08 19:59:20 +01:00
|
|
|
expandedWidth?: number;
|
2023-09-22 21:36:44 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const SidePanelWithServices = ({
|
|
|
|
|
servicesManager,
|
|
|
|
|
side,
|
|
|
|
|
activeTabIndex: activeTabIndexProp,
|
2024-04-10 05:57:34 +02:00
|
|
|
tabs: tabsProp,
|
2024-01-08 19:59:20 +01:00
|
|
|
expandedWidth,
|
2024-04-10 05:57:34 +02:00
|
|
|
...props
|
2024-01-08 19:59:20 +01:00
|
|
|
}: SidePanelWithServicesProps) => {
|
2024-05-08 18:12:49 +02:00
|
|
|
const panelService = servicesManager?.services?.panelService;
|
2023-09-22 21:36:44 +02:00
|
|
|
|
|
|
|
|
// Tracks whether this SidePanel has been opened at least once since this SidePanel was inserted into the DOM.
|
|
|
|
|
// Thus going to the Study List page and back to the viewer resets this flag for a SidePanel.
|
2024-11-11 20:28:34 +01:00
|
|
|
const [sidePanelOpen, setSidePanelOpen] = useState(activeTabIndexProp !== null);
|
2023-09-22 21:36:44 +02:00
|
|
|
const [activeTabIndex, setActiveTabIndex] = useState(activeTabIndexProp);
|
2024-04-10 05:57:34 +02:00
|
|
|
const [tabs, setTabs] = useState(tabsProp ?? panelService.getPanels(side));
|
|
|
|
|
|
|
|
|
|
const handleActiveTabIndexChange = useCallback(({ activeTabIndex }) => {
|
|
|
|
|
setActiveTabIndex(activeTabIndex);
|
2024-11-11 20:28:34 +01:00
|
|
|
setSidePanelOpen(activeTabIndex !== null);
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
const handleOpen = useCallback(() => {
|
|
|
|
|
setSidePanelOpen(true);
|
|
|
|
|
// If panel is being opened but no tab is active, set first tab as active
|
|
|
|
|
if (activeTabIndex === null && tabs.length > 0) {
|
|
|
|
|
setActiveTabIndex(0);
|
|
|
|
|
}
|
|
|
|
|
}, [activeTabIndex, tabs]);
|
|
|
|
|
|
|
|
|
|
const handleClose = useCallback(() => {
|
|
|
|
|
setSidePanelOpen(false);
|
|
|
|
|
setActiveTabIndex(null);
|
2024-04-10 05:57:34 +02:00
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
/** update the active tab index from outside */
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
setActiveTabIndex(activeTabIndexProp);
|
|
|
|
|
}, [activeTabIndexProp]);
|
2023-09-22 21:36:44 +02:00
|
|
|
|
|
|
|
|
useEffect(() => {
|
2024-04-10 05:57:34 +02:00
|
|
|
const { unsubscribe } = panelService.subscribe(
|
|
|
|
|
panelService.EVENTS.PANELS_CHANGED,
|
|
|
|
|
panelChangedEvent => {
|
|
|
|
|
if (panelChangedEvent.position !== side) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setTabs(panelService.getPanels(side));
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
|
unsubscribe();
|
|
|
|
|
};
|
|
|
|
|
}, [panelService, side]);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const activatePanelSubscription = panelService.subscribe(
|
|
|
|
|
panelService.EVENTS.ACTIVATE_PANEL,
|
|
|
|
|
(activatePanelEvent: Types.ActivatePanelEvent) => {
|
2024-11-11 20:28:34 +01:00
|
|
|
if (sidePanelOpen || activatePanelEvent.forceActive) {
|
2024-04-10 05:57:34 +02:00
|
|
|
const tabIndex = tabs.findIndex(tab => tab.id === activatePanelEvent.panelId);
|
|
|
|
|
if (tabIndex !== -1) {
|
|
|
|
|
setActiveTabIndex(tabIndex);
|
2023-09-22 21:36:44 +02:00
|
|
|
}
|
|
|
|
|
}
|
2024-04-10 05:57:34 +02:00
|
|
|
}
|
|
|
|
|
);
|
2023-09-22 21:36:44 +02:00
|
|
|
|
2024-04-10 05:57:34 +02:00
|
|
|
return () => {
|
|
|
|
|
activatePanelSubscription.unsubscribe();
|
|
|
|
|
};
|
2024-11-11 20:28:34 +01:00
|
|
|
}, [tabs, sidePanelOpen, panelService]);
|
2023-09-22 21:36:44 +02:00
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<SidePanel
|
2024-04-10 05:57:34 +02:00
|
|
|
{...props}
|
2023-09-22 21:36:44 +02:00
|
|
|
side={side}
|
|
|
|
|
tabs={tabs}
|
2024-04-10 05:57:34 +02:00
|
|
|
activeTabIndex={activeTabIndex}
|
2024-11-11 20:28:34 +01:00
|
|
|
onOpen={handleOpen}
|
|
|
|
|
onClose={handleClose}
|
2024-04-10 05:57:34 +02:00
|
|
|
onActiveTabIndexChange={handleActiveTabIndexChange}
|
2024-01-08 19:59:20 +01:00
|
|
|
expandedWidth={expandedWidth}
|
2024-11-11 20:28:34 +01:00
|
|
|
/>
|
2023-09-22 21:36:44 +02:00
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default SidePanelWithServices;
|