"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 (
Loading...
) : !filtered.length ? ({hasFilters ? "No statements match filters" : "No statements found"}
) : (| # | 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 → |