'use client'; import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Download, Eye, Trash2 } from 'lucide-react'; import DataTable from '@/components/ui/DataTable'; import Badge from '@/components/ui/Badge'; import Pagination from '@/components/ui/Pagination'; import ActionButton from '@/components/ui/ActionButton'; import Modal from '@/components/ui/Modal'; import ConfirmDialog from '@/components/ui/ConfirmDialog'; import { passengersApi, apiClient } from '@/lib/api'; import { formatDate, formatDateTime } from '@/lib/utils'; import { PassengerFilters } from '@/types'; export default function PassengersPage() { const [filters, setFilters] = useState({ page: 1, pageSize: 20, search: '', role: 'PASSENGER', }); const [selectedPassenger, setSelectedPassenger] = useState(null); const [deleteConfirm, setDeleteConfirm] = useState<{ isOpen: boolean; passenger: any | null }>({ isOpen: false, passenger: null }); const queryClient = useQueryClient(); const deleteMutation = useMutation({ mutationFn: (id: string) => apiClient.delete(`/passengers/${id}`), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['passengers'] }); }, }); const handleDelete = (passenger: any) => { setDeleteConfirm({ isOpen: true, passenger }); }; const confirmDelete = async () => { if (deleteConfirm.passenger) { await deleteMutation.mutateAsync(deleteConfirm.passenger.id); setDeleteConfirm({ isOpen: false, passenger: null }); } }; const { data, isLoading, error } = useQuery({ queryKey: ['passengers', filters], queryFn: () => passengersApi.getAll(filters), }); if (error) { console.error('Passengers API Error:', error); } const columns = [ { key: 'fullName', label: 'Name', sortable: true, render: (passenger: any) => (
{passenger.fullName}
{passenger.email}
), }, { key: 'phone', label: 'Phone', render: (passenger: any) => passenger.phone, }, { key: 'nationalId', label: 'National ID', render: (passenger: any) => passenger.nationalId || 'N/A', }, { key: 'dateOfBirth', label: 'Date of Birth', render: (passenger: any) => passenger.dateOfBirth ? formatDate(passenger.dateOfBirth) : 'N/A', }, { key: 'verified', label: 'Status', render: (passenger: any) => ( {passenger.nationalId ? 'Verified' : 'Unverified'} ), }, ]; const actions = [ { label: 'View Details', onClick: (passenger: any) => setSelectedPassenger(passenger), variant: 'secondary' as const, icon: Eye, }, { label: 'Delete', onClick: handleDelete, variant: 'danger' as const, icon: Trash2, }, ]; return (

Passengers

Manage passenger profiles and verification

Export
{error && (
Error loading passengers: {error instanceof Error ? error.message : 'Unknown error'}
)}
setFilters({ ...filters, search: e.target.value, page: 1 })} />
{data?.meta && ( setFilters({ ...filters, page })} /> )}
{/* Delete Confirmation */} setDeleteConfirm({ isOpen: false, passenger: null })} onConfirm={confirmDelete} title="Delete Passenger" message={`Are you sure you want to delete ${deleteConfirm.passenger?.fullName}?`} confirmText="Delete" isDanger={true} warning="This passenger may have active bookings, loyalty points, and wallet balance. Deleting will impact these systems and records." /> {/* Passenger Details Modal */} setSelectedPassenger(null)} title="Passenger Details" size="xl" > {selectedPassenger && (
{/* Personal Information */}

Personal Information

{selectedPassenger.fullName}

{selectedPassenger.dateOfBirth ? formatDate(selectedPassenger.dateOfBirth) : 'N/A'}

{selectedPassenger.gender || 'N/A'}

{selectedPassenger.nationality || 'N/A'}


{/* Contact Information */}

Contact Information

{selectedPassenger.email || 'N/A'}

{selectedPassenger.phone || 'N/A'}


{/* Identification */}

Identification

{selectedPassenger.nationalId || 'N/A'}

{selectedPassenger.passportNumber || 'N/A'}

{selectedPassenger.passportCountry || 'N/A'}

{selectedPassenger.nationalId ? 'Verified' : 'Unverified'}

{/* Account Information */}

Account Information

{selectedPassenger.id}

{selectedPassenger.userId || 'N/A'}

{/* Loyalty & Wallet (if available) */} {(selectedPassenger.loyalty || selectedPassenger.wallet) && ( <>
{selectedPassenger.loyalty && (

Loyalty Account

{selectedPassenger.loyalty.tier || 'N/A'}

{selectedPassenger.loyalty.pointsBalance || 0}

)} {selectedPassenger.wallet && (

Wallet

{(selectedPassenger.wallet.balanceMinor / 100).toFixed(2)} {selectedPassenger.wallet.currency}

)}
)}
{/* Timestamps */}

Timestamps

{selectedPassenger.createdAt ? formatDateTime(selectedPassenger.createdAt) : 'N/A'}

{selectedPassenger.updatedAt ? formatDateTime(selectedPassenger.updatedAt) : 'N/A'}

setSelectedPassenger(null)} > Close
)}
); }