"use client"; import { useState, useMemo } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Search, Filter, Eye, ChevronLeft, ChevronRight } from "lucide-react"; import { List } from 'react-window'; import OrderDetailsModal from "./OrderDetailsModal"; interface Order { orderId: string | number; userId: string; total: number; createdAt: string; status: string; items: Array<{ name: string; quantity: number; }>; vendorUsername?: string; } interface OrdersTableProps { orders: Order[]; /** * Enable order details modal (admin-only feature) * @default true */ enableModal?: boolean; } const getStatusStyle = (status: string) => { switch (status) { case 'acknowledged': return 'bg-purple-500/10 text-purple-500 border-purple-500/20'; case 'paid': return 'bg-emerald-500/10 text-emerald-500 border-emerald-500/20'; case 'shipped': return 'bg-blue-500/10 text-blue-500 border-blue-500/20'; case 'completed': return 'bg-green-500/10 text-green-500 border-green-500/20'; case 'cancelled': return 'bg-red-500/10 text-red-500 border-red-500/20'; case 'unpaid': return 'bg-yellow-500/10 text-yellow-500 border-yellow-500/20'; case 'confirming': return 'bg-orange-500/10 text-orange-500 border-orange-500/20'; default: return 'bg-gray-500/10 text-gray-500 border-gray-500/20'; } }; /** * Admin-only orders table component with order details modal * This component should only be used in admin contexts */ export default function OrdersTable({ orders, enableModal = true }: OrdersTableProps) { const [searchTerm, setSearchTerm] = useState(""); const [statusFilter, setStatusFilter] = useState("all"); const [currentPage, setCurrentPage] = useState(1); const [selectedOrderId, setSelectedOrderId] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const itemsPerPage = 20; // Filter orders based on search and status const filteredOrders = useMemo(() => { return orders.filter((order) => { const matchesSearch = searchTerm === "" || order.orderId.toString().toLowerCase().includes(searchTerm.toLowerCase()) || order.userId.toLowerCase().includes(searchTerm.toLowerCase()) || (order.vendorUsername && order.vendorUsername.toLowerCase().includes(searchTerm.toLowerCase())); const matchesStatus = statusFilter === "all" || order.status === statusFilter; return matchesSearch && matchesStatus; }); }, [orders, searchTerm, statusFilter]); // Pagination calculations const totalPages = Math.ceil(filteredOrders.length / itemsPerPage); const startIndex = (currentPage - 1) * itemsPerPage; const endIndex = startIndex + itemsPerPage; const currentOrders = filteredOrders.slice(startIndex, endIndex); // Virtual scrolling row renderer const Row = ({ index, style }: { index: number; style: React.CSSProperties }) => { const order = currentOrders[index]; if (!order) return null; return (
{order.orderId} {order.userId} {order.vendorUsername || 'N/A'} {order.items.length > 0 ? order.items[0].name : 'No items'} £{order.total.toFixed(2)}
{order.status.toUpperCase()}
N/A {new Date(order.createdAt).toLocaleDateString()} {enableModal ? ( ) : ( )}
); }; // Determine if we should use virtual scrolling (for performance with large datasets) const useVirtualScrolling = currentOrders.length > 50; const handlePageChange = (page: number) => { setCurrentPage(page); }; const handleSearchChange = (value: string) => { setSearchTerm(value); setCurrentPage(1); // Reset to first page when searching }; const handleStatusFilterChange = (value: string) => { setStatusFilter(value); setCurrentPage(1); // Reset to first page when filtering }; const handleViewOrder = (orderId: number | string) => { setSelectedOrderId(orderId); setIsModalOpen(true); }; return (
Order Management View and manage platform orders
handleSearchChange(e.target.value)} />
Order ID Customer Vendor Product Amount Status Payment Date Actions {useVirtualScrolling ? ( {({ index, style }: { index: number; style: React.CSSProperties }) => { const order = currentOrders[index]; if (!order) return null; return (
{order.orderId} {order.userId} {order.vendorUsername || 'N/A'} {order.items.length > 0 ? order.items[0].name : 'No items'} £{order.total.toFixed(2)}
{order.status.toUpperCase()}
N/A {new Date(order.createdAt).toLocaleDateString()} {enableModal ? ( ) : ( )}
); }}
) : ( {currentOrders.map((order) => ( {order.orderId} {order.userId} {order.vendorUsername || 'N/A'} {order.items.length > 0 ? order.items[0].name : 'No items'} £{order.total.toFixed(2)}
{order.status.toUpperCase()}
N/A {new Date(order.createdAt).toLocaleDateString()} {enableModal ? ( ) : ( )}
))}
)}
{/* Pagination */} {totalPages > 1 && (
Showing {startIndex + 1} to {Math.min(endIndex, filteredOrders.length)} of {filteredOrders.length} orders
{Array.from({ length: Math.min(5, totalPages) }, (_, i) => { const pageNum = i + 1; return ( ); })}
)}
{/* Order Details Modal - Admin only */} {enableModal && selectedOrderId && ( )}
); }