'use client'; import { motion } from 'framer-motion'; import { ChevronUp, ChevronDown, Eye, Loader2 } from 'lucide-react'; import { OrderRecord } from '@/src/types'; interface OrdersTableProps { orders: OrderRecord[]; isLoading?: boolean; onViewDetails: (order: OrderRecord) => void; totalCount: number; currentPage: number; pageSize: number; onPageChange: (page: number) => void; onPageSizeChange: (size: number) => void; onSort: (key: keyof OrderRecord) => void; sortKey: keyof OrderRecord | null; sortOrder: 'asc' | 'desc'; } export function OrdersTable({ orders, isLoading = false, onViewDetails, totalCount, currentPage, pageSize, onPageChange, onPageSizeChange, onSort, sortKey, sortOrder, }: OrdersTableProps) { const totalPages = Math.ceil(totalCount / pageSize); const getStatusBadgeClass = (status: string) => { switch (status) { case 'pending': return 'bg-gradient-to-r from-muted-gold/20 to-orange-400/20 text-muted-gold border border-muted-gold/30'; case 'paid': return 'bg-gradient-to-r from-maritime-teal/20 to-teal-400/20 text-maritime-teal border border-maritime-teal/30'; case 'fulfilled': return 'bg-gradient-to-r from-sea-green/20 to-green-400/20 text-sea-green border border-sea-green/30'; case 'cancelled': return 'bg-gradient-to-r from-red-500/20 to-red-400/20 text-red-600 border border-red-500/30'; default: return 'bg-gray-100 text-gray-700 border border-gray-300'; } }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', }); }; const formatCurrency = (amount: string, currency: string = 'USD') => { const numAmount = parseFloat(amount) / 100; return new Intl.NumberFormat('en-US', { style: 'currency', currency: currency || 'USD', }).format(numAmount); }; const getSortIcon = (column: keyof OrderRecord) => { if (sortKey !== column) { return ; } return sortOrder === 'asc' ? ( ) : ( ); }; if (isLoading) { return (
); } if (orders.length === 0) { return (
📦

No Orders Found

There are no orders matching your criteria.

); } return (
{/* Table */}
{orders.map((order, index) => ( ))}
onSort('orderId')} className="px-6 py-4 text-left text-xs font-semibold text-deep-sea-blue uppercase tracking-wider cursor-pointer hover:bg-gray-100 transition-colors" >
Order ID {getSortIcon('orderId')}
onSort('customerName')} className="px-6 py-4 text-left text-xs font-semibold text-deep-sea-blue uppercase tracking-wider cursor-pointer hover:bg-gray-100 transition-colors" >
Customer {getSortIcon('customerName')}
onSort('totalAmount')} className="px-6 py-4 text-left text-xs font-semibold text-deep-sea-blue uppercase tracking-wider cursor-pointer hover:bg-gray-100 transition-colors" >
Amount {getSortIcon('totalAmount')}
onSort('co2Tons')} className="px-6 py-4 text-left text-xs font-semibold text-deep-sea-blue uppercase tracking-wider cursor-pointer hover:bg-gray-100 transition-colors" >
COâ‚‚ Offset {getSortIcon('co2Tons')}
onSort('status')} className="px-6 py-4 text-left text-xs font-semibold text-deep-sea-blue uppercase tracking-wider cursor-pointer hover:bg-gray-100 transition-colors" >
Status {getSortIcon('status')}
onSort('CreatedAt')} className="px-6 py-4 text-left text-xs font-semibold text-deep-sea-blue uppercase tracking-wider cursor-pointer hover:bg-gray-100 transition-colors" >
Created {getSortIcon('CreatedAt')}
Actions
{order.orderId ? `${order.orderId.substring(0, 8)}...` : 'N/A'}
{order.customerName}
{order.customerEmail}
{formatCurrency(order.totalAmount, order.currency)}
{parseFloat(order.co2Tons).toFixed(2)} tons {order.status ? order.status.charAt(0).toUpperCase() + order.status.slice(1) : 'Unknown'} {formatDate(order.CreatedAt)}
{/* Pagination */}
Rows per page:
Showing {(currentPage - 1) * pageSize + 1} to{' '} {Math.min(currentPage * pageSize, totalCount)} of {totalCount} orders
{Array.from({ length: Math.min(totalPages, 5) }).map((_, i) => { let pageNumber; if (totalPages <= 5) { pageNumber = i + 1; } else if (currentPage <= 3) { pageNumber = i + 1; } else if (currentPage >= totalPages - 2) { pageNumber = totalPages - 4 + i; } else { pageNumber = currentPage - 2 + i; } if (pageNumber < 1 || pageNumber > totalPages) return null; return ( ); })}
); }