'use client'; import { useEffect, useState, useRef } from 'react'; import { useParams, useRouter } from 'next/navigation'; import { CheckCircle, Loader2, XCircle } from 'lucide-react'; export default function CarrierAcceptPage() { const params = useParams(); const router = useRouter(); const token = params.token as string; const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [countdown, setCountdown] = useState(5); // Prevent double API calls (React 18 StrictMode issue) const hasCalledApi = useRef(false); useEffect(() => { const acceptBooking = async () => { // Protection contre les doubles appels if (hasCalledApi.current) { return; } hasCalledApi.current = true; if (!token) { setError('Token manquant'); setLoading(false); return; } try { // Appeler l'API backend pour accepter le booking const response = await fetch(`http://localhost:4000/api/v1/csv-booking-actions/accept/${token}`, { method: 'GET', headers: { 'Content-Type': 'application/json', }, }); if (!response.ok) { let errorData; try { errorData = await response.json(); } catch (e) { errorData = { message: `Erreur HTTP ${response.status}` }; } let errorMessage = errorData.message || 'Erreur lors de l\'acceptation du booking'; if (errorMessage.includes('status ACCEPTED') || errorMessage.includes('ACCEPTED')) { errorMessage = 'Ce booking a déjà été accepté.'; } else if (errorMessage.includes('status REJECTED')) { errorMessage = 'Ce booking a déjà été refusé.'; } else if (errorMessage.includes('not found') || errorMessage.includes('Booking not found')) { errorMessage = 'Booking introuvable. Le lien peut avoir expiré.'; } throw new Error(errorMessage); } setLoading(false); // Démarrer le compte à rebours const timer = setInterval(() => { setCountdown((prev) => { if (prev <= 1) { clearInterval(timer); router.push('/'); return 0; } return prev - 1; }); }, 1000); return () => clearInterval(timer); } catch (err) { console.error('Error accepting booking:', err); setError(err instanceof Error ? err.message : 'Erreur lors de l\'acceptation'); setLoading(false); } }; acceptBooking(); }, [token, router]); if (loading) { return (

Traitement en cours...

Nous traitons votre acceptation.

); } if (error) { return (

Erreur

{error}

); } return (

Merci !

✅ Votre acceptation a bien été prise en compte

Nous vous remercions d'avoir accepté cette demande de transport.

Redirection vers la page d'accueil dans {countdown} seconde{countdown > 1 ? 's' : ''}...

); }