"use client"; import { useEffect, useState } from "react"; import { AnnonceProps } from "@/lib/types/AnnonceProps"; import { useRouter } from "next/navigation"; import Dropzone from "react-dropzone"; export default function EditAnnonceMainImg({ annonce }: { annonce: AnnonceProps }) { if (!annonce) { return (

Annonce introuvable

); } const router = useRouter(); const [initialMainPhoto, setInitialMainPhoto] = useState(null); const [photoPrincipaleFile, setphotoPrincipaleFile] = useState(null); const [previewUrl, setPreviewUrl] = useState(null); const [uploading, setUploading] = useState(false); const [imgError, setImgError] = useState(null); const [success, setSuccess] = useState(null); useEffect(() => { if (annonce.mainImg) { setPreviewUrl(`data:image/jpeg;base64,${annonce.mainImg}`); setInitialMainPhoto(`data:image/jpeg;base64,${annonce.mainImg}`); } }, [annonce.mainImg]); async function handleUploadImage() { if (!photoPrincipaleFile) return; setImgError(null); setSuccess(null); setUploading(true); try { const fd = new FormData(); fd.append("imagePrincipale", photoPrincipaleFile); const res = await fetch(`/api/annonces/${annonce.id}`, { method: "PATCH", body: fd, }); if (!res.ok) { const err = await res.json().catch(() => ({})); throw new Error(err.message || "Échec de la mise à jour de l'image."); } setSuccess("Image mise à jour avec succès !"); // Scroll vers le haut pour voir le message window.scrollTo({ top: 0, behavior: "smooth" }); // Faire disparaître le message après 3 secondes setTimeout(() => { setSuccess(null); }, 3000); // Mettre à jour l'image initiale setInitialMainPhoto(previewUrl); setphotoPrincipaleFile(null); router.refresh(); } catch (e: any) { setImgError(e.message ?? "Erreur inconnue"); window.scrollTo({ top: 0, behavior: "smooth" }); } finally { setUploading(false); } } function onDrop(files: File[]) { const f = files[0]; if (!f) return; setphotoPrincipaleFile(f); setPreviewUrl(URL.createObjectURL(f)); setSuccess(null); setImgError(null); } return (
{imgError && (
{imgError}
)} {success && (
{success}
)}

Image principale

{previewUrl && ( Image principale )}
{({ getRootProps, getInputProps }) => (

Glissez-déposez votre photo, ou cliquez pour sélectionner.

PNG, JPG, JPEG, WEBP (max 5 Mo)

)}
{previewUrl && (
)}
); }