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