'use client'; import { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { Eye } from 'lucide-react'; import DataTable from '@/components/ui/DataTable'; import Badge from '@/components/ui/Badge'; import ActionButton from '@/components/ui/ActionButton'; import Modal from '@/components/ui/Modal'; import Pagination from '@/components/ui/Pagination'; import { packagesApi } from '@/lib/api'; import { formatDateTime, formatCurrency } from '@/lib/utils'; import { getErrorMessage } from '@/lib/api-client'; const Field = ({ label, value, mono = false, truncate = false }: { label: string; value: string; mono?: boolean; truncate?: boolean }) => (

{label}

{value || '—'}

); const SectionHeader = ({ title }: { title: string }) => (

{title}

); export default function PackageBookingsPage() { const [filters, setFilters] = useState({ packageId: '', status: '', page: 1, pageSize: 20 }); const [selected, setSelected] = useState(null); const { data: rawData, isLoading, error } = useQuery({ queryKey: ['package-bookings', filters], queryFn: () => packagesApi.getBookings(filters), }); // Unwrap in case the interceptor double-wraps: { data: { items, ... } } or { items, ... } const data: any = (rawData as any)?.items ? rawData : (rawData as any)?.data ?? rawData; const { data: packagesData } = useQuery({ queryKey: ['packages-all-simple'], queryFn: () => packagesApi.getAll({ pageSize: 100 }), }); const packages: any[] = packagesData?.items || []; const columns = [ { key: 'bookingRef', label: 'Reference', sortable: true, render: (b: any) => (
{b.bookingRef} PKG
{b.package?.name}
), }, { key: 'tier', label: 'Tier', render: (b: any) => b.priceTier ? (
{b.priceTier.label}
{b.priceTier.seatType}
) : , }, { key: 'passengers', label: 'Passengers', render: (b: any) => (
{b.passengerCount}
{b.contactPhone || b.contactEmail || '—'}
), }, { key: 'payment', label: 'Payment', render: (b: any) => (
{b.paymentIntent?.status || 'PENDING'}
{formatCurrency(b.totalMinor, b.currency || 'ETB')}
), }, { key: 'status', label: 'Status', render: (b: any) => {b.status}, }, { key: 'createdAt', label: 'Booked At', render: (b: any) => {formatDateTime(b.createdAt)}, }, ]; const actions = [ { label: 'View', onClick: (b: any) => setSelected(b), variant: 'secondary' as const, icon: Eye }, ]; return (

Package Bookings

All bookings made through travel packages

{error && (
Error: {getErrorMessage(error)}
)}
{data?.totalPages > 1 && ( setFilters({ ...filters, page })} /> )}
setSelected(null)} title="Package Booking Details" size="xl"> {selected && (() => { const b = selected; return (

Booking Reference

{b.bookingRef}

{b.status}

{formatDateTime(b.createdAt)}

{[b.package?.name, b.priceTier?.label, `${b.passengerCount} passenger${b.passengerCount !== 1 ? 's' : ''}`].filter(Boolean).map((tag) => ( {tag} ))}

Total Amount

{formatCurrency(b.totalMinor, b.currency || 'ETB')}

{b.displayCurrency && b.displayCurrency !== (b.currency || 'ETB') && (

≈ {formatCurrency(b.displayTotalMinor ?? b.totalMinor, b.displayCurrency)}

)}

Payment Status

{b.paymentIntent?.status || 'PENDING'}
{b.passengers?.length > 0 && (
{b.passengers.map((p: any, i: number) => { const isChild = i >= (b.adultCount ?? b.passengerCount); return (
{i + 1}

{p.passengerName}

{p.dateOfBirth ? new Date(p.dateOfBirth).toLocaleDateString() : ''} {p.idDocumentType ? ` · ${p.idDocumentType}` : ''} {p.passportNumber ? ` · ${p.passportNumber}` : ''}

{isChild ? 'CHILD' : 'ADULT'}
); })}
)}
setSelected(null)}>Close
); })()}
); }