'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import Dropzone from 'react-dropzone'; interface SessionUser { id: string; role: string; } export default function CreateAnnonceForm({ user }: { user: SessionUser }) { const router = useRouter(); const [codePostal, setCodePostal] = useState(''); const [country, setCountry] = useState(''); const [title, setTitle] = useState(''); const [address, setAddress] = useState(''); const [city, setCity] = useState(''); const [price, setPrice] = useState(''); const [description, setDescription] = useState(''); 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 (!user || user.role === 'USER') { setError("Vous devez être connecté en tant qu'agent immobilier pour ajouter une annonce."); return; } if (photoList.length === 0) { setError("Veuillez ajouter au moins une image pour l'annonce."); return; } setIsSubmitting(true); // On utilise FormData pour envoyer les champs et les fichiers dans la même requête const formData = new FormData(); formData.append('agentId', user.id); formData.append('title', title); formData.append('address', address); formData.append('pays', country); formData.append('ville', city); formData.append('codePostal', codePostal); formData.append('description', description); formData.append('prix', price); 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(); throw new Error(errorData.message || "Une erreur est survenue lors de la création de l'annonce."); } router.push('/'); } catch (error: any) { console.error("Erreur lors de la création de l'annonce:", error); setError(error.message); } finally { setIsSubmitting(false); } }; return (
{/* ... (tous vos inputs restent les mêmes) ... */}
setTitle(e.target.value)} className="mt-1 block w-full px-3 py-2 border border-gray-300 text-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-gray-500 focus:border-gray-500" />
setAddress(e.target.value)} className="mt-1 block w-full px-3 py-2 border border-gray-300 text-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-gray-500 focus:border-gray-500" />
setCountry(e.target.value)} className="mt-1 block w-full px-3 py-2 border border-gray-300 text-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-gray-500 focus:border-gray-500" />
setCity(e.target.value)} className="mt-1 block w-full px-3 py-2 border border-gray-300 text-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-gray-500 focus:border-gray-500" />
setCodePostal(e.target.value)} className="mt-1 block w-full px-3 py-2 border border-gray-300 text-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-gray-500 focus:border-gray-500" />
setPrice(e.target.value)} className="mt-1 block w-full px-3 py-2 border border-gray-300 text-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-gray-500 focus:border-gray-500" />