"use client"; import { useState, useEffect, useRef } from "react"; interface ImageSelectorProps { value: string; onChange: (url: string) => void; label: string; } export default function ImageSelector({ value, onChange, label, }: ImageSelectorProps) { const [availableImages, setAvailableImages] = useState([]); const [loading, setLoading] = useState(false); const [uploading, setUploading] = useState(false); const [urlInput, setUrlInput] = useState(""); const [showGallery, setShowGallery] = useState(false); const fileInputRef = useRef(null); useEffect(() => { fetchAvailableImages(); }, []); const fetchAvailableImages = async () => { try { const response = await fetch("/api/admin/images/list"); if (response.ok) { const data = await response.json(); setAvailableImages(data.images || []); } } catch (error) { console.error("Error fetching images:", error); } }; const handleFileUpload = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; setUploading(true); try { const formData = new FormData(); formData.append("file", file); const response = await fetch("/api/admin/images/upload", { method: "POST", body: formData, }); if (response.ok) { const data = await response.json(); onChange(data.url); await fetchAvailableImages(); // Rafraîchir la liste } else { alert("Erreur lors de l'upload de l'image"); } } catch (error) { console.error("Error uploading image:", error); alert("Erreur lors de l'upload de l'image"); } finally { setUploading(false); if (fileInputRef.current) { fileInputRef.current.value = ""; } } }; const handleUrlSubmit = () => { if (urlInput.trim()) { onChange(urlInput.trim()); setUrlInput(""); } }; return (
{/* Colonne gauche - Image */}
{value ? (
Preview { e.currentTarget.src = "/got-2.jpg"; // Image par défaut en cas d'erreur }} />
) : (
Aucune
)}
{/* Colonne droite - Contrôles */}
{/* Input URL */}
setUrlInput(e.target.value)} onKeyPress={(e) => e.key === "Enter" && handleUrlSubmit()} placeholder="https://example.com/image.jpg ou /image.jpg" className="flex-1 px-3 py-2 bg-black/60 border border-pixel-gold/30 rounded text-white text-sm" />
{/* Upload depuis le disque */}
{/* Chemin de l'image */} {value && (

{value}

)}
{/* Galerie d'images */} {showGallery && (

Images disponibles

{availableImages.length === 0 ? (
Aucune image disponible
) : ( availableImages.map((imageUrl) => ( )) )}
)}
); }