'use client'; import { useEffect, useState } from 'react'; import { useParams, useRouter } from 'next/navigation'; import { ArrowLeft, Package, MapPin, Calendar, DollarSign, FileText, Download, CheckCircle, XCircle, Clock, Truck, Weight, Box } from 'lucide-react'; interface BookingDocument { id: string; type: string; fileName: string; url: string; } interface BookingDetails { id: string; bookingId?: string; carrierName: string; carrierEmail: string; origin: string; destination: string; volumeCBM: number; weightKG: number; palletCount: number; priceUSD: number; priceEUR: number; primaryCurrency: string; transitDays: number; containerType: string; status: 'PENDING' | 'ACCEPTED' | 'REJECTED'; documents: BookingDocument[]; notes?: string; requestedAt: string; respondedAt?: string; rejectionReason?: string; } export default function CarrierBookingDetailPage() { const params = useParams(); const router = useRouter(); const bookingId = params.id as string; const [booking, setBooking] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchBookingDetails = async () => { try { const token = localStorage.getItem('carrier_access_token'); if (!token) { setError('Non autorisé - veuillez vous connecter'); setLoading(false); return; } const response = await fetch(`http://localhost:4000/api/v1/csv-bookings/${bookingId}`, { headers: { 'Authorization': `Bearer ${token}`, }, }); if (!response.ok) { throw new Error(`Erreur ${response.status}: ${response.statusText}`); } const data = await response.json(); setBooking(data); } catch (err) { console.error('Error fetching booking:', err); setError(err instanceof Error ? err.message : 'Erreur lors du chargement'); } finally { setLoading(false); } }; if (bookingId) { fetchBookingDetails(); } }, [bookingId]); const getStatusBadge = (status: string) => { switch (status) { case 'ACCEPTED': return ( Accepté ); case 'REJECTED': return ( Refusé ); case 'PENDING': return ( En attente ); default: return null; } }; const formatPrice = (price: number, currency: string) => { return new Intl.NumberFormat('fr-FR', { style: 'currency', currency: currency, }).format(price); }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('fr-FR', { day: 'numeric', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit', }); }; if (loading) { return (

Chargement des détails...

); } if (error || !booking) { return (

Erreur

{error || 'Réservation introuvable'}

); } return (
{/* Header */}

Détails de la Réservation

Référence: {booking.bookingId || booking.id}

{getStatusBadge(booking.status)}
{/* Route Information */}

Itinéraire

Origine

{booking.origin}

{booking.transitDays} jours de transit

Destination

{booking.destination}

{/* Shipment Details */}

Détails de la Marchandise

Volume

{booking.volumeCBM} CBM

Poids

{booking.weightKG} kg

Palettes

{booking.palletCount || 'N/A'}

Type

{booking.containerType}

{/* Pricing */}

Prix

Prix total

{formatPrice( booking.primaryCurrency === 'USD' ? booking.priceUSD : booking.priceEUR, booking.primaryCurrency )}

{booking.primaryCurrency === 'USD' && booking.priceEUR > 0 && (

Équivalent EUR

{formatPrice(booking.priceEUR, 'EUR')}

)} {booking.primaryCurrency === 'EUR' && booking.priceUSD > 0 && (

Équivalent USD

{formatPrice(booking.priceUSD, 'USD')}

)}
{/* Documents */} {booking.documents && booking.documents.length > 0 && (

Documents ({booking.documents.length})

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

{doc.fileName}

{doc.type}

Télécharger
))}
)} {/* Notes */} {booking.notes && (

📝 Notes

{booking.notes}

)} {/* Rejection Reason */} {booking.status === 'REJECTED' && booking.rejectionReason && (

❌ Raison du refus

{booking.rejectionReason}

)} {/* Timeline */}

Chronologie

Demande reçue

{formatDate(booking.requestedAt)}

{booking.respondedAt && (

{booking.status === 'ACCEPTED' ? 'Acceptée' : 'Refusée'}

{formatDate(booking.respondedAt)}

)}
{/* Actions */}
); }