"use client"; import React, { createContext, useContext, useState, useEffect } from "react"; import { useSession } from "next-auth/react"; import { ERROR_CODES } from "../constants/errorCodes"; import { AppError } from "../utils/errors"; import type { UserPreferences } from "@/types/preferences"; import { defaultPreferences } from "@/types/preferences"; interface PreferencesContextType { preferences: UserPreferences; updatePreferences: (newPreferences: Partial) => Promise; isLoading: boolean; } const PreferencesContext = createContext(undefined); export function PreferencesProvider({ children, initialPreferences, }: { children: React.ReactNode; initialPreferences?: UserPreferences; }) { const { status } = useSession(); const [preferences, setPreferences] = useState( initialPreferences || defaultPreferences ); const [isLoading, setIsLoading] = useState(false); const fetchPreferences = async () => { try { const response = await fetch("/api/preferences"); if (!response.ok) { throw new AppError(ERROR_CODES.PREFERENCES.FETCH_ERROR); } const data = await response.json(); setPreferences({ ...defaultPreferences, ...data, }); } catch (error) { console.error("Erreur lors de la récupération des préférences:", error); setPreferences(defaultPreferences); } finally { setIsLoading(false); } }; useEffect(() => { // Recharger les préférences quand la session change (connexion/déconnexion) if (status === "authenticated") { fetchPreferences(); } else if (status === "unauthenticated") { // Réinitialiser aux préférences par défaut quand l'utilisateur se déconnecte setPreferences(defaultPreferences); } }, [status]); const updatePreferences = async (newPreferences: Partial) => { try { const response = await fetch("/api/preferences", { method: "PUT", headers: { "Content-Type": "application/json", }, body: JSON.stringify(newPreferences), }); if (!response.ok) { throw new AppError(ERROR_CODES.PREFERENCES.UPDATE_ERROR); } const updatedPreferences = await response.json(); setPreferences((prev) => ({ ...prev, ...updatedPreferences, })); await fetchPreferences(); return updatedPreferences; } catch (error) { console.error("Erreur lors de la mise à jour des préférences:", error); throw error; } }; return ( {children} ); } export function usePreferences() { const context = useContext(PreferencesContext); if (context === undefined) { throw new AppError(ERROR_CODES.PREFERENCES.CONTEXT_ERROR); } return context; }