This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

semble / src / webapp / providers / drawers.tsx
1.8 kB 83 lines
1import CreateCollectionDrawer from '@/features/collections/components/createCollectionDrawer/CreateCollectionDrawer'; 2import React, { 3 createContext, 4 useCallback, 5 useContext, 6 useState, 7 ReactNode, 8} from 'react'; 9 10type DrawerName = 'createCollection'; 11 12type DrawerPropsMap = { 13 createCollection: {}; 14}; 15 16interface DrawerState<T = any> { 17 name: DrawerName | null; 18 innerProps: T; 19} 20 21interface DrawersContextType { 22 open: <T extends DrawerName>(args: { 23 drawer: T; 24 innerProps?: DrawerPropsMap[T]; 25 }) => void; 26 close: () => void; 27 isOpen: (name: DrawerName) => boolean; 28 innerProps: any; 29} 30 31const DrawersContext = createContext<DrawersContextType | undefined>(undefined); 32 33export const useContextDrawers = () => { 34 const ctx = useContext(DrawersContext); 35 if (!ctx) { 36 throw new Error('useContextDrawers must be used within a DrawersProvider'); 37 } 38 return ctx; 39}; 40 41export const DrawersProvider = ({ children }: { children: ReactNode }) => { 42 const [state, setState] = useState<DrawerState>({ 43 name: null, 44 innerProps: {}, 45 }); 46 47 const open = useCallback( 48 <T extends DrawerName>({ 49 drawer, 50 innerProps = {}, 51 }: { 52 drawer: T; 53 innerProps?: DrawerPropsMap[T]; 54 }) => { 55 setState({ name: drawer, innerProps }); 56 }, 57 [], 58 ); 59 60 const close = useCallback(() => { 61 setState({ name: null, innerProps: {} }); 62 }, []); 63 64 const isOpen = useCallback( 65 (name: DrawerName) => state.name === name, 66 [state.name], 67 ); 68 69 return ( 70 <DrawersContext.Provider 71 value={{ open, close, isOpen, innerProps: state.innerProps }} 72 > 73 {children} 74 75 {/* Render */} 76 <CreateCollectionDrawer 77 isOpen={isOpen('createCollection')} 78 onClose={close} 79 {...state.innerProps} 80 /> 81 </DrawersContext.Provider> 82 ); 83};