"use client"; import { useState, useMemo } from "react"; import Link from "next/link"; import { useStatements, useParticipants, useUpdateStatement } from "@/lib/hooks"; function formatDate(d: string | null) { if (!d) return "—"; return new Date(d).toLocaleDateString("en-AU", { day: "2-digit", month: "short", year: "numeric", }); } function formatPeriod(start: string | null, end: string | null) { if (!start && !end) return "—"; const fmt = (d: string) => new Date(d).toLocaleDateString("en-AU", { day: "2-digit", month: "short", year: "2-digit" }); if (!start) return `until ${fmt(end!)}`; if (!end) return `from ${fmt(start)}`; return `${fmt(start)} – ${fmt(end)}`; } function formatAmount(n: number | null): string { if (n === null || n === undefined) return "—"; return new Intl.NumberFormat("en-AU", { style: "currency", currency: "AUD", minimumFractionDigits: 2, }).format(Number(n)); } const selectCls = "bg-zinc-900 border border-zinc-700 rounded text-xs px-2 py-1.5 text-zinc-300 cursor-pointer hover:border-zinc-600 focus:outline-none focus:border-indigo-500"; export default function StatementsPage() { const { data: statements, isLoading } = useStatements(); const { data: participants } = useParticipants(); const updateStatement = useUpdateStatement(); const [bankFilter, setBankFilter] = useState(""); const [typeFilter, setTypeFilter] = useState<"all" | "card" | "bank">("all"); const [ownerFilter, setOwnerFilter] = useState(""); const [yearFilter, setYearFilter] = useState(""); const banks = useMemo( () => [...new Set((statements ?? []).map((s) => s.bank_name))].sort(), [statements] ); const years = useMemo( () => [ ...new Set( (statements ?? []) .map((s) => s.billing_end_date?.slice(0, 4)) .filter(Boolean) as string[] ), ].sort((a, b) => b.localeCompare(a)), [statements] ); const filtered = useMemo(() => { if (!statements) return []; return statements.filter((s) => { const isCard = s.statement_type?.toLowerCase().includes("card") ?? false; if (bankFilter && s.bank_name !== bankFilter) return false; if (typeFilter === "card" && !isCard) return false; if (typeFilter === "bank" && isCard) return false; if (ownerFilter && String(s.owner_id) !== ownerFilter) return false; if (yearFilter && s.billing_end_date?.slice(0, 4) !== yearFilter) return false; return true; }); }, [statements, bankFilter, typeFilter, ownerFilter, yearFilter]); const hasFilters = bankFilter || typeFilter !== "all" || ownerFilter || yearFilter; return (

Statements

{!isLoading && statements && ( {hasFilters ? `${filtered.length} of ${statements.length}` : statements.length} statements )}
{/* Filters */} {!isLoading && statements && (
{participants && participants.length > 1 && ( )} {hasFilters && ( )}
)} {isLoading ? (

Loading...

) : !filtered.length ? (

{hasFilters ? "No statements match filters" : "No statements found"}

) : (
{filtered.map((s, idx) => { const isCreditCard = s.statement_type?.toLowerCase().includes("card") ?? false; const displayAmount = isCreditCard ? s.total_amount_due : s.closing_balance; const amount = Number(displayAmount); const amountColor = isCreditCard ? "text-red-400" : amount >= 0 ? "text-green-400" : "text-red-400"; return ( ); })}
# Bank Account Period Due / End Ccy Amount Txns Owner
{idx + 1}
{s.bank_name}
{s.card_name && (
{s.card_name}
)}
{s.account_number} {formatPeriod(s.billing_start_date, s.billing_end_date)} {isCreditCard ? formatDate(s.payment_due_date) : formatDate(s.billing_end_date)} {s.currency} {displayAmount !== null && displayAmount !== undefined ? ( {formatAmount(displayAmount)} ) : ( )} {s.transaction_count} {participants?.length ? ( ) : ( {s.owner_name} )} View →
)}
); }