"use client"; import { createContext, useCallback, useContext, useEffect, useState } from "react"; const storageKey = "agentcompany-theme"; type ThemeMode = "light" | "dark"; type ThemeContextValue = { theme: ThemeMode; setTheme: (theme: ThemeMode) => void; toggleTheme: () => void; }; const ThemeContext = createContext(undefined); function resolveTheme(): ThemeMode { if (typeof window === "undefined") { return "light"; } const stored = localStorage.getItem(storageKey); if (stored === "light" || stored === "dark") { return stored; } return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; } export function ThemeProvider({ children }: { children: React.ReactNode }) { const [theme, setThemeState] = useState(resolveTheme); useEffect(() => { const root = document.documentElement; if (theme === "dark") { root.classList.add("dark"); } else { root.classList.remove("dark"); } localStorage.setItem(storageKey, theme); }, [theme]); useEffect(() => { const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); const handleChange = (event: MediaQueryListEvent) => { if (!localStorage.getItem(storageKey)) { setThemeState(event.matches ? "dark" : "light"); } }; mediaQuery.addEventListener("change", handleChange); return () => mediaQuery.removeEventListener("change", handleChange); }, []); const setTheme = useCallback((nextTheme: ThemeMode) => { setThemeState(nextTheme); }, []); const toggleTheme = useCallback(() => { setThemeState((currentTheme) => (currentTheme === "light" ? "dark" : "light")); }, []); return ( {children} ); } export function useTheme() { const context = useContext(ThemeContext); if (!context) { throw new Error("useTheme must be used within a ThemeProvider"); } return context; }