"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import Dropzone from "react-dropzone"; import { PublicationStatus, RealEstateStatus, Type } from "@prisma/client"; export default function CreateAnnonceForm() { const router = useRouter(); const [title, setTitle] = useState(""); const [address, setAddress] = useState(""); const [country, setCountry] = useState(""); const [city, setCity] = useState(""); const [postalCode, setPostalCode] = useState(""); const [price, setPrice] = useState(""); const [description, setDescription] = useState(""); const [publicationStatus, setPublicationStatus] = useState(PublicationStatus.UNPUBLISHED); const [surface, setSurface] = useState(""); const [numberOfRooms, setNumberOfRooms] = useState(""); const [numberOfBathrooms, setNumberOfBathrooms] = useState(""); const [floor, setFloor] = useState(""); const [yearBuilt, setYearBuilt] = useState(""); const [type, setType] = useState(Type.RENT); const [avaibleFrom, setAvaibleFrom] = useState(""); const [realeSteateStatus, setRealeSteateStatus] = useState(RealEstateStatus.AVAILABLE); const [photoList, setPhotoList] = useState([]); const [error, setError] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); setError(null); if (photoList.length === 0) { setError("Veuillez ajouter au moins une image pour l'annonce."); return; } setIsSubmitting(true); const formData = new FormData(); formData.append("title", title); formData.append("address", address); formData.append("country", country); formData.append("city", city); formData.append("postalCode", postalCode); formData.append("description", description); formData.append("price", price); formData.append("surface", surface); formData.append("numberOfRooms", numberOfRooms); formData.append("numberOfBathrooms", numberOfBathrooms); formData.append("floor", floor); formData.append("yearBuilt", yearBuilt); formData.append("publicationStatus", publicationStatus); formData.append("type", type); formData.append("avaibleFrom", avaibleFrom ? new Date(avaibleFrom).toISOString() : ""); formData.append("realeSteateStatus", realeSteateStatus); photoList.forEach((file) => { formData.append("images", file); }); try { const response = await fetch("/api/annonces", { method: "POST", body: formData, }); if (!response.ok) { const errorData = await response.json().catch(() => ({})); throw new Error(errorData.message || "Une erreur est survenue lors de la création de l'annonce."); } router.push("/"); } catch (err: any) { console.error("Erreur lors de la création de l'annonce:", err); setError(err.message ?? "Erreur inconnue"); } finally { setIsSubmitting(false); } }; return (
{error &&
{error}
}

Informations

setTitle(e.target.value)} className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 text-gray-700 shadow-sm focus:border-gray-500 focus:ring-gray-500 focus:outline-none" />
setAddress(e.target.value)} className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 text-gray-700 shadow-sm focus:border-gray-500 focus:ring-gray-500 focus:outline-none" />
setCity(e.target.value)} className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 text-gray-700 shadow-sm focus:border-gray-500 focus:ring-gray-500 focus:outline-none" />
setCountry(e.target.value)} className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 text-gray-700 shadow-sm focus:border-gray-500 focus:ring-gray-500 focus:outline-none" />
setPostalCode(e.target.value)} className="mt-1 block w-full rounded-md border border-gray-300 px-3 py-2 text-gray-700 shadow-sm focus:border-gray-500 focus:ring-gray-500 focus:outline-none" />