"use client"; import { useEffect, useState } 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 Link from "next/link"; export default function ClientPage() { const { user, isAuthenticated, isLoading: authLoading } = useAuth(); const router = useRouter(); const [tickets, setTickets] = useState([]); const [isLoading, setIsLoading] = useState(true); const [stats, setStats] = useState({ total: 0, claimed: 0, pending: 0, }); useEffect(() => { if (!authLoading && !isAuthenticated) { router.push(ROUTES.LOGIN); return; } if (isAuthenticated) { loadUserTickets(); } }, [authLoading, isAuthenticated, router]); const loadUserTickets = async () => { try { const response = await gameService.getMyTickets(1, 100); const ticketsData = response?.data || []; setTickets(ticketsData); // Calculate stats const total = ticketsData.length; const claimed = ticketsData.filter((t: Ticket) => t.status === "CLAIMED").length; const pending = ticketsData.filter((t: Ticket) => t.status === "PENDING").length; setStats({ total, claimed, pending }); } catch (error) { console.error("Error loading tickets:", error); } finally { setIsLoading(false); } }; 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 (
{/* Welcome Section */}

Bonjour {user?.firstName} ! 👋

Bienvenue dans votre espace client

{/* Quick Action */}

Vous avez un nouveau ticket ?

Entrez votre code et découvrez votre gain instantanément

{/* Statistics Cards */}

Total Participations

{stats.total}

Gains réclamés

{stats.claimed}

En attente

{stats.pending}

{/* Recent Tickets */}

Mes derniers tickets

{tickets.length === 0 ? (
🎲

Vous n'avez pas encore participé au jeu

) : (
{tickets.slice(0, 5).map((ticket) => { const prizeConfig = ticket.prize ? PRIZE_CONFIG[ticket.prize.type as keyof typeof PRIZE_CONFIG] : null; return ( ); })}
Code Ticket Gain Statut Date
{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") : "-"}
)}
); }