From 12b1cdb52a9d2723c319083b45a4e9a21896b3b4 Mon Sep 17 00:00:00 2001 From: Sebastien Castiel Date: Wed, 6 Dec 2023 17:02:37 -0500 Subject: Balances --- src/app/groups/[groupId]/balances-list.tsx | 63 ++++++++++++++++++++++++++++++ src/app/groups/[groupId]/page.tsx | 20 ++++++---- 2 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 src/app/groups/[groupId]/balances-list.tsx (limited to 'src/app/groups') diff --git a/src/app/groups/[groupId]/balances-list.tsx b/src/app/groups/[groupId]/balances-list.tsx new file mode 100644 index 0000000..c0cffa9 --- /dev/null +++ b/src/app/groups/[groupId]/balances-list.tsx @@ -0,0 +1,63 @@ +import { Balances } from '@/lib/balances' +import { cn } from '@/lib/utils' +import { Participant } from '@prisma/client' + +type Props = { + balances: Balances + participants: Participant[] + currency: string +} + +export function BalancesList({ balances, participants, currency }: Props) { + const maxBalance = Math.max( + ...Object.values(balances).map((b) => Math.abs(b.total)), + ) + + return ( +
+ {participants.map((participant) => ( +
0 || 'flex-row-reverse', + )} + > +
0 && 'text-right', + )} + > + {participant.name} +
+
0 || 'text-right', + )} + > +
+ {currency} {(balances[participant.id]?.total ?? 0).toFixed(2)} +
+
0 + ? 'bg-green-200 left-0 rounded-r-lg border border-green-300' + : 'bg-red-200 right-0 rounded-l-lg border border-red-300', + )} + style={{ + width: + (Math.abs(balances[participant.id]?.total ?? 0) / + maxBalance) * + 100 + + '%', + }} + >
+
+
+ ))} +
+ ) +} diff --git a/src/app/groups/[groupId]/page.tsx b/src/app/groups/[groupId]/page.tsx index 83fc3ef..7fffcb3 100644 --- a/src/app/groups/[groupId]/page.tsx +++ b/src/app/groups/[groupId]/page.tsx @@ -1,3 +1,4 @@ +import { BalancesList } from '@/app/groups/[groupId]/balances-list' import { SaveGroupLocally } from '@/app/groups/[groupId]/save-recent-group' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' @@ -17,6 +18,7 @@ import { TableRow, } from '@/components/ui/table' import { getGroup, getGroupExpenses } from '@/lib/api' +import { getBalances } from '@/lib/balances' import { ChevronRight, Plus } from 'lucide-react' import Link from 'next/link' import { notFound } from 'next/navigation' @@ -30,6 +32,7 @@ export default async function GroupPage({ if (!group) notFound() const expenses = await getGroupExpenses(groupId) + const balances = getBalances(expenses) return ( <> @@ -52,7 +55,7 @@ export default async function GroupPage({ {expenses.length > 0 ? ( - +
Title @@ -115,14 +118,17 @@ export default async function GroupPage({ - Participants + Balances + + This is the amount that each participant paid or was paid for. + -
    - {group.participants.map((participant) => ( -
  • {participant.name}
  • - ))} -
+
-- cgit v1.3