| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- 'use client';
- import { createContext, useContext, useEffect, useState, useCallback } from 'react';
- type Theme = 'light' | 'dark';
- const ThemeContext = createContext<{
- theme: Theme;
- toggleTheme: () => void;
- }>({
- theme: 'light',
- toggleTheme: () => {},
- });
- export function useThemeContext() {
- return useContext(ThemeContext);
- }
- export function ThemeProvider({ children }: { children: React.ReactNode }) {
- const [theme, setTheme] = useState<Theme>('light');
- const [mounted, setMounted] = useState(false);
- useEffect(() => {
- const stored = localStorage.getItem('bitforum-theme') as Theme | null;
- const initial = stored ?? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
- setTheme(initial);
- document.documentElement.classList.toggle('dark', initial === 'dark');
- setMounted(true);
- }, []);
- const toggleTheme = useCallback(() => {
- setTheme((prev) => {
- const next = prev === 'light' ? 'dark' : 'light';
- localStorage.setItem('bitforum-theme', next);
- document.documentElement.classList.toggle('dark', next === 'dark');
- return next;
- });
- }, []);
- if (!mounted) {
- return <>{children}</>;
- }
- return (
- <ThemeContext.Provider value={{ theme, toggleTheme }}>
- {children}
- </ThemeContext.Provider>
- );
- }
|