"use client"; import { AnimatePresence, motion } from "framer-motion"; import Image from "next/image"; import { useCallback, useEffect, useState } from "react"; // Mapping des textes associés à chaque visuel const ADS_COPY: Record = { "riseofkinkdom.jpeg": { title: "Atteignez 50 Millions d’Impuissance !", subtitle: "Rejoignez « Rise of Kink Doms » et dominez vos adversaires.", }, "voat.png": { title: "Aymeric Pierre vend votre voiture !", subtitle: "Offre exclusive : 69,42 BTC, garantie World PvP Champion.", }, }; export default function AdsGalleryClient({ files }: { files: string[] }) { // \u2714️ État qui détermine l'image agrandie actuellement affichée const [selected, setSelected] = useState(null); /** * Gestion du clavier : ␛ pour fermer la light-box * On utilise le « KeyboardEvent » natif du DOM, plus compatible */ const handleKey = useCallback((e: KeyboardEvent) => { if (e.key === "Escape") setSelected(null); }, []); useEffect(() => { if (!selected) return; // rien à faire si aucune image n'est ouverte // ➜ attache l'écouteur window.addEventListener("keydown", handleKey); document.body.style.overflow = "hidden"; // bloque le scroll arrière-plan // ➜ cleanup à la fermeture / unmount return () => { window.removeEventListener("keydown", handleKey); document.body.style.overflow = ""; }; }, [selected, handleKey]); return (
{/* Titre */} Galerie des publicités {/* Message si aucun fichier */} {files.length === 0 ? ( Aucune bannière trouvée dans /public/ads. ) : ( {files.map((file) => { const copy = ADS_COPY[file]; return ( setSelected(file)} > {/* Vignette */}
{file}
{/* Texte associé */} {copy && (

{copy.title.split(/(50 Millions)/).map((part, i) => part === "50 Millions" ? ( {part} ) : ( part ) )}

{copy.subtitle}

)} {/* Nom de fichier */}

{file}

); })}
)}
{/* ---- Light-box plein écran ---- */} {selected && ( { // Ferme si on clique en dehors de l'image if (e.target === e.currentTarget) setSelected(null); }} > {selected} {/* Bouton de fermeture */} )}
); }