import { useState, useEffect, useCallback } from 'react' import { myGainsApi } from '../services/game' import UserNav from '../components/UserNav' import { useHandleAuthError } from '../hooks/useHandleAuthError' function formatDate(dateStr) { const date = new Date(dateStr) const dateLabel = date.toLocaleDateString('fr-FR', { day: '2-digit', month: 'long', year: 'numeric' }) const timeLabel = date.toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' }) return `${dateLabel} à ${timeLabel}` } function timeAgo(dateStr) { const diff = Date.now() - new Date(dateStr).getTime() const minutes = Math.floor(diff / 60000) const hours = Math.floor(diff / 3600000) const days = Math.floor(diff / 86400000) if (minutes < 1) return "À l'instant" if (minutes < 60) return `Il y a ${minutes} min` if (hours < 24) return `Il y a ${hours}h` if (days < 7) return `Il y a ${days}j` return null } const CLAIM_STATUS = { PENDING: { label: 'En attente de remise', classes: 'bg-yellow-100 text-yellow-700' }, DELIVERED: { label: 'Lot remis', classes: 'bg-green-100 text-green-700' }, CANCELLED: { label: 'Expiré', classes: 'bg-gray-100 text-gray-500' }, } export default function MesGains() { const handleAuthError = useHandleAuthError() const [gains, setGains] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [refreshing, setRefreshing] = useState(false) const fetchGains = useCallback(async (isRefresh = false) => { if (isRefresh) setRefreshing(true) else setLoading(true) setError('') try { const data = await myGainsApi() setGains(data.gains) } catch (err) { if (!handleAuthError(err)) setError(err.message) } finally { setLoading(false) setRefreshing(false) } }, [handleAuthError]) useEffect(() => { const loadGains = async () => { try { const data = await myGainsApi() setGains(data.gains) } catch (err) { if (!handleAuthError(err)) setError(err.message) } finally { setLoading(false) } } loadGains() }, [handleAuthError]) return (

Historique de mes gains

{loading &&

Chargement…

} {error && (
{error}
)} {!loading && !error && gains.length === 0 && (

Aucun gain pour le moment.

Saisissez un code pour participer !

)}
{gains.map((gain, index) => { const statusCfg = CLAIM_STATUS[gain.claimStatus] ?? CLAIM_STATUS.PENDING return (
{index < gains.length - 1 &&
}

{gain.lot}

{statusCfg.label}

{gain.description}

{gain.value && (

Valeur : {gain.value} €

)}

Gagné le {formatDate(gain.wonAt)}

{timeAgo(gain.wonAt) && ( {timeAgo(gain.wonAt)} )}

Code utilisé :{' '} {gain.ticketCode}

) })}
) }