'use client'; import { useState } from 'react'; import { Card } from '@/components/ui/Card'; import { EmptyState } from '@/components/ui/EmptyState'; import Button from '@/components/Button'; import { apiFetch } from '@/hooks/useApi'; import toast from 'react-hot-toast'; import { Search, User, Gift, CheckCircle, Clock, XCircle, Phone, Mail, Package, } from 'lucide-react'; interface ClientPrize { ticketId: string; ticketCode: string; status: string; playedAt: string; claimedAt: string | null; validatedAt: string | null; validatedBy: string | null; prize: { id: string; name: string; type: string; value: string; description: string; }; } interface ClientData { client: { id: string; email: string; firstName: string; lastName: string; phone: string; }; prizes: ClientPrize[]; totalPrizes: number; pendingPrizes: number; claimedPrizes: number; } export default function GainsClientPage() { const [searchType, setSearchType] = useState<'email' | 'phone'>('email'); const [searchValue, setSearchValue] = useState(''); const [loading, setLoading] = useState(false); const [clientData, setClientData] = useState(null); const [validatingTicketId, setValidatingTicketId] = useState(null); const handleSearch = async () => { if (!searchValue.trim()) { toast.error('Veuillez entrer un email ou un téléphone'); return; } setLoading(true); try { const queryParam = searchType === 'email' ? `email=${encodeURIComponent(searchValue)}` : `phone=${encodeURIComponent(searchValue)}`; const data = await apiFetch<{ data: ClientData }>(`/employee/client-prizes?${queryParam}`); setClientData(data.data); toast.success(`Client trouvé: ${data.data.client.firstName} ${data.data.client.lastName}`); } catch (error: any) { console.error('Error searching client:', error); toast.error(error.message || 'Erreur lors de la recherche'); setClientData(null); } finally { setLoading(false); } }; const handleValidatePrize = async (ticketId: string) => { if (!confirm('Confirmer la remise de ce lot au client?')) { return; } setValidatingTicketId(ticketId); try { await apiFetch('/employee/validate-ticket', { method: 'POST', body: JSON.stringify({ ticketId, action: 'APPROVE' }), }); toast.success('Lot marqué comme remis!'); handleSearch(); } catch (error: any) { console.error('Error validating prize:', error); toast.error(error.message || 'Erreur lors de la validation'); } finally { setValidatingTicketId(null); } }; const getStatusBadge = (status: string) => { const badges = { PENDING: ( À remettre ), CLAIMED: ( Remis ), REJECTED: ( Rejeté ), }; return badges[status as keyof typeof badges] || badges.PENDING; }; return (
{/* Header */}

Gains du Client

Recherchez un client pour visualiser tous ses gains et les remettre

{/* Search Section */}

Rechercher un client

{/* Search Type Selection */}
{/* Search Input */}
setSearchValue(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && handleSearch()} className="flex-1 px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" />
{/* Client Info & Prizes */} {clientData && ( <> {/* Client Info Card */}

{clientData.client.firstName} {clientData.client.lastName}

{clientData.client.email}

{clientData.client.phone && (

{clientData.client.phone}

)}

Total

{clientData.totalPrizes}

À remettre

{clientData.pendingPrizes}

Remis

{clientData.claimedPrizes}

{/* Prizes List */}

Lots gagnés ({clientData.prizes.length})

{clientData.prizes.length === 0 ? ( ) : (
{clientData.prizes.map((prize) => (

{prize.prize.name}

{getStatusBadge(prize.status)}

{prize.prize.description}

Code ticket: {prize.ticketCode}
Valeur: {prize.prize.value}€
Gagné le: {new Date(prize.playedAt).toLocaleDateString('fr-FR')}
{prize.claimedAt && (
Remis le: {new Date(prize.claimedAt).toLocaleDateString('fr-FR')}
)} {prize.validatedBy && (
Remis par: {prize.validatedBy}
)}
{prize.status === 'PENDING' && ( )}
))}
)}
)}
); }