'use client' import { useEffect, useState } from 'react' import Link from 'next/link' import { useRouter } from 'next/navigation' import { formatCurrency } from '@rentaldrivego/types' import { apiFetch } from '@/lib/api' import { useDashboardI18n } from '@/components/I18nProvider' interface ReservationRow { id: string status: string source: string startDate: string endDate: string totalAmount: number totalDays: number contractNumber?: string | null workflow?: { contractGenerated: boolean closed: boolean coreEditable: boolean returnEditable: boolean } vehicle: { make: string; model: string } customer: { firstName: string; lastName: string; email: string } } interface VehicleRow { id: string } export default function ReservationsPage() { const { dict, language } = useDashboardI18n() const router = useRouter() const r = dict.reservations const localeCode = language === 'fr' ? 'fr-FR' : language === 'ar' ? 'ar-MA' : 'en-US' const [rows, setRows] = useState([]) const [loadError, setLoadError] = useState(null) const [actionError, setActionError] = useState(null) const [checkingNewReservation, setCheckingNewReservation] = useState(false) const [showNoVehiclesModal, setShowNoVehiclesModal] = useState(false) useEffect(() => { apiFetch('/reservations?pageSize=100') .then((result) => setRows(result ?? [])) .catch((err) => setLoadError(err.message)) }, []) const formatDate = (iso: string) => new Date(iso).toLocaleDateString(localeCode, { month: 'short', day: 'numeric' }) const formatDateYear = (iso: string) => new Date(iso).toLocaleDateString(localeCode, { month: 'short', day: 'numeric', year: 'numeric' }) const reservationActionLabel = (row: ReservationRow) => { if (row.workflow?.returnEditable) { return language === 'fr' ? 'Retour / clôture' : language === 'ar' ? 'الإرجاع / الإغلاق' : 'Return / close' } if (row.workflow?.coreEditable) { return language === 'fr' ? 'Modifier la réservation' : language === 'ar' ? 'تعديل الحجز' : 'Edit reservation' } return language === 'fr' ? 'Voir la réservation' : language === 'ar' ? 'عرض الحجز' : 'View reservation' } const noVehiclesMessage = language === 'fr' ? 'Ajoutez au moins un véhicule à votre flotte avant de créer une réservation.' : language === 'ar' ? 'أضف مركبة واحدة على الأقل إلى الأسطول قبل إنشاء حجز.' : 'Add at least one vehicle to your fleet before creating a reservation.' async function handleNewReservationClick() { setActionError(null) setCheckingNewReservation(true) try { const vehicles = await apiFetch('/vehicles?pageSize=1') if (!vehicles || vehicles.length === 0) { setShowNoVehiclesModal(true) return } router.push('/reservations/new') } catch (err: any) { setActionError(err.message ?? ( language === 'fr' ? 'Impossible de vérifier la flotte avant de créer la réservation.' : language === 'ar' ? 'تعذر التحقق من الأسطول قبل إنشاء الحجز.' : 'Failed to verify fleet before creating the reservation.' )) } finally { setCheckingNewReservation(false) } } function handleAddCar() { setShowNoVehiclesModal(false) router.push('/fleet?modal=add-car') } return (

{r.heading}

{r.subtitle}

{actionError ?
{actionError}
: null}
{loadError ? (
{loadError}
) : (
{rows.map((row) => ( ))} {rows.length === 0 && ( )}
{r.colCustomer} {r.colVehicle} {r.colDates} {r.colSource} {r.colStatus} {r.colTotal}
{row.customer.firstName} {row.customer.lastName}

{row.customer.email}

{reservationActionLabel(row)}
{row.vehicle.make} {row.vehicle.model} {formatDate(row.startDate)} - {formatDateYear(row.endDate)} {row.source} {row.status} {formatCurrency(row.totalAmount, 'MAD')}
{r.noReservations}
)}
{showNoVehiclesModal ? (
{ if (event.target === event.currentTarget) setShowNoVehiclesModal(false) }} >

{language === 'fr' ? 'Ajouter un véhicule' : language === 'ar' ? 'أضف مركبة' : 'Add a car'}

{noVehiclesMessage}

) : null}
) }