"use client"; import { useState } from "react"; import { useSharedTransactions, useParticipantBalances, useSettleSplits, } from "@/lib/hooks"; import type { SharedTransactionRow } from "@/lib/queries"; function formatDate(d: string) { return new Date(d).toLocaleDateString("en-AU", { day: "numeric", month: "short", year: "numeric" }); } function formatAmount(n: number) { return `$${Number(n).toFixed(2)}`; } export default function SharedPage() { const { data: transactions = [], isLoading: txLoading } = useSharedTransactions(); const { data: balances = [], isLoading: balLoading } = useParticipantBalances(); const settle = useSettleSplits(); const [settling, setSettling] = useState(null); async function handleSettleParticipant(participantId: number) { setSettling(participantId); await settle.mutateAsync({ participant_id: participantId }); setSettling(null); } const others = balances.filter((b) => b.name !== "Me"); return (

Shared Expenses

{/* Balance summary */}
{balLoading ? (

Loading balances...

) : ( others.map((b) => (

{b.name}

{b.unsettled_count} unsettled

{formatAmount(b.total_owed)}

owes you

{b.unsettled_count > 0 && ( )}
)) )}
{/* Transaction list */}

Split Transactions

{txLoading ? (

Loading...

) : transactions.length === 0 ? (

No split transactions yet. Use the Split button on any transaction.

) : ( {(transactions as SharedTransactionRow[]).map((tx) => { const splits = Array.isArray(tx.splits) ? tx.splits : []; const unsettled = splits.filter((s) => !s.settled && s.name !== "Me"); return ( ); })}
Date Description Amount Splits Action
{formatDate(tx.transaction_date)}

{tx.effective_merchant || tx.description}

{tx.description}

{formatAmount(tx.amount)}
{splits.map((s) => ( {s.name} {s.share_percent}% {s.settled && } ))}
{unsettled.length > 0 && ( )}
)}
); }