Gridlock / app /frontend /src /components /ThemeProvider.tsx
parvmittal07's picture
Initial Demo complete
01eb82e
Raw
History Blame Contribute Delete
963 Bytes
import * as React from "react";
type Theme = "dark" | "light";
interface ThemeCtx {
theme: Theme;
toggle: () => void;
}
const ThemeContext = React.createContext<ThemeCtx>({ theme: "dark", toggle: () => {} });
export function ThemeProvider({ children }: { children: React.ReactNode }) {
const [theme, setTheme] = React.useState<Theme>(() => {
const saved = localStorage.getItem("gridlock-theme") as Theme | null;
return saved ?? "dark";
});
React.useEffect(() => {
const root = document.documentElement;
root.classList.remove("dark", "light");
root.classList.add(theme);
localStorage.setItem("gridlock-theme", theme);
}, [theme]);
const toggle = React.useCallback(
() => setTheme((t) => (t === "dark" ? "light" : "dark")),
[]
);
return (
<ThemeContext.Provider value={{ theme, toggle }}>
{children}
</ThemeContext.Provider>
);
}
export const useTheme = () => React.useContext(ThemeContext);