import { createContext, useCallback, useContext, useEffect, useState } from "react"; import { STORAGE_KEY, resolveTheme } from "./theme-selection"; import type { Theme } from "./theme-selection"; function getInitialTheme(): Theme { if (typeof window === "undefined") return "dark"; return resolveTheme(localStorage.getItem(STORAGE_KEY)); } function applyThemeClass(theme: Theme) { const root = document.documentElement; root.classList.remove("light", "dark"); root.classList.add(theme); } const ThemeContext = createContext<{ theme: Theme; toggle: () => void; }>({ theme: "dark", toggle: () => {} }); export function ThemeProvider({ children }: { children: React.ReactNode }) { const [theme, setTheme] = useState(getInitialTheme); useEffect(() => { applyThemeClass(theme); }, [theme]); const toggle = useCallback(() => { setTheme((prev) => { const next = prev === "dark" ? "light" : "dark"; localStorage.setItem(STORAGE_KEY, next); return next; }); }, []); return ( {children} ); } export function useTheme() { return useContext(ThemeContext); } export type { Theme };