/** * Public Booking Confirmation Page * * Allows carriers to accept booking requests via email link * Route: /booking/confirm/:token */ 'use client'; import { useState, useEffect } from 'react'; import { useParams, useRouter } from 'next/navigation'; import { acceptCsvBooking, type CsvBookingResponse } from '@/lib/api/bookings'; export default function BookingConfirmPage() { const params = useParams(); const router = useRouter(); const token = params.token as string; const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [booking, setBooking] = useState(null); const [isAccepting, setIsAccepting] = useState(false); useEffect(() => { if (!token) { setError('Token de confirmation invalide'); setIsLoading(false); return; } // Auto-accept the booking handleAccept(); }, [token]); const handleAccept = async () => { setIsAccepting(true); setError(null); try { const result = await acceptCsvBooking(token); setBooking(result); } catch (err) { console.error('Acceptance error:', err); if (err instanceof Error) { setError(err.message); } else { setError('Une erreur est survenue lors de l\'acceptation'); } } finally { setIsLoading(false); setIsAccepting(false); } }; if (isLoading) { return (

Confirmation en cours...

); } if (error) { return (

Erreur de confirmation

{error}

Raisons possibles :

  • Le lien a expiré
  • La demande a déjà été acceptée ou refusée
  • Le token de confirmation est invalide

Si vous pensez qu'il s'agit d'une erreur, veuillez contacter le client directement.

); } if (!booking) { return null; } return (
{/* Success Icon with Animation */}
{/* Animated rings */}

Demande acceptée !

Merci d'avoir accepté cette demande de transport.

Le client a été notifié par email.

{/* Booking Summary */}

Récapitulatif de la réservation

ID Réservation {booking.bookingId}
Trajet {booking.origin} → {booking.destination}
Volume {booking.volumeCBM} CBM
Poids {booking.weightKG} kg
Palettes {booking.palletCount}
Type de conteneur {booking.containerType}
Temps de transit {booking.transitDays} jours
Prix
{booking.primaryCurrency === 'USD' ? `$${booking.priceUSD.toLocaleString()}` : `€${booking.priceEUR.toLocaleString()}` }
{booking.primaryCurrency === 'USD' ? `(€${booking.priceEUR.toLocaleString()})` : `($${booking.priceUSD.toLocaleString()})` }
{booking.notes && (

Notes :

{booking.notes}

)}
{/* Next Steps */}

Prochaines étapes

  • Le client va finaliser les détails du conteneur
  • Vous recevrez un email avec les documents nécessaires
  • Le paiement sera traité selon vos conditions habituelles
{/* Documents Section */} {booking.documents && booking.documents.length > 0 && (

Documents fournis

{booking.documents.map((doc, index) => (

{doc.fileName}

{doc.type}

Télécharger
))}
)} {/* Contact Info */}

Pour toute question, contactez-nous à

support@xpeditis.com
); }