/** * Public Booking Rejection Page * * Allows carriers to reject booking requests via email link * Route: /booking/reject/:token */ 'use client'; import { useState, useEffect } from 'react'; import { useParams } from 'next/navigation'; import { useTranslations } from 'next-intl'; import { rejectCsvBooking, type CsvBookingResponse } from '@/lib/api/bookings'; export default function BookingRejectPage() { const params = useParams(); const token = params.token as string; const t = useTranslations('bookingPortal.reject'); const tCommon = useTranslations('bookingPortal.common'); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [booking, setBooking] = useState(null); const [isRejecting, setIsRejecting] = useState(false); const [hasRejected, setHasRejected] = useState(false); const [reason, setReason] = useState(''); const [showReasonField, setShowReasonField] = useState(false); useEffect(() => { if (!token) { setError(t('tokenInvalid')); setIsLoading(false); return; } setIsLoading(false); }, [token, t]); const handleReject = async () => { if (!token) return; setIsRejecting(true); setError(null); try { const result = await rejectCsvBooking(token, reason || undefined); setBooking(result); setHasRejected(true); } catch (err) { console.error('Rejection error:', err); if (err instanceof Error) { setError(err.message); } else { setError(t('errorGeneric')); } } finally { setIsRejecting(false); } }; if (isLoading) { return (

{t('loading')}

); } if (error) { return (

{t('errorTitle')}

{error}

{t('errorReasonsTitle')}

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

{t('errorContact')}

); } if (hasRejected && booking) { return (

{t('rejectedTitle')}

{t('rejectedHeadline')}

{t('rejectedBody')}

{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.proposedPrice')} {booking.primaryCurrency === 'USD' ? `$${booking.priceUSD.toLocaleString()}` : `€${booking.priceEUR.toLocaleString()}` }
{reason && (

{t('labels.rejectionReason')}

{reason}

)}

{t('infoTitle')}

{t('infoBody')}

{tCommon('supportPrompt')}

support@xpeditis.com
); } return (

{t('formTitle')}

{t('formIntro')}

{!showReasonField ? ( ) : (