"use client"; import { useState, useTransition } from "react"; import { useSession } from "next-auth/react"; import { createChallenge, acceptChallenge, cancelChallenge, } from "@/actions/challenges/create"; import { Button, Card, SectionTitle, Alert } from "@/components/ui"; import ChallengeCard from "./ChallengeCard"; import ChallengeForm from "./ChallengeForm"; 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 { initialChallenges: Challenge[]; initialUsers: User[]; backgroundImage: string; } export default function ChallengesSection({ initialChallenges, initialUsers, backgroundImage, }: ChallengesSectionProps) { const { data: session } = useSession(); const [challenges, setChallenges] = useState(initialChallenges); const [users] = useState(initialUsers); const [showCreateForm, setShowCreateForm] = useState(false); const [isPending, startTransition] = useTransition(); const [successMessage, setSuccessMessage] = useState(null); const [errorMessage, setErrorMessage] = useState(null); const [showExamples, setShowExamples] = useState(false); 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); } }; const handleCreateChallenge = (data: { challengedId: string; title: string; description: string; pointsReward: number; }) => { startTransition(async () => { const result = await createChallenge(data); if (result.success) { setSuccessMessage("Défi créé avec succès !"); setShowCreateForm(false); fetchChallenges(); // Rafraîchir le badge des défis window.dispatchEvent(new Event("refreshChallenges")); 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 désignation du gagnant." ); fetchChallenges(); // Rafraîchir le badge des défis window.dispatchEvent(new Event("refreshChallenges")); setTimeout(() => setSuccessMessage(null), 5000); } else { setErrorMessage(result.error || "Erreur lors de l'acceptation"); setTimeout(() => setErrorMessage(null), 5000); } }); }; const handleCancelChallenge = (challengeId: string) => { startTransition(async () => { const result = await cancelChallenge(challengeId); if (result.success) { setSuccessMessage("Défi annulé"); fetchChallenges(); // Rafraîchir le badge des défis window.dispatchEvent(new Event("refreshChallenges")); setTimeout(() => setSuccessMessage(null), 5000); } else { setErrorMessage(result.error || "Erreur lors de l'annulation"); setTimeout(() => setErrorMessage(null), 5000); } }); }; return (
{/* Background Image */}
{/* Dark overlay for readability */}
DÉFIS ENTRE JOUEURS

Créez des défis personnalisés, acceptez ceux de vos collègues et remportez des récompenses en points pour monter dans le classement

{successMessage && ( {successMessage} )} {errorMessage && ( {errorMessage} )}
{/* Create Form */} {showCreateForm && ( setShowCreateForm(false)} isPending={isPending} /> )} {/* Challenges List */} {challenges.length === 0 ? (

Vous n'avez aucun défi pour le moment.

) : (
{challenges.map((challenge) => ( ))}
)} {/* Examples Section */} {showExamples && (

Qui participera à plus d'événements ce mois ?

Le joueur qui participe au plus grand nombre d'événements organisés ce mois remporte le défi. Les événements doivent être validés par un admin pour compter.

Points suggérés: 150

Premier à atteindre le niveau 10

Le premier joueur à atteindre le niveau 10 remporte le défi. Le niveau est calculé automatiquement selon le score total.

Points suggérés: 200

Meilleur feedback sur un événement

Le joueur qui donne le feedback le plus détaillé et constructif sur un événement remporte le défi. L'admin désignera le gagnant selon la qualité du feedback.

Points suggérés: 100

Plus grand nombre de points gagnés cette semaine

Le joueur qui accumule le plus de points cette semaine remporte le défi. Seuls les points gagnés après l'acceptation du défi comptent.

Points suggérés: 250

Défi créatif : meilleure bio de profil

Le joueur avec la bio de profil la plus créative et originale remporte le défi. L'admin désignera le gagnant selon l'originalité et la qualité de la bio.

Points suggérés: 120
)}
); }