/** * Public Booking Confirmation Page * * Allows carriers to accept booking requests via email link * Route: /booking/confirm/:token */ 'use client'; import { useState, useEffect, useCallback } from 'react'; import { useParams } from 'next/navigation'; import { useTranslations } from 'next-intl'; import { acceptCsvBooking, type CsvBookingResponse } from '@/lib/api/bookings'; export default function BookingConfirmPage() { const params = useParams(); const token = params.token as string; const t = useTranslations('bookingPortal.confirm'); const tCommon = useTranslations('bookingPortal.common'); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [booking, setBooking] = useState(null); const handleAccept = useCallback(async () => { 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(t('errorGeneric')); } } finally { setIsLoading(false); } }, [token, t]); useEffect(() => { if (!token) { setError(t('tokenInvalid')); setIsLoading(false); return; } handleAccept(); }, [token, handleAccept, t]); if (isLoading) { return (

{t('loading')}

); } if (error) { return (

{t('errorTitle')}

{error}

{t('errorReasonsTitle')}

  • {t('errorReason1')}
  • {t('errorReason2')}
  • {t('errorReason3')}

{t('errorContact')}

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

{t('successTitle')}

{t('successHeadline')}

{t('successBody')}

{/* Booking Summary */}

{t('summaryTitle')}

{t('labels.bookingId')} {booking.bookingId}
{t('labels.route')} {booking.origin} → {booking.destination}
{t('labels.volume')} {booking.volumeCBM} CBM
{t('labels.weight')} {booking.weightKG} kg
{t('labels.pallets')} {booking.palletCount}
{t('labels.containerType')} {booking.containerType}
{t('labels.transitDays')} {t('transitDaysValue', { count: booking.transitDays })}
{t('labels.price')}
{booking.primaryCurrency === 'USD' ? `$${booking.priceUSD.toLocaleString()}` : `€${booking.priceEUR.toLocaleString()}` }
{booking.primaryCurrency === 'USD' ? `(€${booking.priceEUR.toLocaleString()})` : `($${booking.priceUSD.toLocaleString()})` }
{booking.notes && (

{t('labels.notes')}

{booking.notes}

)}
{/* Next Steps */}

{t('nextStepsTitle')}

  • {t('nextStep1')}
  • {t('nextStep2')}
  • {t('nextStep3')}
{/* Documents Section */} {booking.documents && booking.documents.length > 0 && (

{t('labels.documents')}

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

{doc.fileName}

{doc.type}

{t('labels.download')}
))}
)} {/* Contact Info */}

{tCommon('supportPrompt')}

support@xpeditis.com
); }