File size: 1,150 Bytes
9b906ea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import React from "react";

interface SidebarMobileNavContextValue {
  isOpen: boolean;
  open: () => void;
  close: () => void;
  toggle: () => void;
}

const SidebarMobileNavContext =
  React.createContext<SidebarMobileNavContextValue | null>(null);

export function SidebarMobileNavProvider({
  children,
}: {
  children: React.ReactNode;
}) {
  const [isOpen, setIsOpen] = React.useState(false);

  const open = React.useCallback(() => setIsOpen(true), []);
  const close = React.useCallback(() => setIsOpen(false), []);
  const toggle = React.useCallback(() => setIsOpen((prev) => !prev), []);

  const value = React.useMemo(
    () => ({
      isOpen,
      open,
      close,
      toggle,
    }),
    [isOpen, open, close, toggle],
  );

  return (
    <SidebarMobileNavContext.Provider value={value}>
      {children}
    </SidebarMobileNavContext.Provider>
  );
}

export function useSidebarMobileNav(): SidebarMobileNavContextValue {
  const context = React.useContext(SidebarMobileNavContext);
  if (!context) {
    throw new Error(
      "useSidebarMobileNav must be used within SidebarMobileNavProvider",
    );
  }
  return context;
}