"use client"; import { useState, useEffect } from "react"; import { employeeService } from "@/services/employee.service"; import { Ticket } from "@/types"; import toast from "react-hot-toast"; import { Search, CheckCircle, XCircle, RefreshCw, Users, Clock, Ticket as TicketIcon, Gift, } from "lucide-react"; export default function EmployeeVerificationPage() { const [tickets, setTickets] = useState([]); const [loading, setLoading] = useState(true); const [searchCode, setSearchCode] = useState(""); const [selectedTicket, setSelectedTicket] = useState(null); const [showModal, setShowModal] = useState(false); const [validating, setValidating] = useState(false); const [rejectReason, setRejectReason] = useState(""); const [showRejectInput, setShowRejectInput] = useState(false); useEffect(() => { loadPendingTickets(); }, []); const loadPendingTickets = async () => { try { setLoading(true); const data = await employeeService.getPendingTickets(); // Trier par date décroissante (plus récent en premier) const sortedData = data.sort((a: Ticket, b: Ticket) => { const dateA = a.playedAt ? new Date(a.playedAt).getTime() : 0; const dateB = b.playedAt ? new Date(b.playedAt).getTime() : 0; return dateB - dateA; }); setTickets(sortedData); } catch (error: any) { console.error("Error loading tickets:", error); toast.error("Erreur lors du chargement des tickets"); } finally { setLoading(false); } }; const handleSearch = () => { if (!searchCode.trim()) { toast.error("Veuillez entrer un code de ticket"); return; } const ticket = tickets.find( (t) => t.code.toLowerCase() === searchCode.toLowerCase() ); if (ticket) { setSelectedTicket(ticket); setShowModal(true); setSearchCode(""); } else { toast.error("Ticket non trouvé ou déjà traité"); } }; const handleValidate = async () => { if (!selectedTicket) return; setValidating(true); try { await employeeService.validateTicket(selectedTicket.id, "APPROVE"); toast.success("Ticket validé ! Le lot peut être remis au client."); setShowModal(false); setSelectedTicket(null); loadPendingTickets(); } catch (error: any) { toast.error(error.message || "Erreur lors de la validation"); } finally { setValidating(false); } }; const handleReject = async () => { if (!selectedTicket) return; if (!rejectReason.trim()) { toast.error("Veuillez indiquer la raison du rejet"); return; } setValidating(true); try { await employeeService.validateTicket( selectedTicket.id, "REJECT", rejectReason ); toast.success("Ticket rejeté"); setShowModal(false); setSelectedTicket(null); setShowRejectInput(false); setRejectReason(""); loadPendingTickets(); } catch (error: any) { toast.error(error.message || "Erreur lors du rejet"); } finally { setValidating(false); } }; if (loading) { return (
); } return (
{/* Header */}

Validation des Tickets

Scannez ou recherchez un code pour valider les lots gagnés

{/* Search Section - Style blanc cassé */}
setSearchCode(e.target.value.toUpperCase())} onKeyPress={(e) => e.key === "Enter" && handleSearch()} className="w-full pl-12 pr-4 py-3 bg-white border border-gray-200 rounded-xl focus:ring-2 focus:ring-emerald-500 focus:border-transparent font-mono text-lg" maxLength={12} />
{/* Table des tickets en attente */}

Lots en attente de remise

{tickets.length} ticket(s) en attente

{tickets.length === 0 ? (

Aucun lot en attente

Tous les lots ont été remis !

) : ( {tickets.map((ticket) => ( {/* CODE TICKET */} {/* CLIENT */} {/* LOT GAGNÉ */} {/* DATE */} {/* ACTIONS */} ))}
Code Ticket Client Lot Gagné Date Actions
{ticket.code}
{ticket.user ? `${ticket.user.firstName?.charAt(0) || ''}${ticket.user.lastName?.charAt(0) || ''}` : '?'}
{ticket.user ? `${ticket.user.firstName} ${ticket.user.lastName}` : 'N/A'}
{ticket.user?.email || 'N/A'}
{ticket.prize?.name || 'N/A'}
{ticket.playedAt ? new Date(ticket.playedAt).toLocaleDateString('fr-FR', { year: 'numeric', month: '2-digit', day: '2-digit' }) : '-'}
)}
{/* Modal de validation */} {showModal && selectedTicket && (

Détails du Ticket

{/* Code et Statut */}

Code ticket

{selectedTicket.code}

En attente
{/* Client Info */}

Client

{selectedTicket.user ? `${selectedTicket.user.firstName?.charAt(0) || ''}${selectedTicket.user.lastName?.charAt(0) || ''}` : '?'}

{selectedTicket.user ? `${selectedTicket.user.firstName} ${selectedTicket.user.lastName}` : 'N/A'}

{selectedTicket.user?.email || 'N/A'}

{selectedTicket.user?.phone && (

{selectedTicket.user.phone}

)}
{/* Lot gagné */}

Lot à remettre

{selectedTicket.prize?.name}

{selectedTicket.prize?.description}

{/* Date */}

Date de participation

{selectedTicket.playedAt ? new Date(selectedTicket.playedAt).toLocaleDateString('fr-FR', { day: 'numeric', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit' }) : 'N/A'}

{/* Reject Reason Input */} {showRejectInput && (