"use client"; import { useState, useEffect, type FormEvent } from "react"; import { useSession } from "next-auth/react"; interface Event { id: string; name: string; date: string; description: string; } interface Feedback { id: string; rating: number; comment: string | null; } interface FeedbackModalProps { eventId: string | null; eventName?: string; onClose: () => void; } export default function FeedbackModal({ eventId, eventName: _eventName, onClose, }: FeedbackModalProps) { const { status } = useSession(); const [event, setEvent] = useState(null); const [existingFeedback, setExistingFeedback] = useState( null ); const [loading, setLoading] = useState(true); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(""); const [success, setSuccess] = useState(false); const [rating, setRating] = useState(0); const [comment, setComment] = useState(""); // Réinitialiser les états quand eventId change useEffect(() => { if (eventId) { setEvent(null); setExistingFeedback(null); setRating(0); setComment(""); setError(""); setSuccess(false); setLoading(true); } }, [eventId]); const fetchEventAndFeedback = async () => { if (!eventId) return; try { // Récupérer l'événement const eventResponse = await fetch(`/api/events/${eventId}`); if (!eventResponse.ok) { setError("Événement introuvable"); setLoading(false); return; } const eventData = await eventResponse.json(); setEvent(eventData); // Récupérer le feedback existant si disponible const feedbackResponse = await fetch(`/api/feedback/${eventId}`); if (feedbackResponse.ok) { const feedbackData = await feedbackResponse.json(); if (feedbackData.feedback) { setExistingFeedback(feedbackData.feedback); setRating(feedbackData.feedback.rating); setComment(feedbackData.feedback.comment || ""); } else { // Pas de feedback existant, réinitialiser setRating(0); setComment(""); } } else { // Pas de feedback existant, réinitialiser setRating(0); setComment(""); } } catch { setError("Erreur lors du chargement des données"); } finally { setLoading(false); } }; useEffect(() => { if (status === "unauthenticated") { onClose(); return; } if (status === "authenticated" && eventId) { fetchEventAndFeedback(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [status, eventId]); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); if (!eventId) return; setError(""); setSuccess(false); if (rating === 0) { setError("Veuillez sélectionner une note"); return; } setSubmitting(true); try { const response = await fetch(`/api/feedback/${eventId}`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ rating, comment: comment.trim() || null, }), }); const data = await response.json(); if (!response.ok) { setError(data.error || "Erreur lors de l'enregistrement"); return; } setSuccess(true); setExistingFeedback(data.feedback); // Fermer la modale après 1.5 secondes setTimeout(() => { onClose(); }, 1500); } catch { setError("Erreur lors de l'enregistrement"); } finally { setSubmitting(false); } }; const handleClose = () => { if (!submitting) { onClose(); } }; if (!eventId) return null; return (
e.stopPropagation()} >
{/* Header */}

FEEDBACK

{loading ? (
Chargement...
) : !event ? (
Événement introuvable
) : ( <>

{existingFeedback ? "Modifier votre feedback pour" : "Donnez votre avis sur"}

{event.name}

{success && (
Feedback enregistré avec succès !
)} {error && (
{error}
)}
{/* Rating */}
{[1, 2, 3, 4, 5].map((star) => ( ))}

{rating > 0 && `${rating}/5`}

{/* Comment */}