"use client"; import { useEffect, useState, useTransition } from "react"; import { useSession } from "next-auth/react"; import { createChallenge, acceptChallenge, cancelChallenge } from "@/actions/challenges/create"; import { Button, Card, SectionTitle, Input, Textarea, Alert } from "@/components/ui"; import { Avatar } from "@/components/ui"; interface User { id: string; username: string; avatar: string | null; score: number; level: number; } interface Challenge { id: string; challenger: { id: string; username: string; avatar: string | null; }; challenged: { id: string; username: string; avatar: string | null; }; title: string; description: string; pointsReward: number; status: string; adminComment: string | null; winner?: { id: string; username: string; } | null; createdAt: string; acceptedAt: string | null; completedAt: string | null; } interface ChallengesSectionProps { backgroundImage: string; } export default function ChallengesSection({ backgroundImage }: ChallengesSectionProps) { const { data: session } = useSession(); const [challenges, setChallenges] = useState([]); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [showCreateForm, setShowCreateForm] = useState(false); const [isPending, startTransition] = useTransition(); // Form state const [challengedId, setChallengedId] = useState(""); const [title, setTitle] = useState(""); const [description, setDescription] = useState(""); const [pointsReward, setPointsReward] = useState(100); const [successMessage, setSuccessMessage] = useState(null); const [errorMessage, setErrorMessage] = useState(null); useEffect(() => { fetchChallenges(); fetchUsers(); }, []); const fetchChallenges = async () => { try { const response = await fetch("/api/challenges"); if (response.ok) { const data = await response.json(); setChallenges(data); } } catch (error) { console.error("Error fetching challenges:", error); } finally { setLoading(false); } }; const fetchUsers = async () => { try { const response = await fetch("/api/users"); if (response.ok) { const data = await response.json(); setUsers(data); } } catch (error) { console.error("Error fetching users:", error); } }; const handleCreateChallenge = () => { if (!challengedId || !title || !description) { setErrorMessage("Veuillez remplir tous les champs"); setTimeout(() => setErrorMessage(null), 5000); return; } startTransition(async () => { const result = await createChallenge({ challengedId, title, description, pointsReward, }); if (result.success) { setSuccessMessage("Défi créé avec succès !"); setShowCreateForm(false); setChallengedId(""); setTitle(""); setDescription(""); setPointsReward(100); fetchChallenges(); setTimeout(() => setSuccessMessage(null), 5000); } else { setErrorMessage(result.error || "Erreur lors de la création du défi"); setTimeout(() => setErrorMessage(null), 5000); } }); }; const handleAcceptChallenge = (challengeId: string) => { startTransition(async () => { const result = await acceptChallenge(challengeId); if (result.success) { setSuccessMessage("Défi accepté ! En attente de validation admin."); fetchChallenges(); setTimeout(() => setSuccessMessage(null), 5000); } else { setErrorMessage(result.error || "Erreur lors de l'acceptation"); setTimeout(() => setErrorMessage(null), 5000); } }); }; const handleCancelChallenge = (challengeId: string) => { if (!confirm("Êtes-vous sûr de vouloir annuler ce défi ?")) { return; } startTransition(async () => { const result = await cancelChallenge(challengeId); if (result.success) { setSuccessMessage("Défi annulé"); fetchChallenges(); setTimeout(() => setSuccessMessage(null), 5000); } else { setErrorMessage(result.error || "Erreur lors de l'annulation"); setTimeout(() => setErrorMessage(null), 5000); } }); }; const getStatusLabel = (status: string) => { switch (status) { case "PENDING": return "En attente d'acceptation"; case "ACCEPTED": return "Accepté - En attente de validation admin"; case "COMPLETED": return "Complété"; case "REJECTED": return "Rejeté"; case "CANCELLED": return "Annulé"; default: return status; } }; const getStatusColor = (status: string) => { switch (status) { case "PENDING": return "text-yellow-400"; case "ACCEPTED": return "text-blue-400"; case "COMPLETED": return "text-green-400"; case "REJECTED": return "text-red-400"; case "CANCELLED": return "text-gray-400"; default: return "text-gray-300"; } }; return (
DÉFIS ENTRE JOUEURS {successMessage && ( {successMessage} )} {errorMessage && ( {errorMessage} )}
{/* Create Form */} {showCreateForm && (

Créer un nouveau défi

setTitle(e.target.value)} placeholder="Ex: Qui participera à plus d'événements ce mois ?" />