@@ -18,8 +18,8 @@ import parse from "autosuggest-highlight/parse";
1818import clsx from "clsx" ;
1919import { AnimatePresence , Transition } from "framer-motion" ;
2020import { 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" ;
2323import shallow from "zustand/shallow" ;
2424
2525import { 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
7992const 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 ) {
0 commit comments