"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; } 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) => ( ${Number(row.amount || 0).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} />
); }