Skip to content

Commit e1bcb44

Browse files
committed
feat: Do not share one MetadataPanelStore across multiple panels
1 parent 7414225 commit e1bcb44

3 files changed

Lines changed: 87 additions & 64 deletions

File tree

app/components/chart-published.tsx

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@ import {
1919
import GenericChart from "@/components/common-chart";
2020
import Flex from "@/components/flex";
2121
import { HintBlue, HintRed, HintYellow } from "@/components/hint";
22-
import { MetadataPanel } from "@/components/metadata-panel";
22+
import {
23+
MetadataPanel,
24+
MetadataPanelStoreContext,
25+
createMetadataPanelStore,
26+
} from "@/components/metadata-panel";
2327
import {
2428
ChartConfig,
2529
ConfiguratorStatePublishing,
@@ -55,15 +59,19 @@ export const ChartPublished = ({
5559
chartConfig: ChartConfig;
5660
configKey: string;
5761
}) => {
62+
const metadataPanelStore = useMemo(() => createMetadataPanelStore(), []);
63+
5864
return (
5965
<ChartTablePreviewProvider>
60-
<ChartPublishedInner
61-
dataSet={dataSet}
62-
dataSource={dataSource}
63-
meta={meta}
64-
chartConfig={chartConfig}
65-
configKey={configKey}
66-
/>
66+
<MetadataPanelStoreContext.Provider value={metadataPanelStore}>
67+
<ChartPublishedInner
68+
dataSet={dataSet}
69+
dataSource={dataSource}
70+
meta={meta}
71+
chartConfig={chartConfig}
72+
configKey={configKey}
73+
/>
74+
</MetadataPanelStoreContext.Provider>
6775
</ChartTablePreviewProvider>
6876
);
6977
};

app/components/metadata-panel.tsx

Lines changed: 59 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ import parse from "autosuggest-highlight/parse";
1818
import clsx from "clsx";
1919
import { AnimatePresence, Transition } from "framer-motion";
2020
import { useRouter } from "next/router";
21-
import React, { useState } from "react";
22-
import create from "zustand";
21+
import React from "react";
22+
import { createStore, useStore } from "zustand";
2323
import shallow from "zustand/shallow";
2424

2525
import { BackButton, DataSource } from "@/configurator";
@@ -49,32 +49,45 @@ type MetadataPanelState = {
4949
reset: () => void;
5050
};
5151

52-
export const useMetadataPanelStore = create<MetadataPanelState>((set, get) => ({
53-
open: false,
54-
setOpen: (d: boolean) => {
55-
set({ open: d });
56-
},
57-
toggle: () => {
58-
set({ open: !get().open });
59-
},
60-
activeSection: "general",
61-
setActiveSection: (d: MetadataPanelSection) => {
62-
set({ activeSection: d });
63-
},
64-
selectedDimension: undefined,
65-
setSelectedDimension: (d: DimensionMetadataFragment) => {
66-
set({ selectedDimension: d });
67-
},
68-
clearSelectedDimension: () => {
69-
set({ selectedDimension: undefined });
70-
},
71-
openDimension: (d: DimensionMetadataFragment) => {
72-
set({ open: true, activeSection: "data", selectedDimension: d });
73-
},
74-
reset: () => {
75-
set({ activeSection: "general", selectedDimension: undefined });
76-
},
77-
}));
52+
export const createMetadataPanelStore = () =>
53+
createStore<MetadataPanelState>((set, get) => ({
54+
open: false,
55+
setOpen: (d: boolean) => {
56+
set({ open: d });
57+
},
58+
toggle: () => {
59+
set({ open: !get().open });
60+
},
61+
activeSection: "general",
62+
setActiveSection: (d: MetadataPanelSection) => {
63+
set({ activeSection: d });
64+
},
65+
selectedDimension: undefined,
66+
setSelectedDimension: (d: DimensionMetadataFragment) => {
67+
set({ selectedDimension: d });
68+
},
69+
clearSelectedDimension: () => {
70+
set({ selectedDimension: undefined });
71+
},
72+
openDimension: (d: DimensionMetadataFragment) => {
73+
set({ open: true, activeSection: "data", selectedDimension: d });
74+
},
75+
reset: () => {
76+
set({ activeSection: "general", selectedDimension: undefined });
77+
},
78+
}));
79+
80+
const useMetadataPanelStore: <T>(
81+
selector: (state: MetadataPanelState) => T
82+
) => T = (selector) => {
83+
const store = React.useContext(MetadataPanelStoreContext);
84+
85+
return useStore(store, selector, shallow);
86+
};
87+
88+
const defaultStore = createMetadataPanelStore();
89+
90+
export const MetadataPanelStoreContext = React.createContext(defaultStore);
7891

7992
const useDrawerStyles = makeStyles<Theme, { top: number }>((theme) => {
8093
return {
@@ -196,9 +209,9 @@ export const OpenMetadataPanelWrapper = ({
196209
children: React.ReactNode;
197210
}) => {
198211
const classes = useOtherStyles();
199-
const openDimenion = useMetadataPanelStore((state) => state.openDimension);
212+
const openDimension = useMetadataPanelStore((state) => state.openDimension);
200213
const handleClick = useEvent(() => {
201-
openDimenion(dim);
214+
openDimension(dim);
202215
});
203216

204217
return svg ? (
@@ -234,17 +247,14 @@ export const MetadataPanel = ({
234247
const drawerClasses = useDrawerStyles({ top });
235248
const otherClasses = useOtherStyles();
236249
const { open, setOpen, toggle, activeSection, setActiveSection, reset } =
237-
useMetadataPanelStore(
238-
(state) => ({
239-
open: state.open,
240-
setOpen: state.setOpen,
241-
toggle: state.toggle,
242-
activeSection: state.activeSection,
243-
setActiveSection: state.setActiveSection,
244-
reset: state.reset,
245-
}),
246-
shallow
247-
);
250+
useMetadataPanelStore((state) => ({
251+
open: state.open,
252+
setOpen: state.setOpen,
253+
toggle: state.toggle,
254+
activeSection: state.activeSection,
255+
setActiveSection: state.setActiveSection,
256+
reset: state.reset,
257+
}));
248258
const handleToggle = useEvent(() => {
249259
toggle();
250260
});
@@ -373,15 +383,12 @@ const TabPanelData = ({
373383
}) => {
374384
const classes = useOtherStyles();
375385
const { selectedDimension, setSelectedDimension, clearSelectedDimension } =
376-
useMetadataPanelStore(
377-
(state) => ({
378-
selectedDimension: state.selectedDimension,
379-
setSelectedDimension: state.setSelectedDimension,
380-
clearSelectedDimension: state.clearSelectedDimension,
381-
}),
382-
shallow
383-
);
384-
const [inputValue, setInputValue] = useState("");
386+
useMetadataPanelStore((state) => ({
387+
selectedDimension: state.selectedDimension,
388+
setSelectedDimension: state.setSelectedDimension,
389+
clearSelectedDimension: state.clearSelectedDimension,
390+
}));
391+
const [inputValue, setInputValue] = React.useState("");
385392

386393
const options = React.useMemo(() => {
387394
return dimensions.map((d) => ({ label: d.label, value: d }));
@@ -481,11 +488,8 @@ const TabPanelDataDimension = ({
481488
expandable: boolean;
482489
}) => {
483490
const classes = useOtherStyles();
484-
const { setSelectedDimension } = useMetadataPanelStore(
485-
(state) => ({
486-
setSelectedDimension: state.setSelectedDimension,
487-
}),
488-
shallow
491+
const setSelectedDimension = useMetadataPanelStore(
492+
(state) => state.setSelectedDimension
489493
);
490494
const { description, showExpandButton } = React.useMemo(() => {
491495
if (expandable && dim.description && dim.description.length > 180) {

app/pages/create/[chartId].tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ import Head from "next/head";
33
import * as React from "react";
44

55
import { AppLayout } from "@/components/layout";
6+
import {
7+
createMetadataPanelStore,
8+
MetadataPanelStoreContext,
9+
} from "@/components/metadata-panel";
610
import { Configurator, EditorConfiguratorStateProvider } from "@/configurator";
711

812
type PageProps = {
@@ -23,6 +27,11 @@ export const getServerSideProps: GetServerSideProps<PageProps> = async ({
2327
};
2428

2529
const ChartConfiguratorPage: NextPage<PageProps> = ({ chartId }) => {
30+
const metadataPanelStore = React.useMemo(
31+
() => createMetadataPanelStore(),
32+
[]
33+
);
34+
2635
return (
2736
<>
2837
<Head>
@@ -31,7 +40,9 @@ const ChartConfiguratorPage: NextPage<PageProps> = ({ chartId }) => {
3140
</Head>
3241
<AppLayout>
3342
<EditorConfiguratorStateProvider chartId={chartId}>
34-
<Configurator />
43+
<MetadataPanelStoreContext.Provider value={metadataPanelStore}>
44+
<Configurator />
45+
</MetadataPanelStoreContext.Provider>
3546
</EditorConfiguratorStateProvider>
3647
</AppLayout>
3748
</>

0 commit comments

Comments
 (0)