From 717c95b9111bb24a035b3fe9bcfb1b3e0a290399 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Wed, 8 Jan 2025 09:29:19 +0100 Subject: [PATCH] feat: panel context to handle default open panel when toggling --- src/component/main/InnerNMRiumContents.tsx | 27 +++++---- src/component/panels/Panels.tsx | 63 +++++++++++++------- src/component/panels/hooks/useTogglePanel.ts | 14 +++-- 3 files changed, 68 insertions(+), 36 deletions(-) diff --git a/src/component/main/InnerNMRiumContents.tsx b/src/component/main/InnerNMRiumContents.tsx index 51ce4ffb6..1dd10397a 100644 --- a/src/component/main/InnerNMRiumContents.tsx +++ b/src/component/main/InnerNMRiumContents.tsx @@ -14,7 +14,7 @@ import { ExportManagerController } from '../elements/export/ExportManager.js'; import { PrintContent } from '../elements/print/PrintContent.js'; import { Header } from '../header/Header.js'; import DropZone from '../loader/DropZone.js'; -import { Panels } from '../panels/Panels.js'; +import { PanelOpenProviderProvider, Panels } from '../panels/Panels.js'; import { PanelsBar } from '../panels/PanelsBar.js'; import ToolBar from '../toolbar/ToolBar.js'; @@ -151,16 +151,21 @@ export function InnerNMRiumContents(props: InnerNMRiumContentsProps) { height: '100%', }} > - - -
- - - -
- -
- + + + +
+ + + +
+ +
+ +
{ - const panelOptions = getPanelPreferences(item); - - return ( - (panelOptions?.display && - item.isExperimental === undefined && - checkAccordionItemMode(item, displayerMode)) || - (item.isExperimental && isExperimental) - ); - }, - [displayerMode, getPanelPreferences, isExperimental], +type PanelOpenState = Partial>; +interface PanelStateContext { + setPanelOpenState: (id: keyof NMRiumPanelPreferences, value: boolean) => void; + panelOpenState: PanelOpenState; +} + +const AccordionContext = createContext(null); + +export function usePanelOpenState() { + const context = useContext(AccordionContext); + + if (!context) { + throw new Error('Panel open context must be used within PanelOpenProvider'); + } + + return context; +} + +export function PanelOpenProviderProvider({ children }) { + const [panelOpenState, toggleAccordionItem] = useState({}); + + const state = useMemo(() => { + function setPanelOpenState( + id: keyof NMRiumPanelPreferences, + value: boolean, + ) { + toggleAccordionItem((prev) => ({ + ...prev, + [id]: value, + })); + } + return { setPanelOpenState, panelOpenState }; + }, [panelOpenState]); + + return ( + + {children} + ); } function PanelsInner() { const getPanelPreferences = useGetPanelOptions(); + const { panelOpenState } = usePanelOpenState(); const { dialog, openDialog, closeDialog } = useDialogToggle({ informationModal: false, }); @@ -65,7 +86,7 @@ function PanelsInner() {