'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
There are no orders matching your criteria.
| 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)} |
|---|