"use client"; import { useState, useEffect, useMemo } from "react"; import ImageSelector from "@/components/ImageSelector"; interface SitePreferences { id: string; homeBackground: string | null; eventsBackground: string | null; leaderboardBackground: string | null; } interface BackgroundPreferencesProps { initialPreferences: SitePreferences; } const DEFAULT_IMAGES = { home: "/got-2.jpg", events: "/got-2.jpg", leaderboard: "/leaderboard-bg.jpg", }; export default function BackgroundPreferences({ initialPreferences, }: BackgroundPreferencesProps) { // Helper pour obtenir la valeur à afficher dans le formulaire const getFormValue = ( dbValue: string | null | undefined, defaultImage: string ) => { return dbValue && dbValue.trim() !== "" ? dbValue : defaultImage; }; // Helper pour obtenir la valeur à envoyer à l'API const getApiValue = (formValue: string, defaultImage: string) => { return formValue === defaultImage ? "" : formValue; }; const [preferences, setPreferences] = useState( initialPreferences ); const [isEditing, setIsEditing] = useState(false); const computedFormData = useMemo( () => ({ homeBackground: getFormValue( initialPreferences.homeBackground, DEFAULT_IMAGES.home ), eventsBackground: getFormValue( initialPreferences.eventsBackground, DEFAULT_IMAGES.events ), leaderboardBackground: getFormValue( initialPreferences.leaderboardBackground, DEFAULT_IMAGES.leaderboard ), }), [initialPreferences] ); const [formData, setFormData] = useState(computedFormData); // Synchroniser les préférences quand initialPreferences change useEffect(() => { setPreferences(initialPreferences); setFormData(computedFormData); // eslint-disable-next-line react-hooks/exhaustive-deps }, [initialPreferences]); const handleEdit = () => { setIsEditing(true); }; const handleSave = async () => { try { // Convertir les valeurs du formulaire en valeurs API ("" si c'est l'image par défaut) const apiData = { homeBackground: getApiValue( formData.homeBackground, DEFAULT_IMAGES.home ), eventsBackground: getApiValue( formData.eventsBackground, DEFAULT_IMAGES.events ), leaderboardBackground: getApiValue( formData.leaderboardBackground, DEFAULT_IMAGES.leaderboard ), }; const response = await fetch("/api/admin/preferences", { method: "PUT", headers: { "Content-Type": "application/json", }, body: JSON.stringify(apiData), }); if (response.ok) { const data = await response.json(); setPreferences(data); // Réinitialiser formData avec les nouvelles valeurs (ou images par défaut) setFormData({ homeBackground: getFormValue( data.homeBackground, DEFAULT_IMAGES.home ), eventsBackground: getFormValue( data.eventsBackground, DEFAULT_IMAGES.events ), leaderboardBackground: getFormValue( data.leaderboardBackground, DEFAULT_IMAGES.leaderboard ), }); setIsEditing(false); } else { const errorData = await response.json(); console.error("Error updating preferences:", errorData); alert(errorData.error || "Erreur lors de la mise à jour"); } } catch (error) { console.error("Error updating preferences:", error); } }; const handleCancel = () => { setIsEditing(false); if (preferences) { setFormData({ homeBackground: getFormValue( preferences.homeBackground, DEFAULT_IMAGES.home ), eventsBackground: getFormValue( preferences.eventsBackground, DEFAULT_IMAGES.events ), leaderboardBackground: getFormValue( preferences.leaderboardBackground, DEFAULT_IMAGES.leaderboard ), }); } }; return (

Images de fond du site

Ces préférences s'appliquent à tous les utilisateurs

{!isEditing && ( )}
{isEditing ? (
setFormData({ ...formData, homeBackground: url, }) } label="Background Home" /> setFormData({ ...formData, eventsBackground: url, }) } label="Background Events" /> setFormData({ ...formData, leaderboardBackground: url, }) } label="Background Leaderboard" />
) : (
Home: {(() => { const currentImage = preferences?.homeBackground && preferences.homeBackground.trim() !== "" ? preferences.homeBackground : DEFAULT_IMAGES.home; const isDefault = !preferences?.homeBackground || preferences.homeBackground.trim() === ""; return (
Home background { const target = e.currentTarget; const currentSrc = target.src; const fallbackSrc = "/got-2.jpg"; if (!currentSrc.includes(fallbackSrc)) { target.src = fallbackSrc; } else { target.style.display = "none"; const fallbackDiv = target.nextElementSibling as HTMLElement; if (fallbackDiv) { fallbackDiv.classList.remove("hidden"); } } }} />
No image
{isDefault ? "Par défaut: " : ""} {currentImage} {isDefault && ( (Image par défaut) )}
); })()}
Events: {(() => { const currentImage = preferences?.eventsBackground && preferences.eventsBackground.trim() !== "" ? preferences.eventsBackground : DEFAULT_IMAGES.events; const isDefault = !preferences?.eventsBackground || preferences.eventsBackground.trim() === ""; return (
Events background { const target = e.currentTarget; const currentSrc = target.src; const fallbackSrc = "/got-2.jpg"; if (!currentSrc.includes(fallbackSrc)) { target.src = fallbackSrc; } else { target.style.display = "none"; const fallbackDiv = target.nextElementSibling as HTMLElement; if (fallbackDiv) { fallbackDiv.classList.remove("hidden"); } } }} />
No image
{isDefault ? "Par défaut: " : ""} {currentImage} {isDefault && ( (Image par défaut) )}
); })()}
Leaderboard: {(() => { const currentImage = preferences?.leaderboardBackground && preferences.leaderboardBackground.trim() !== "" ? preferences.leaderboardBackground : DEFAULT_IMAGES.leaderboard; const isDefault = !preferences?.leaderboardBackground || preferences.leaderboardBackground.trim() === ""; return (
Leaderboard background { const target = e.currentTarget; const currentSrc = target.src; const fallbackSrc = "/got-2.jpg"; if (!currentSrc.includes(fallbackSrc)) { target.src = fallbackSrc; } else { target.style.display = "none"; const fallbackDiv = target.nextElementSibling as HTMLElement; if (fallbackDiv) { fallbackDiv.classList.remove("hidden"); } } }} />
No image
{isDefault ? "Par défaut: " : ""} {currentImage} {isDefault && ( (Image par défaut) )}
); })()}
)}
); }