From 8d69dd9ec7eeed06aa326dfa99355d39e18ba29d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 5 Jun 2026 04:44:00 +0000 Subject: [PATCH] Limit settlement list with expandable older records --- src/pages/GroupDetail.jsx | 122 ++++++++++++++++++++++++++++---------- 1 file changed, 90 insertions(+), 32 deletions(-) diff --git a/src/pages/GroupDetail.jsx b/src/pages/GroupDetail.jsx index 56db9f2..d0aae63 100644 --- a/src/pages/GroupDetail.jsx +++ b/src/pages/GroupDetail.jsx @@ -28,7 +28,7 @@ export default function GroupDetail() { const [deleteTarget, setDeleteTarget] = useState(null) const [receiptUrls, setReceiptUrls] = useState({}) // expenseId → signed URL const [memberAction, setMemberAction] = useState(null) // { type: 'remove'|'promote'|'demote', member } - const [showSettlements, setShowSettlements] = useState(false) + const [showOlderSettlements, setShowOlderSettlements] = useState(false) const { balances, transactions, myBalance } = useBalances(expenses, settlements, profile?.id) @@ -605,7 +605,7 @@ export default function GroupDetail() { )} - {/* Settlements (collapsible, closed by default) */} + {/* Settlements */} {(() => { // Belt-and-suspenders: enforce group scope at render time even though // the fetch already filters by group_id. Prevents any future bug @@ -613,43 +613,101 @@ export default function GroupDetail() { const groupSettlements = settlements .filter(s => s.group_id === groupId) .sort((a, b) => new Date(b.settled_at) - new Date(a.settled_at)) + const recentLimit = 5 + const recentSettlements = groupSettlements.slice(0, recentLimit) + const olderSettlements = groupSettlements.slice(recentLimit) + const previewSettlement = olderSettlements[0] if (groupSettlements.length === 0) return null return (
- - - {showSettlements && ( -
- {groupSettlements.map(s => ( -
-
-

- {getMemberName(s.paid_by)} - paid - {getMemberName(s.paid_to)} -

-

- {formatRelativeDate(s.settled_at)} -

-
- - {formatCurrency(s.amount, group.currency)} +

+ Settlements ({groupSettlements.length}) +

+ +
+ {recentSettlements.map(s => ( +
+
+

+ {getMemberName(s.paid_by)} + paid + {getMemberName(s.paid_to)} +

+

+ {formatRelativeDate(s.settled_at)} +

+
+ + {formatCurrency(s.amount, group.currency)} + +
+ ))} +
+ + {olderSettlements.length > 0 && ( +
+ + + {!showOlderSettlements && previewSettlement && ( +
+
+
+

+ {getMemberName(previewSettlement.paid_by)} + paid + {getMemberName(previewSettlement.paid_to)} +

+

+ {formatRelativeDate(previewSettlement.settled_at)} +

+
+ + {formatCurrency(previewSettlement.amount, group.currency)} + +
+
+
+ )} + + {showOlderSettlements && ( +
+ {olderSettlements.map(s => ( +
+
+

+ {getMemberName(s.paid_by)} + paid + {getMemberName(s.paid_to)} +

+

+ {formatRelativeDate(s.settled_at)} +

+
+ + {formatCurrency(s.amount, group.currency)} + +
+ ))} +
+ )}
)}