"use client"; import { createContext, useContext, useEffect, useState } from "react"; type Theme = "light" | "dark"; interface ThemeContextType { theme: Theme; toggleTheme: () => void; } const ThemeContext = createContext(undefined); export function ThemeProvider({ children }: { children: React.ReactNode }) { const [theme, setTheme] = useState("light"); const [mounted, setMounted] = useState(false); useEffect(() => { setMounted(true); const savedTheme = localStorage.getItem("theme") as Theme | null; if (savedTheme) { setTheme(savedTheme); if (savedTheme === "dark") { document.documentElement.classList.add("dark"); } } else if (window.matchMedia("(prefers-color-scheme: dark)").matches) { setTheme("dark"); document.documentElement.classList.add("dark"); } }, []); const toggleTheme = () => { setTheme((prev) => { const newTheme = prev === "light" ? "dark" : "light"; localStorage.setItem("theme", newTheme); if (newTheme === "dark") { document.documentElement.classList.add("dark"); } else { document.documentElement.classList.remove("dark"); } return newTheme; }); }; return ( {mounted ? children :
{children}
}
); } export function useTheme() { const context = useContext(ThemeContext); if (!context) { throw new Error("useTheme must be used within a ThemeProvider"); } return context; }