"use client" import { useState, useMemo } from "react" import Link from "next/link" import { Receipt, Download, Plus } from "lucide-react" import { EmptyState } from "@/components/shared/empty-state" import { formatCurrency, formatDate } from "@/lib/utils" import { DeleteButton } from "@/components/shared/delete-button" const categoryColors: Record = { repairs: "text-orange-400 bg-orange-500/10 ring-orange-500/20", utilities: "text-blue-400 bg-blue-500/10 ring-blue-500/20", insurance: "text-purple-400 bg-purple-500/10 ring-purple-500/20", mortgage: "text-indigo-400 bg-indigo-500/10 ring-indigo-500/20", taxes: "text-red-400 bg-red-500/10 ring-red-500/20", management: "text-cyan-400 bg-cyan-500/10 ring-cyan-500/20", supplies: "text-green-400 bg-green-500/10 ring-green-500/20", other: "text-white/40 bg-white/5 ring-white/10", } export function ExpensesClient({ expenses: initial, properties }: { expenses: any[]; properties: any[] }) { const [expenses, setExpenses] = useState(initial) const [propertyFilter, setPropertyFilter] = useState("") const filtered = useMemo(() => propertyFilter ? expenses.filter((e) => e.property_id === propertyFilter) : expenses, [expenses, propertyFilter] ) const total = filtered.reduce((s, e) => s + Number(e.amount), 0) const byCategory = filtered.reduce((acc: Record, e) => { acc[e.category] = (acc[e.category] ?? 0) + Number(e.amount) return acc }, {}) function onDeleted(id: string) { setExpenses((prev) => prev.filter((e) => e.id !== id)) } return (
{/* Header */}

Expenses

{filtered.length} records {total > 0 && {formatCurrency(total)} total}

Export CSV Add Expense
{/* Property filter */} {properties.length > 1 && (
{properties.map((p) => ( ))}
)} {/* Category breakdown */} {Object.keys(byCategory).length > 0 && (
{Object.entries(byCategory) .sort(([, a], [, b]) => b - a) .map(([cat, amt]) => (
{cat} {formatCurrency(amt as number)}
))}
)} {!filtered.length ? ( ) : ( <> {/* Desktop table */}
{["Description", "Property", "Category", "Date", "Amount", ""].map((h) => ( ))} {filtered.map((expense) => ( ))}
{h}

{expense.description}

{expense.vendor &&

{expense.vendor}

}

{expense.property?.name ?? "—"}

{expense.unit &&

Unit {expense.unit.unit_number}

}
{expense.category} {formatDate(expense.expense_date)} {formatCurrency(expense.amount)} onDeleted(expense.id)} />
{/* Mobile cards */}
{filtered.map((expense) => (

{expense.description}

{expense.vendor &&

{expense.vendor}

}

{formatCurrency(expense.amount)}

{expense.category} {formatDate(expense.expense_date)}
onDeleted(expense.id)} />
))}
)}
) }