'use client' import { CategoryIcon } from '@/app/groups/[groupId]/expenses/category-icon' import { Button } from '@/components/ui/button' import { getGroupExpenses } from '@/lib/api' import { cn } from '@/lib/utils' import { Expense, Participant } from '@prisma/client' import dayjs, { type Dayjs } from 'dayjs' import { ChevronRight } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/navigation' import { Fragment, useEffect } from 'react' type Props = { expenses: Awaited> participants: Participant[] currency: string groupId: string } const EXPENSE_GROUPS = { THIS_WEEK: 'This week', EARLIER_THIS_MONTH: 'Earlier this month', LAST_MONTH: 'Last month', EARLIER_THIS_YEAR: 'Earlier this year', LAST_YEAR: 'Last year', OLDER: 'Older', } function getExpenseGroup(date: Dayjs, today: Dayjs) { if (today.isSame(date, 'week')) { return EXPENSE_GROUPS.THIS_WEEK } else if (today.isSame(date, 'month')) { return EXPENSE_GROUPS.EARLIER_THIS_MONTH } else if (today.subtract(1, 'month').isSame(date, 'month')) { return EXPENSE_GROUPS.LAST_MONTH } else if (today.isSame(date, 'year')) { return EXPENSE_GROUPS.EARLIER_THIS_YEAR } else if (today.subtract(1, 'year').isSame(date, 'year')) { return EXPENSE_GROUPS.LAST_YEAR } else { return EXPENSE_GROUPS.OLDER } } function getGroupedExpensesByDate( expenses: Awaited>, ) { const today = dayjs() return expenses.reduce( (result: { [key: string]: Expense[] }, expense: Expense) => { const expenseGroup = getExpenseGroup(dayjs(expense.expenseDate), today) result[expenseGroup] = result[expenseGroup] ?? [] result[expenseGroup].push(expense) return result }, {}, ) } export function ExpenseList({ expenses, currency, participants, groupId, }: Props) { useEffect(() => { const activeUser = localStorage.getItem('newGroup-activeUser') const newUser = localStorage.getItem(`${groupId}-newUser`) if (activeUser || newUser) { localStorage.removeItem('newGroup-activeUser') localStorage.removeItem(`${groupId}-newUser`) if (activeUser === 'None') { localStorage.setItem(`${groupId}-activeUser`, 'None') } else { const userId = participants.find( (p) => p.name === (activeUser || newUser), )?.id if (userId) { localStorage.setItem(`${groupId}-activeUser`, userId) } } } }, [groupId, participants]) const getParticipant = (id: string) => participants.find((p) => p.id === id) const router = useRouter() const groupedExpensesByDate = getGroupedExpensesByDate(expenses) return expenses.length > 0 ? ( Object.values(EXPENSE_GROUPS).map((expenseGroup: string) => { const groupExpenses = groupedExpensesByDate[expenseGroup] if (!groupExpenses) return null return (
{expenseGroup}
{groupExpenses.map((expense: any) => (
{ router.push(`/groups/${groupId}/expenses/${expense.id}/edit`) }} >
{expense.title}
Paid by{' '} {getParticipant(expense.paidById)?.name} for{' '} {expense.paidFor.map((paidFor: any, index: number) => ( {index !== 0 && <>, } { participants.find( (p) => p.id === paidFor.participantId, )?.name } ))}
{currency} {(expense.amount / 100).toFixed(2)}
{formatDate(expense.expenseDate)}
))}
) }) ) : (

Your group doesn’t contain any expense yet.{' '}

) } function formatDate(date: Date) { return date.toLocaleDateString('en-US', { dateStyle: 'medium', timeZone: 'UTC', }) }