import { createContext, useContext, useState, useCallback, useMemo, useEffect } from 'react'; import { type Theme, type ThemeOption, THEME_OPTIONS, getInitialTheme, persistTheme, applyThemeToDocument, getNextTheme, } from '@/utils/theme'; export type { Theme, ThemeOption }; export { THEME_OPTIONS }; interface ThemeContextType { theme: Theme; toggleTheme: () => void; setTheme: (theme: Theme) => void; } const ThemeContext = createContext(null); export function ThemeProvider({ children }: { children: React.ReactNode }) { const [theme, setThemeState] = useState(getInitialTheme); useEffect(() => { applyThemeToDocument(theme); }, [theme]); const toggleTheme = useCallback(() => { setThemeState((prev) => { const next = getNextTheme(prev); persistTheme(next); return next; }); }, []); const setTheme = useCallback((t: Theme) => { persistTheme(t); setThemeState(t); }, []); const value = useMemo( () => ({ theme, toggleTheme, setTheme }), [theme, toggleTheme, setTheme], ); return {children}; } export function useTheme(): ThemeContextType { const ctx = useContext(ThemeContext); if (!ctx) throw new Error('useTheme must be used within ThemeProvider'); return ctx; }