/** * 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 { rejectCsvBooking, type CsvBookingResponse } from '@/lib/api/bookings'; export default function BookingRejectPage() { const params = useParams(); const token = params.token as string; 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('Token de refus invalide'); setIsLoading(false); return; } // Just validate the token exists, don't auto-reject setIsLoading(false); }, [token]); 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('Une erreur est survenue lors du refus'); } } finally { setIsRejecting(false); } }; if (isLoading) { return (

Chargement...

); } if (error) { return (

Erreur de refus

{error}

Raisons possibles :

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

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

); } // After successful rejection if (hasRejected && booking) { return (
{/* Rejection Icon with Animation */}

Demande refusée

Vous avez refusé cette demande de transport.

Le client a été notifié par email.

{/* Booking Summary */}

Récapitulatif de la demande refusée

ID Réservation {booking.bookingId}
Trajet {booking.origin} → {booking.destination}
Volume {booking.volumeCBM} CBM
Poids {booking.weightKG} kg
Prix proposé {booking.primaryCurrency === 'USD' ? `$${booking.priceUSD.toLocaleString()}` : `€${booking.priceEUR.toLocaleString()}` }
{reason && (

Raison du refus :

{reason}

)}
{/* Info Message */}

Information

Le client pourra soumettre une nouvelle demande avec des conditions différentes si nécessaire.

{/* Contact Info */}

Pour toute question, contactez-nous à

support@xpeditis.com
); } // Initial rejection form return (
{/* Warning Icon */}

Refuser cette demande

Vous êtes sur le point de refuser cette demande de transport.

{/* Optional Reason Field */}
{!showReasonField ? ( ) : (