"use client"; import { useState, useEffect, type FormEvent } from "react"; import { useSession } from "next-auth/react"; import { useRouter, useParams } from "next/navigation"; import Navigation from "@/components/Navigation"; import { useBackgroundImage } from "@/hooks/usePreferences"; interface Event { id: string; name: string; date: string; description: string; } interface Feedback { id: string; rating: number; comment: string | null; } export default function FeedbackPage() { const { status } = useSession(); const router = useRouter(); const params = useParams(); const eventId = params?.eventId as string; const backgroundImage = useBackgroundImage("home", "/got-2.jpg"); 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(""); const fetchEventAndFeedback = async () => { 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 || ""); } } } catch { setError("Erreur lors du chargement des données"); } finally { setLoading(false); } }; useEffect(() => { if (status === "unauthenticated") { router.push(`/login?redirect=/feedback/${eventId}`); return; } if (status === "authenticated" && eventId) { fetchEventAndFeedback(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [status, eventId, router]); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); 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); // Rediriger après 2 secondes setTimeout(() => { router.push("/events"); }, 2000); } catch { setError("Erreur lors de l'enregistrement"); } finally { setSubmitting(false); } }; if (status === "loading" || loading) { return (
Chargement...
); } if (!event) { return (
Événement introuvable
); } return (
{/* Background Image */}
{/* Feedback Form */}

FEEDBACK

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

{event.name}

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

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

{/* Comment */}