Spaces:
Running
Running
| import { createContext, useContext, useState, useEffect, useCallback, useMemo } from 'react' | |
| const ThemeContext = createContext(null) | |
| export function ThemeProvider({ children }) { | |
| const [theme, setTheme] = useState(() => localStorage.getItem('theme') || 'dark') | |
| useEffect(() => { | |
| document.documentElement.setAttribute('data-theme', theme) | |
| document.documentElement.style.colorScheme = theme | |
| if (theme === 'dark') { | |
| document.documentElement.classList.add('dark') | |
| } else { | |
| document.documentElement.classList.remove('dark') | |
| } | |
| localStorage.setItem('theme', theme) | |
| }, [theme]) | |
| const toggle = useCallback(() => setTheme(t => t === 'dark' ? 'light' : 'dark'), []) | |
| const value = useMemo(() => ({ theme, toggle }), [theme, toggle]) | |
| return ( | |
| <ThemeContext.Provider value={value}> | |
| {children} | |
| </ThemeContext.Provider> | |
| ) | |
| } | |
| export const useTheme = () => useContext(ThemeContext) | |