'use client'; import { createContext, useContext, useEffect, useState, ReactNode } from 'react'; import { updateViewPreferences } from '@/actions/preferences'; type Theme = 'light' | 'dark'; interface ThemeContextType { theme: Theme; toggleTheme: () => void; setTheme: (theme: Theme) => void; } const ThemeContext = createContext(undefined); interface ThemeProviderProps { children: ReactNode; initialTheme?: Theme; } export function ThemeProvider({ children, initialTheme = 'dark' }: ThemeProviderProps) { const [theme, setThemeState] = useState(initialTheme); const [mounted, setMounted] = useState(false); // Hydration safe initialization useEffect(() => { setMounted(true); }, []); // Apply theme class to document useEffect(() => { if (mounted) { document.documentElement.className = theme; } }, [theme, mounted]); const toggleTheme = async () => { const newTheme = theme === 'dark' ? 'light' : 'dark'; setThemeState(newTheme); // Sauvegarder en base de façon asynchrone via server action try { const result = await updateViewPreferences({ theme: newTheme }); if (!result.success) { console.error('Erreur lors de la sauvegarde du thème:', result.error); } } catch (error) { console.error('Erreur lors de la sauvegarde du thème:', error); } }; const setTheme = async (newTheme: Theme) => { setThemeState(newTheme); // Sauvegarder en base de façon asynchrone via server action try { const result = await updateViewPreferences({ theme: newTheme }); if (!result.success) { console.error('Erreur lors de la sauvegarde du thème:', result.error); } } catch (error) { console.error('Erreur lors de la sauvegarde du thème:', error); } }; return (
{children}
); } export function useTheme() { const context = useContext(ThemeContext); if (context === undefined) { throw new Error('useTheme must be used within a ThemeProvider'); } return context; }