| import { useEffect } from 'react'; | |
| import { useConfigStore } from '../../stores/useConfigStore'; | |
| export default function ThemeManager() { | |
| const { config, loadConfig } = useConfigStore(); | |
| // Load config on mount | |
| useEffect(() => { | |
| loadConfig(); | |
| }, [loadConfig]); | |
| // Apply theme when config changes | |
| useEffect(() => { | |
| if (!config) return; | |
| const applyTheme = (theme: string) => { | |
| const root = document.documentElement; | |
| const isDark = theme === 'dark'; | |
| // Set DaisyUI theme | |
| root.setAttribute('data-theme', theme); | |
| // Set inline style for immediate visual feedback | |
| root.style.backgroundColor = isDark ? '#1d232a' : '#FAFBFC'; | |
| // Set Tailwind dark mode class | |
| if (isDark) { | |
| root.classList.add('dark'); | |
| } else { | |
| root.classList.remove('dark'); | |
| } | |
| }; | |
| const theme = config.theme || 'system'; | |
| // Sync to localStorage for early boot check | |
| localStorage.setItem('app-theme-preference', theme); | |
| if (theme === 'system') { | |
| const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); | |
| const handleSystemChange = (e: MediaQueryListEvent | MediaQueryList) => { | |
| const systemTheme = e.matches ? 'dark' : 'light'; | |
| applyTheme(systemTheme); | |
| }; | |
| // Initial alignment | |
| handleSystemChange(mediaQuery); | |
| // Listen for changes | |
| mediaQuery.addEventListener('change', handleSystemChange); | |
| return () => mediaQuery.removeEventListener('change', handleSystemChange); | |
| } else { | |
| applyTheme(theme); | |
| } | |
| }, [config?.theme]); | |
| return null; // This component handles side effects only | |
| } | |