"use client"; import { useEffect, useState, useCallback } from "react"; import { useAuth } from "@/contexts/AuthContext"; import { useRouter } from "next/navigation"; import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/Card"; import { Badge } from "@/components/ui/Badge"; import Button from "@/components/Button"; import { Loading } from "@/components/ui/Loading"; import { Ticket } from "@/types"; import { gameService } from "@/services/game.service"; import { ROUTES, PRIZE_CONFIG } from "@/utils/constants"; import { Calendar, Search } from "lucide-react"; export default function HistoriquePage() { const { user, isAuthenticated, isLoading: authLoading } = useAuth(); const router = useRouter(); const [tickets, setTickets] = useState([]); const [filteredTickets, setFilteredTickets] = useState([]); const [isLoading, setIsLoading] = useState(true); const [filter, setFilter] = useState<'ALL' | 'CLAIMED' | 'PENDING' | 'REJECTED'>('ALL'); const [searchQuery, setSearchQuery] = useState(''); const [stats, setStats] = useState({ total: 0, claimed: 0, pending: 0, rejected: 0, }); const loadUserTickets = useCallback(async () => { try { const response = await gameService.getMyTickets(1, 1000); const ticketsData = response?.data || []; setTickets(ticketsData); setFilteredTickets(ticketsData); const total = ticketsData.length; const claimed = ticketsData.filter((t: Ticket) => t.status === "CLAIMED").length; const pending = ticketsData.filter((t: Ticket) => t.status === "PENDING").length; const rejected = ticketsData.filter((t: Ticket) => t.status === "REJECTED").length; setStats({ total, claimed, pending, rejected }); } catch (error) { console.error("Error loading tickets:", error); } finally { setIsLoading(false); } }, []); const filterTickets = useCallback(() => { let result = [...tickets]; if (filter !== 'ALL') { result = result.filter((t) => t.status === filter); } if (searchQuery) { result = result.filter((t) => t.code.toLowerCase().includes(searchQuery.toLowerCase()) ); } setFilteredTickets(result); }, [tickets, filter, searchQuery]); useEffect(() => { if (!authLoading && !isAuthenticated) { router.push(ROUTES.LOGIN); return; } if (isAuthenticated) { loadUserTickets(); } }, [authLoading, isAuthenticated, router, loadUserTickets]); useEffect(() => { filterTickets(); }, [filterTickets]); if (authLoading || isLoading) { return (
); } if (!isAuthenticated) { return null; } const getStatusBadge = (status: string) => { switch (status) { case "CLAIMED": return Réclamé; case "PENDING": return En attente; case "REJECTED": return Rejeté; default: return {status}; } }; return (

Historique de mes participations

Consultez l'historique complet de vos participations et gains

Total

{stats.total}

Réclamés

{stats.claimed}

En attente

{stats.pending}

Rejetés

{stats.rejected}

setSearchQuery(e.target.value)} className="w-full pl-10 pr-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#1a4d2e] focus:border-transparent" />

Tous mes tickets ({filteredTickets.length})

{filteredTickets.length === 0 ? (
🎲

{searchQuery || filter !== 'ALL' ? 'Aucun ticket trouvé avec ces filtres' : 'Vous n\'avez pas encore participé au jeu'}

{!searchQuery && filter === 'ALL' && ( )}
) : (
{filteredTickets.map((ticket) => { const prizeConfig = ticket.prize ? PRIZE_CONFIG[ticket.prize.type as keyof typeof PRIZE_CONFIG] : null; return ( ); })}
Code Ticket Gain Statut Date de participation Date de réclamation
{ticket.code}
{prizeConfig && ( <>
{ticket.prize?.type === 'INFUSEUR' && ( )} {ticket.prize?.type === 'THE_SIGNATURE' && ( )} {ticket.prize?.type === 'COFFRET_DECOUVERTE' && ( )} {ticket.prize?.type === 'COFFRET_PRESTIGE' && ( )} {ticket.prize?.type === 'THE_GRATUIT' && ( )}

{prizeConfig.name}

)}
{getStatusBadge(ticket.status)} {ticket.playedAt ? new Date(ticket.playedAt).toLocaleDateString("fr-FR", { day: 'numeric', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit', }) : "-"} {ticket.claimedAt ? new Date(ticket.claimedAt).toLocaleDateString("fr-FR", { day: 'numeric', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit', }) : "-"}
)}
); }