From 88bd061697e5a5d293c74876ae9a141d52de3588 Mon Sep 17 00:00:00 2001 From: g Date: Fri, 7 Feb 2025 16:52:28 +0000 Subject: [PATCH] Update the table --- components/order-table.tsx | 164 ++++++++++++++++++++++++++++++------- 1 file changed, 136 insertions(+), 28 deletions(-) diff --git a/components/order-table.tsx b/components/order-table.tsx index 6084e34..0cb7411 100644 --- a/components/order-table.tsx +++ b/components/order-table.tsx @@ -1,30 +1,81 @@ "use client"; import { useState, useEffect } from "react"; -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; import { Button } from "@/components/ui/button"; -import { Eye } from "lucide-react"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { + Eye, + Loader, + CheckCircle, + XCircle, + ChevronLeft, + ChevronRight, +} from "lucide-react"; import Link from "next/link"; -import { fetchWithAuthClient } from "@/lib/client-utils"; // ✅ Import client-safe API helper +import { fetchWithAuthClient } from "@/lib/client-utils"; import { toast } from "sonner"; -// ✅ Define the Order Type +// ✅ Define Order Type interface Order { _id: string; - date: string; - totalPrice: number; + orderId: number; status: string; + totalPrice: number; + escrowExpiresAt: string; + telegramUsername: string; +} + +interface OrdersResponse { + orders: Order[]; + page: number; + totalPages: number; } export default function OrderTable() { const [orders, setOrders] = useState(null); const [loading, setLoading] = useState(true); + const [statusFilter, setStatusFilter] = useState("all"); // ✅ Status Filter + const [currentPage, setCurrentPage] = useState(1); + const [totalPages, setTotalPages] = useState(1); + // ✅ Fetch Orders with Pagination & Filtering useEffect(() => { const fetchOrders = async () => { try { - const data: Order[] = await fetchWithAuthClient("/orders"); - setOrders(data); + setLoading(true); + const query = new URLSearchParams({ + page: currentPage.toString(), + limit: "10", + }); + + if (statusFilter !== "all") { + query.append("status", statusFilter); + } + + const response: OrdersResponse = await fetchWithAuthClient( + `/orders?${query.toString()}` + ); + + if (response.orders) { + setOrders(response.orders); + setTotalPages(response.totalPages); + } else { + throw new Error("Invalid API response format"); + } } catch (error) { toast.error("Failed to fetch orders."); console.error("Error fetching orders:", error); @@ -34,38 +85,73 @@ export default function OrderTable() { }; fetchOrders(); - }, []); + }, [statusFilter, currentPage]); return (
+ {/* ✅ Filtering UI */} +
+

+ Orders +

+ +
+ - Order ID - Date - Total + Order ID{" "} + {/* Center-aligned */} + Total (£) Status + Buyer Action {loading ? ( - Array.from({ length: 3 }).map((_, index) => ( - - Loading... - Loading... - Loading... - Loading... - Loading... - - )) + + + + + ) : orders && orders.length > 0 ? ( orders.map((order) => ( - - {order._id.slice(-6)} - {new Date(order.date).toLocaleDateString()} - £{order.totalPrice.toFixed(2)} - {order.status} + + + #{order.orderId} + + + £{order.totalPrice.toFixed(2)} + + + {order.status === "paid" ? ( +
+ Paid +
+ ) : ( +
+ {order.status} +
+ )} +
+ + @{order.telegramUsername} +
+ +
+ + + Page {currentPage} of {totalPages} + + +
); -} \ No newline at end of file +}