import { Localstorage } from "@hey/data/storage"; import { createContext, type ReactNode, useCallback, useContext, useEffect, useMemo, useState } from "react"; type Theme = "light" | "dark"; interface ThemeContextValue { theme: Theme; toggleTheme: () => void; } const ThemeContext = createContext(null); interface ThemeProviderProps { children: ReactNode; } export const ThemeProvider = ({ children }: ThemeProviderProps) => { const [theme, setTheme] = useState(() => { const saved = localStorage.getItem(Localstorage.Theme); return (saved ?? "light") as Theme; }); useEffect(() => { document.documentElement.setAttribute("class", theme); localStorage.setItem(Localstorage.Theme, theme); }, [theme]); const toggleTheme = useCallback( () => setTheme((t) => (t === "light" ? "dark" : "light")), [] ); const value = useMemo(() => ({ theme, toggleTheme }), [theme, toggleTheme]); return ( {children} ); }; export const useTheme = (): ThemeContextValue => { const context = useContext(ThemeContext); if (!context) { throw new Error("useTheme must be used within a ThemeProvider"); } return context; };