"use client"; import { usePoll } from "@/lib/use-poll"; import type { ExpenseSummary } from "@/lib/types"; import { StatCard } from "@/components/stat-card"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { DataTable, Column } from "@/components/data-table"; interface Transaction { date: string; vendor: string; amount: string | number; currency?: string; order_number?: string; email_account?: string; message_id?: string; [key: string]: unknown; } function getExpenseAccountColor(name: string): string { const lower = name.toLowerCase(); if (lower.includes("gmail") || lower.includes("lzbellina")) return "text-blue-400"; if (lower.includes("dvish")) return "text-amber-400"; if (lower.includes("proton") || lower.includes("admin")) return "text-violet-400"; return "text-muted-foreground"; } export default function ExpensesPage() { const { data: summary } = usePoll( "/api/expenses/summary", 120000 ); const { data: expenseData } = usePoll( "/api/expenses", 120000 ); const transactions = Array.isArray(expenseData) ? expenseData : (expenseData?.expenses ?? []); const maxVendor = summary?.top_vendors.reduce( (max, v) => Math.max(max, v.amount), 0 ) ?? 1; const txColumns: Column[] = [ { key: "date", label: "Date" }, { key: "vendor", label: "Vendor", render: (row) => ( {row.vendor} ), }, { key: "amount", label: "Amount", render: (row) => { const amt = Number(row.amount || 0); return ( = 0 ? "text-green-400" : "text-red-400"}> ${amt.toFixed(2)} {row.currency ?? ""} ); }, }, { key: "order_number", label: "Order #" }, { key: "email_account", label: "Account", render: (row) => ( {String(row.email_account ?? "")} ), }, ]; const accounts = transactions ? [...new Set(transactions.map((t) => String(t.email_account ?? "")).filter(Boolean))] : []; return (

Expenses

{/* Summary Cards */}
{/* Top Vendors Bar Chart */} Top Vendors {!summary ? (

Loading...

) : (
{summary.top_vendors.map((v) => (
{v.vendor} ${v.amount.toFixed(2)}
))}
)} {/* Transactions Table */} Transactions data={transactions ?? []} columns={txColumns} searchKey="vendor" filterKey="email_account" filterOptions={accounts} />
); }