'use client'; import { useLocale, useTranslations } from 'next-intl'; import { CreditCard, Pencil } from 'lucide-react'; import { Link } from '@/i18n/navigation'; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Callout } from '@/components/ui/callout'; import { BookingStatusBadge } from './BookingStatusBadge'; /** * Detail d'une reservation. * * Extrait de la page de liste, ou il etait ecrit en ligne avec une superposition * maison sans focus trap ni fermeture au clavier. */ interface BookingDetailDialogProps { booking: any | null; onOpenChange: (open: boolean) => void; buildEditUrl: (booking: any) => string; /** Namespace de la vue appelante, pour que le titre suive l'onglet. */ namespace?: string; } export function BookingDetailDialog({ booking, onOpenChange, buildEditUrl, namespace = 'dashboard.bookingsList', }: BookingDetailDialogProps) { const t = useTranslations(namespace as any); const locale = useLocale(); const dateLocale = locale === 'fr' ? 'fr-FR' : 'en-US'; if (!booking) return null; const longDate = (value?: string) => value ? new Date(value).toLocaleDateString(dateLocale, { day: '2-digit', month: 'long', year: 'numeric', }) : 'N/A'; const reference = booking.bookingId ? `#${booking.bookingId}` : `#${booking.id?.slice(0, 8).toUpperCase()}`; return ( ); } function Field({ label, children, emphasis = false, }: { label: string; children: React.ReactNode; emphasis?: boolean; }) { return (