import { createContext, useEffect, useMemo, useState } from "react"; const getInitialTheme = () => { if (typeof window !== "undefined" && window.localStorage) { const storedPrefs = window.localStorage.getItem("theme-mode"); if (typeof storedPrefs === "string") { return storedPrefs; } const userMedia = window.matchMedia("(prefers-color-scheme: dark)"); if (userMedia.matches) { return "dark"; } } return "dark"; // dark as the default mode }; export const ThemeContext = createContext(); export function ThemeProvider({ initialTheme, children }) { const [theme, setTheme] = useState(() => initialTheme ?? getInitialTheme()); const rawSetTheme = (rawTheme) => { const root = window.document.documentElement; const isDark = rawTheme === "dark"; root.classList.remove(isDark ? "light" : "dark"); root.classList.add(rawTheme); localStorage.setItem("theme-mode", rawTheme); }; useEffect(() => { if (initialTheme !== undefined) setTheme(initialTheme ?? getInitialTheme()); // eslint-disable-next-line react-hooks/exhaustive-deps }, [initialTheme]); useEffect(() => { rawSetTheme(theme); }, [theme]); const value = useMemo(() => ({ theme, setTheme }), [theme]); return {children}; }