"use client"; import { useState, useEffect, useTransition, type FormEvent } from "react"; import { useSession } from "next-auth/react"; import { useRouter, useParams } from "next/navigation"; import Navigation from "@/components/Navigation"; import { createFeedback } from "@/actions/events/feedback"; interface Event { id: string; name: string; date: string; description: string; } interface Feedback { id: string; rating: number; comment: string | null; } interface FeedbackPageClientProps { backgroundImage: string; } export default function FeedbackPageClient({ backgroundImage, }: FeedbackPageClientProps) { const { status } = useSession(); const router = useRouter(); const params = useParams(); const eventId = params?.eventId as string; 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 [, startTransition] = useTransition(); 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); startTransition(async () => { try { const result = await createFeedback(eventId, { rating, comment: comment.trim() || null, }); if (!result.success) { setError(result.error || "Erreur lors de l'enregistrement"); setSubmitting(false); return; } setSuccess(true); if (result.data) { setExistingFeedback({ id: result.data.id, rating: result.data.rating, comment: result.data.comment, }); } // 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 */}