Spaces:
Sleeping
Sleeping
'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(() => { | |
// On mount, read theme from localStorage or default to light | |
const savedTheme = localStorage.getItem('theme') as Theme | |
if (savedTheme) { | |
setTheme(savedTheme) | |
document.documentElement.setAttribute('data-theme', savedTheme) | |
} | |
}, []) | |
const toggleTheme = () => { | |
const newTheme = theme === 'light' ? 'dark' : 'light' | |
setTheme(newTheme) | |
localStorage.setItem('theme', newTheme) | |
document.documentElement.setAttribute('data-theme', newTheme) | |
} | |
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 | |
} |