"use client"; import { useState, useEffect, useCallback } from "react"; import { useAuth } from "@/contexts/AuthContext"; import { useGame } from "@/hooks/useGame"; import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/Card"; import { Badge } from "@/components/ui/Badge"; import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell, } from "@/components/ui/Table"; import { Loading } from "@/components/ui/Loading"; import { PRIZE_CONFIG, TICKET_STATUS_LABELS, TICKET_STATUS_COLORS } from "@/utils/constants"; import { formatDateTime } from "@/utils/helpers"; import { Ticket } from "@/types"; import { useRouter } from "next/navigation"; import { ROUTES } from "@/utils/constants"; import Button from "@/components/Button"; export default function HistoriquePage() { const { user, isAuthenticated } = useAuth(); const { getMyTickets, isLoadingTickets } = useGame(); const router = useRouter(); const [tickets, setTickets] = useState([]); const [currentPage, setCurrentPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [error, setError] = useState(null); const loadTickets = useCallback(async () => { try { setError(null); console.log('🎫 Chargement des tickets, page:', currentPage); const result = await getMyTickets(currentPage, 10); console.log('📦 Résultat API:', result); if (result) { console.log('✅ Tickets reçus:', result.data); setTickets(result.data || []); setTotalPages(result.totalPages || 1); } else { console.log('❌ Aucun résultat reçu'); setTickets([]); setError('Impossible de charger vos tickets. Veuillez réessayer.'); } } catch (err) { console.error('❌ Erreur lors du chargement:', err); setError('Erreur lors du chargement de vos tickets.'); setTickets([]); } }, [getMyTickets, currentPage]); useEffect(() => { if (isAuthenticated && user?.role?.toLowerCase() === "client") { loadTickets(); } }, [isAuthenticated, user, loadTickets]); if (!isAuthenticated || user?.role?.toLowerCase() !== "client") { return (

Accès non autorisé

Cette page est réservée aux clients

Votre rôle actuel : {user?.role || 'Non défini'}

); } const getStatusBadge = (status: string) => { const statusLower = status.toLowerCase(); const variant = statusLower === "claimed" ? "success" : statusLower === "pending" ? "warning" : "danger"; return ( {TICKET_STATUS_LABELS[statusLower as keyof typeof TICKET_STATUS_LABELS] || status} ); }; return (

Historique de mes gains

{error && (
⚠️

Erreur de chargement

{error}

)} {isLoadingTickets ? ( ) : tickets.length === 0 && !error ? (
🎲

Aucun ticket pour le moment

Commencez à jouer pour voir vos gains apparaître ici

) : tickets.length > 0 ? ( <> {/* Stats Cards */}

Total de tickets

{tickets.length}

🎫

Gains réclamés

{tickets.filter((t) => t.status.toLowerCase() === "claimed").length}

En attente

{tickets.filter((t) => t.status.toLowerCase() === "pending").length}

{/* Tickets Table */} Mes tickets Code Lot gagné Statut Date {tickets.map((ticket) => ( {ticket.code} {ticket.prize && (
{PRIZE_CONFIG[ticket.prize.type as keyof typeof PRIZE_CONFIG]?.icon || '🎁'} {ticket.prize.name || PRIZE_CONFIG[ticket.prize.type as keyof typeof PRIZE_CONFIG]?.name}
)}
{getStatusBadge(ticket.status)} {ticket.playedAt ? formatDateTime(ticket.playedAt) : ticket.createdAt ? formatDateTime(ticket.createdAt) : '-'}
))}
{/* Pagination */} {totalPages > 1 && (

Page {currentPage} sur {totalPages}

)}
) : null}
); }