"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, AlertCircle, Users, Clock, BarChart3, } 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(); setTickets(data); } 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); } }; const getStatusBadge = (status: string) => { const badges: Record = { PENDING: ( En attente ), REJECTED: ( Rejeté ), CLAIMED: ( Réclamé ), }; return badges[status] || badges.PENDING; }; if (loading) { return (
); } return (
{/* Header */}

Validation des Tickets

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

{/* Search Section */}

Rechercher un ticket

setSearchCode(e.target.value.toUpperCase())} onKeyPress={(e) => e.key === "Enter" && handleSearch()} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent font-mono text-lg" maxLength={10} />
{/* Statistics Cards */}
} color="yellow" /> } color="green" /> } color="blue" />
{/* Tickets Table */}

Tickets en attente ({tickets.length})

{tickets.length === 0 ? (

Aucun ticket en attente

Tous les tickets ont été traités !

) : ( {tickets.map((ticket) => ( ))}
Code Ticket Client Lot Gagné Date Statut Actions
{ticket.code}
{ticket.user?.firstName} {ticket.user?.lastName}
{ticket.user?.email}
{ticket.prize?.name || "N/A"}
{ticket.playedAt ? new Date(ticket.playedAt).toLocaleDateString("fr-FR") : "N/A"} {getStatusBadge(ticket.status)}
)}
{/* Modal de validation */} {showModal && selectedTicket && (

Détails du Ticket

{/* Ticket Info */}

Code du ticket

{selectedTicket.code}

Statut

{getStatusBadge(selectedTicket.status)}

Lot gagné

{selectedTicket.prize?.name}

{selectedTicket.prize?.description}

Client

{selectedTicket.user?.firstName} {selectedTicket.user?.lastName}

{selectedTicket.user?.email}

{selectedTicket.user?.phone && (

{selectedTicket.user?.phone}

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