import React, { useState } from 'react' import { useNavigate } from 'react-router-dom' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' import { Card } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell, } from '@/components/ui/table' import { Ic } from '@/icons' import { toFa } from '@/lib/utils' import { useTranslation } from '@/i18n' import { formatDateByLanguage } from '@/lib/date-utils' import type { CustomTripOrderItem, CustomTripOrderStatus, CustomTripOriginItem, CustomTripDestinationItem, CustomTripHotelItem, } from '../types' interface CustomTripOrdersTabProps { orders: CustomTripOrderItem[] onOrderUpdated: (updated: CustomTripOrderItem) => void origins?: CustomTripOriginItem[] destinations?: CustomTripDestinationItem[] hotels?: CustomTripHotelItem[] } export function CustomTripOrdersTab({ orders, onOrderUpdated, origins = [], destinations = [], hotels = [], }: CustomTripOrdersTabProps) { const navigate = useNavigate() const { t, language } = useTranslation() const [search, setSearch] = useState('') const [statusFilter, setStatusFilter] = useState('all') const [toastMessage, setToastMessage] = useState(null) const handleOpenReview = (order: CustomTripOrderItem) => { navigate(`/custom-trip/orders/${order.id}`) } const getStatusBadge = (status: CustomTripOrderStatus) => { switch (status) { case 'APPROVED': return ( {t('customTrip.statusApproved')} ) case 'AWAITING_PAYMENT': return ( {t('customTrip.statusAwaitingPayment')} ) case 'PENDING': return ( {t('customTrip.statusPending')} ) case 'REJECTED': return ( {t('customTrip.statusRejected')} ) case 'EXPIRED': return ( {t('customTrip.statusExpired')} ) case 'CANCELLED': return ( {t('customTrip.statusCancelled')} ) default: return ( {status} ) } } const filteredOrders = orders.filter((order) => { const matchesStatus = statusFilter === 'all' || order.status === statusFilter const term = search.trim().toLowerCase() const matchesSearch = !term || order.id.toString().includes(term) || (order.user.fullName && order.user.fullName.toLowerCase().includes(term)) || (order.originCity && order.originCity.toLowerCase().includes(term)) || order.destinations.some((d) => d.toLowerCase().includes(term)) return matchesStatus && matchesSearch }) return (
{/* Toast notification */} {toastMessage && (
{toastMessage}
)} {/* KPI Stats */}
{t('customTrip.allOrdersCount')}
{toFa(orders.length)} {t('customTrip.ordersUnit')}
{t('customTrip.pendingOrdersCount')}
{toFa(orders.filter((o) => o.status === 'PENDING').length)} {t('customTrip.ordersUnit')}
{t('customTrip.approvedOrdersCount')}
{toFa(orders.filter((o) => o.status === 'APPROVED').length)} {t('customTrip.ordersUnit')}
{t('customTrip.awaitingPaymentOrdersCount')}
{toFa(orders.filter((o) => o.status === 'AWAITING_PAYMENT').length)} {t('customTrip.ordersUnit')}
{/* Filter and Action Bar */}
setSearch(e.target.value)} placeholder={t('customTrip.searchOrdersPlaceholder')} className="ps-9 h-10 rounded-xl bg-background border-border/60 text-xs sm:text-sm" />
{/* Status filter chips */}
{t('customTrip.filterByStatus')}:
{/* Orders Table */}
{t('customTrip.rowNumber')} {t('customTrip.orderId')} {t('customTrip.customer')} {t('customTrip.travelRoute')} {t('customTrip.passengers')} {t('customTrip.invoiceAmount')} {t('customTrip.status')} {t('customTrip.createdDate')} {t('customTrip.actions')} {filteredOrders.length === 0 ? ( {t('customTrip.noOrdersFound')} ) : ( filteredOrders.map((order, idx) => ( handleOpenReview(order)} className="hover:bg-muted/40 transition-colors cursor-pointer group" title={t('customTrip.reviewOrder')} > {toFa(idx + 1)} #{toFa(order.id)}
{order.user.fullName || order.user.username}
{order.user.phoneNumber || order.user.email || '—'}
{order.originCity} {order.destinations.map((dest, i) => ( ← {dest} ))} {order.originCity && ( <> ← {order.originCity} )}
{order.legs && order.legs.length > 0 && (
{order.legs .filter((l) => !l.isReturn) .map((l) => `${l.toCity}: ${l.hotelName || '—'} (${toFa(l.stayNights || 1)} شب)`) .join(' | ')}
)}
{toFa(order.adultsCount)} ب {order.childrenCount > 0 && ( <> + {toFa(order.childrenCount)} ک )} {order.infantsCount > 0 && ( <> + {toFa(order.infantsCount)} ن )} {order.finalPrice && Number(order.finalPrice) > 0 ? ( ${toFa(Number(order.finalPrice).toLocaleString())} ) : ( {t('customTrip.pendingInvoiceBadge')} )}
{getStatusBadge(order.status)} {order.factorId && order.status !== 'PENDING' ? ( فاکتور #{toFa(order.factorNumber || order.factorId)} ) : ( {t('customTrip.notInvoicedYetBadge')} )}
{formatDateByLanguage(order.created, language)} e.stopPropagation()}>
)) )}
) }