This repository has no description
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};