"use client"; import { useState, useEffect, useMemo } from "react"; import ImageSelector from "@/components/layout/ImageSelector"; import { updateSitePreferences } from "@/actions/admin/preferences"; import { Button, Card } from "@/components/ui"; interface SitePreferences { id: string; homeBackground: string | null; eventsBackground: string | null; leaderboardBackground: string | null; challengesBackground: string | null; profileBackground: string | null; houseBackground: string | null; eventRegistrationPoints?: number; } interface BackgroundPreferencesProps { initialPreferences: SitePreferences; } const DEFAULT_IMAGES = { home: "/got-2.jpg", events: "/got-2.jpg", leaderboard: "/leaderboard-bg.jpg", challenges: "/got-2.jpg", profile: "/got-background.jpg", houses: "/got-2.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 ), challengesBackground: getFormValue( initialPreferences.challengesBackground, DEFAULT_IMAGES.challenges ), profileBackground: getFormValue( initialPreferences.profileBackground, DEFAULT_IMAGES.profile ), houseBackground: getFormValue( initialPreferences.houseBackground, DEFAULT_IMAGES.houses ), }), [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 ), challengesBackground: getApiValue( formData.challengesBackground, DEFAULT_IMAGES.challenges ), profileBackground: getApiValue( formData.profileBackground, DEFAULT_IMAGES.profile ), houseBackground: getApiValue( formData.houseBackground, DEFAULT_IMAGES.houses ), }; const result = await updateSitePreferences(apiData); if (result.success && result.data) { setPreferences(result.data); // Réinitialiser formData avec les nouvelles valeurs (ou images par défaut) setFormData({ homeBackground: getFormValue( result.data.homeBackground, DEFAULT_IMAGES.home ), eventsBackground: getFormValue( result.data.eventsBackground, DEFAULT_IMAGES.events ), leaderboardBackground: getFormValue( result.data.leaderboardBackground, DEFAULT_IMAGES.leaderboard ), challengesBackground: getFormValue( result.data.challengesBackground, DEFAULT_IMAGES.challenges ), profileBackground: getFormValue( result.data.profileBackground, DEFAULT_IMAGES.profile ), houseBackground: getFormValue( result.data.houseBackground, DEFAULT_IMAGES.houses ), }); setIsEditing(false); } else { console.error("Error updating preferences:", result.error); alert(result.error || "Erreur lors de la mise à jour"); } } catch (error) { console.error("Error updating preferences:", error); alert("Erreur lors de la mise à jour"); } }; 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 ), challengesBackground: getFormValue( preferences.challengesBackground, DEFAULT_IMAGES.challenges ), profileBackground: getFormValue( preferences.profileBackground, DEFAULT_IMAGES.profile ), houseBackground: getFormValue( preferences.houseBackground, DEFAULT_IMAGES.houses ), }); } }; 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" /> setFormData({ ...formData, challengesBackground: url, }) } label="Background Challenges" /> setFormData({ ...formData, profileBackground: url, }) } label="Background Profile" /> setFormData({ ...formData, houseBackground: url, }) } label="Background Houses" />
) : (
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) )}
); })()}
Challenges: {(() => { const currentImage = preferences?.challengesBackground && preferences.challengesBackground.trim() !== "" ? preferences.challengesBackground : DEFAULT_IMAGES.challenges; const isDefault = !preferences?.challengesBackground || preferences.challengesBackground.trim() === ""; return (
Challenges 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) )}
); })()}
Profile: {(() => { const currentImage = preferences?.profileBackground && preferences.profileBackground.trim() !== "" ? preferences.profileBackground : DEFAULT_IMAGES.profile; const isDefault = !preferences?.profileBackground || preferences.profileBackground.trim() === ""; return (
Profile background { const target = e.currentTarget; const currentSrc = target.src; const fallbackSrc = "/got-background.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) )}
); })()}
Houses: {(() => { const currentImage = preferences?.houseBackground && preferences.houseBackground.trim() !== "" ? preferences.houseBackground : DEFAULT_IMAGES.houses; const isDefault = !preferences?.houseBackground || preferences.houseBackground.trim() === ""; return (
Houses 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) )}
); })()}
)}
); }