mirror of
https://github.com/ershisan99/DevToysWeb.git
synced 2025-12-16 20:49:23 +00:00
36 lines
1.1 KiB
TypeScript
36 lines
1.1 KiB
TypeScript
"use client";
|
|
|
|
import { createContext, PropsWithChildren, useCallback, useContext } from "react";
|
|
import { useCookies } from "next-client-cookies";
|
|
|
|
const SIDEBAR_COOKIE_NAME = "sidebar";
|
|
|
|
export enum SidebarStatus {
|
|
Open = "open",
|
|
Closed = "closed",
|
|
}
|
|
|
|
const SidebarContext = createContext(SidebarStatus.Closed);
|
|
const SetSidebarContext = createContext<(newStatus: SidebarStatus) => void>(() => {});
|
|
|
|
export const useSidebarStatus = () => useContext(SidebarContext);
|
|
export const useSetSidebarStatus = () => useContext(SetSidebarContext);
|
|
|
|
export const SidebarProvider = ({ children }: PropsWithChildren) => {
|
|
const cookies = useCookies();
|
|
|
|
const sidebarStatus = cookies.get(SIDEBAR_COOKIE_NAME) ?? (SidebarStatus.Open as SidebarStatus);
|
|
const setSidebarStatus = useCallback(
|
|
(newStatus: SidebarStatus) => {
|
|
cookies.set(SIDEBAR_COOKIE_NAME, newStatus);
|
|
},
|
|
[cookies]
|
|
);
|
|
|
|
return (
|
|
<SidebarContext.Provider value={sidebarStatus}>
|
|
<SetSidebarContext.Provider value={setSidebarStatus}>{children}</SetSidebarContext.Provider>
|
|
</SidebarContext.Provider>
|
|
);
|
|
};
|