import { useState } from 'react' import { searchTicketApi, deliverClaimApi } from '../services/employee' import { useHandleAuthError } from '../hooks/useHandleAuthError' function formatDate(dateStr) { return new Date(dateStr).toLocaleDateString('fr-FR', { day: '2-digit', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit', }) } const STATUS_CONFIG = { PENDING: { label: 'À remettre', classes: 'bg-yellow-100 text-yellow-800' }, DELIVERED: { label: 'Déjà remis', classes: 'bg-green-100 text-green-800' }, CANCELLED: { label: 'Expiré', classes: 'bg-gray-100 text-gray-500' }, } export default function Employe() { const handleAuthError = useHandleAuthError() const [code, setCode] = useState('') const [result, setResult] = useState(null) const [searching, setSearching] = useState(false) const [delivering, setDelivering] = useState(false) const [searchError, setSearchError] = useState('') const [deliverError, setDeliverError] = useState('') const [success, setSuccess] = useState(false) const handleSearch = async (e) => { e.preventDefault() setResult(null) setSuccess(false) setDeliverError('') setSearchError('') setSearching(true) try { const data = await searchTicketApi(code.trim()) setResult(data) } catch (err) { if (!handleAuthError(err)) setSearchError(err.message) } finally { setSearching(false) } } const handleDeliver = async () => { if (!result?.claim?.id) return setDeliverError('') setDelivering(true) try { await deliverClaimApi(result.claim.id) setResult((prev) => ({ ...prev, claim: { ...prev.claim, status: 'DELIVERED', claimedAt: new Date().toISOString() }, })) setSuccess(true) } catch (err) { if (!handleAuthError(err)) setDeliverError(err.message) } finally { setDelivering(false) } } const handleReset = () => { setCode('') setResult(null) setSuccess(false) setSearchError('') setDeliverError('') } const statusCfg = result ? (STATUS_CONFIG[result.claim?.status] ?? STATUS_CONFIG.PENDING) : null return (
{/* En-tête */}

Espace Employé

Recherchez un code ticket pour remettre le lot au client.

{/* Formulaire de recherche */}
setCode(e.target.value.toUpperCase())} required placeholder="Code ticket (10 caractères)" maxLength={10} className="flex-1 min-w-0 border border-gray-300 rounded-lg px-4 py-3 text-sm font-mono uppercase tracking-widest focus:outline-none focus:ring-2 focus:ring-[#006B6B] focus:border-[#006B6B]" />
{/* Erreur de recherche */} {searchError && (
{searchError}
)} {/* Résultat */} {result && (
{/* Bandeau succès remise */} {success && (

Lot remis avec succès — espace client mis à jour.

)} {/* En-tête carte : lot + statut */}

{result.lot.name}

{result.lot.description}

{result.lot.value && (

Valeur : {result.lot.value} €

)}
{statusCfg.label}
{/* Infos client */}

Client

{(result.client.firstname?.[0] ?? '?').toUpperCase()}{(result.client.lastname?.[0] ?? '?').toUpperCase()}

{result.client.firstname} {result.client.lastname}

{result.client.email}

{/* Infos ticket */}

Ticket

Code :{' '} {result.ticket.code}

Utilisé le : {formatDate(result.ticket.usedAt)}

{result.claim.claimedAt && (

Remis le : {formatDate(result.claim.claimedAt)}

)}
{/* Actions */}
{deliverError && (
{deliverError}
)} {result.claim.status === 'PENDING' && !success && ( )} {result.claim.status === 'CANCELLED' && (
Ce gain est expiré et ne peut plus être remis.
)}
)}
) }