import { useQuery } from "@tanstack/react-query"; import { Link } from "react-router-dom"; import { Receipt, FileSearch, ClipboardList, CreditCard, FileClock, ChevronRight, } from "lucide-react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { dashboardService, invoiceService } from "@/services"; import { Badge } from "@/components/ui/badge"; import { format } from "date-fns"; import { cn } from "@/lib/utils"; const COLORS = ["#10b981", "#f59e0b", "#ef4444", "#3b82f6", "#8b5cf6"]; const COMMERCE_QUICK_LINKS = [ { label: "Invoices", description: "Browse, search, and manage issued invoices.", path: "/admin/invoices", icon: Receipt, color: "text-slate-700", }, { label: "Proforma", description: "View and manage proforma invoices and drafts.", path: "/admin/proforma", icon: FileSearch, color: "text-blue-600", }, { label: "Proforma requests", description: "Review and process incoming proforma requests.", path: "/admin/proforma-requests", icon: ClipboardList, color: "text-violet-600", }, { label: "Payments", description: "Recorded payments and transaction history.", path: "/admin/payments", icon: CreditCard, color: "text-emerald-600", }, { label: "Payment requests", description: "Pending and processed payment requests.", path: "/admin/payment-requests", icon: FileClock, color: "text-amber-600", }, ] as const; export default function DashboardPage() { const { data: metrics, isLoading: metricsLoading } = useQuery({ queryKey: ["admin", "dashboard", "metrics"], queryFn: () => dashboardService.getMetrics(), }); const { data: scannedInvoices, isLoading: scannedLoading } = useQuery({ queryKey: ["admin", "dashboard", "scanned"], queryFn: () => dashboardService.getScannedInvoices(), }); const { data: statusBreakdown, isLoading: statusLoading } = useQuery({ queryKey: ["admin", "dashboard", "status-breakdown"], queryFn: () => dashboardService.getInvoiceStatusBreakdown(), }); const { data: proformaRequests, isLoading: requestsLoading } = useQuery({ queryKey: ["admin", "dashboard", "proforma-requests"], queryFn: () => invoiceService.getProformaRequests({ limit: 5 }), }); const formatCurrency = (amount: number) => { return new Intl.NumberFormat("en-US", { style: "currency", currency: "USD", maximumFractionDigits: 0, }).format(amount); }; const dataLoading = metricsLoading || scannedLoading || statusLoading || requestsLoading; return (

Dashboard Overview

Operational status and pending verification items.

{/* Quick access — invoices, proforma, payments */}

Quick access

{COMMERCE_QUICK_LINKS.map((item) => (
{item.label}

{item.description}

))}
{dataLoading ? (
Loading dashboard data…
) : ( <> {/* Top Metrics Cards */}
Gross Revenue
{formatCurrency(metrics?.totalRevenue || 0)}
Total Payments
{(metrics?.totalPayments || 0).toLocaleString()}
Total Invoices
{(metrics?.totalInvoices || 0).toLocaleString()}
{/* Invoice Status Breakdown (Full Width) */}

Invoice Status Breakdown

{statusBreakdown && statusBreakdown.length > 0 ? ( statusBreakdown.map((item, idx) => (
{item.status}
{item.count.toLocaleString()}
)) ) : (
No status data available.
)} {/* Detailed Stats Row */}

Paid Invoices

{metrics?.paidInvoices || 0}

Pending Invoices

{metrics?.pendingInvoices || 0}

Overdue Invoices

{metrics?.overdueInvoices || 0}

{/* Recent Proforma Requests (Full Width) */}

Recent Proforma Requests

{proformaRequests?.data && proformaRequests.data.length > 0 ? ( proformaRequests.data.map((request) => ( )) ) : ( )}
Title Category Status Deadline
{request.title}
{request.category} {request.status} {format( new Date(request.submissionDeadline), "MMM dd, yyyy", )}
No proforma requests recorded.
{/* Pending Verification (Full Width) */}

Pending Verification

{scannedInvoices && scannedInvoices.length > 0 ? ( scannedInvoices.map((invoice) => ( )) ) : ( )}
Invoice Number Customer Amount Issue Date
{invoice.invoiceNumber} {invoice.customerName} {formatCurrency(invoice.amount)} {new Date(invoice.issueDate).toLocaleDateString()}
No invoices are currently pending verification.
)}
); }