mirror of
https://github.com/ershisan99/DevToysWeb.git
synced 2025-12-16 12:32:48 +00:00
feat: add a toggle for sidebar
This commit is contained in:
35
contexts/sidebar.tsx
Normal file
35
contexts/sidebar.tsx
Normal file
@@ -0,0 +1,35 @@
|
||||
"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) 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>
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user