"use client"; import React, { useEffect, useState, useCallback } from "react"; import { getCustomers, CustomerStats } from "@/services/customerService"; import { formatCurrency } from "@/utils/format"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; import Layout from "@/components/layout/layout"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { ChevronLeft, ChevronRight, Loader2, Users, ArrowUpDown, MessageCircle } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; export default function CustomerManagementPage() { const router = useRouter(); const [customers, setCustomers] = useState([]); const [loading, setLoading] = useState(true); const [page, setPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [itemsPerPage, setItemsPerPage] = useState(25); const [selectedCustomer, setSelectedCustomer] = useState(null); const [sortConfig, setSortConfig] = useState<{ column: "totalOrders" | "totalSpent" | "lastOrderDate"; direction: "asc" | "desc"; }>({ column: "totalSpent", direction: "desc" }); const fetchCustomers = useCallback(async () => { try { setLoading(true); const response = await getCustomers(page, itemsPerPage); // Sort customers based on current sort config let sortedCustomers = [...response.customers]; sortedCustomers.sort((a, b) => { if (sortConfig.column === "totalOrders") { return sortConfig.direction === "asc" ? a.totalOrders - b.totalOrders : b.totalOrders - a.totalOrders; } else if (sortConfig.column === "totalSpent") { return sortConfig.direction === "asc" ? a.totalSpent - b.totalSpent : b.totalSpent - a.totalSpent; } else if (sortConfig.column === "lastOrderDate") { return sortConfig.direction === "asc" ? new Date(a.lastOrderDate).getTime() - new Date(b.lastOrderDate).getTime() : new Date(b.lastOrderDate).getTime() - new Date(a.lastOrderDate).getTime(); } return 0; }); setCustomers(sortedCustomers); setTotalPages(Math.ceil(response.total / itemsPerPage)); } catch (err) { toast.error("Failed to fetch customers"); console.error(err); } finally { setLoading(false); } }, [page, itemsPerPage, sortConfig]); useEffect(() => { fetchCustomers(); }, [fetchCustomers]); useEffect(() => { const authToken = document.cookie .split("; ") .find((row) => row.startsWith("Authorization=")) ?.split("=")[1]; if (!authToken) { router.push("/login"); } }, [router]); const handlePageChange = (newPage: number) => { setPage(newPage); }; const handleItemsPerPageChange = (value: string) => { setItemsPerPage(parseInt(value, 10)); setPage(1); // Reset to first page when changing items per page }; const handleSort = (column: "totalOrders" | "totalSpent" | "lastOrderDate") => { setSortConfig(prev => ({ column, direction: prev.column === column && prev.direction === "asc" ? "desc" : "asc" })); }; // Format date without time const formatDate = (dateString: string) => { const date = new Date(dateString); return new Intl.DateTimeFormat('en-GB', { day: '2-digit', month: 'short', year: 'numeric' }).format(date); }; return (

Customer Management

Show:
{loading ? "Loading..." : `Showing ${customers.length} of ${totalPages * itemsPerPage} customers`}
{loading ? (
) : customers.length === 0 ? (

No customers found

Once you have customers placing orders, they will appear here.

) : (
Customer handleSort("totalOrders")} >
Orders
handleSort("totalSpent")} >
Total Spent
Status
{customers.map((customer) => ( setSelectedCustomer(customer)} >
@{customer.telegramUsername || "Unknown"}
ID: {customer.telegramUserId}
{customer.totalOrders} {formatCurrency(customer.totalSpent)}
{customer.ordersByStatus.paid} Paid {customer.ordersByStatus.completed} Completed {customer.ordersByStatus.shipped} Shipped
))}
)}
Page {page} of {totalPages}
{/* Customer Details Dialog */} !open && setSelectedCustomer(null)}> Customer Details Details and order statistics for this customer {selectedCustomer && (
Customer Information
Username:
@{selectedCustomer.telegramUsername || "Unknown"}
Telegram ID:
{selectedCustomer.telegramUserId}
Chat ID:
{selectedCustomer.chatId}
Order Statistics
Total Orders:
{selectedCustomer.totalOrders}
Total Spent:
{formatCurrency(selectedCustomer.totalSpent)}
First Order:
{formatDate(selectedCustomer.firstOrderDate)}
Last Order:
{formatDate(selectedCustomer.lastOrderDate)}
Order Status Breakdown

Paid

{selectedCustomer.ordersByStatus.paid}

Acknowledged

{selectedCustomer.ordersByStatus.acknowledged}

Shipped

{selectedCustomer.ordersByStatus.shipped}

Completed

{selectedCustomer.ordersByStatus.completed}

)}
); }