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;
}
|