import { LocationCard } from './ui/LocationCard'; import { AddMonthButton } from './ui/AddMonthButton'; import { AddLocationButton } from './ui/AddLocationButton'; import { PageFooter } from './ui/PageFooter'; import { fetchAllLocations } from './lib/actions/locationActions'; import { fetchAvailableYears } from './lib/actions/monthActions'; import { BillingLocation, YearMonth } from './lib/db-types'; import { FC } from 'react'; import Pagination from './ui/Pagination'; import { Main } from './ui/Main'; import { MonthCard } from './ui/MonthCard'; const getNextYearMonth = (yearMonth:YearMonth) => { const {year, month} = yearMonth; return({ year: month===12 ? year+1 : year, month: month===12 ? 1 : month+1 } as YearMonth); } export interface PageProps { searchParams?: { year?: string; }; } const Page:FC = async ({ searchParams }) => { let availableYears: number[]; try { availableYears = await fetchAvailableYears(); } catch (error:any) { return (

{error.message}

); } // if the database is in it's initial state, show the add location button for the current month if(availableYears.length === 0) { const currentYearMonth:YearMonth = { year: new Date().getFullYear(), month: new Date().getMonth() + 1 }; return (
); } const [ latestYear ] = availableYears; const currentYear = Number(searchParams?.year) || availableYears[0]; const locations = await fetchAllLocations(currentYear); // group locations by month const months = locations.reduce((acc, location) => { const {year, month} = location.yearMonth; const key = `${year}-${month}`; const locationsInMonth = acc[key]; if(locationsInMonth) { return({ ...acc, [key]: { yearMonth: location.yearMonth, locations: [...locationsInMonth.locations, location], monthlyExpense: locationsInMonth.monthlyExpense + location.bills.reduce((acc, bill) => bill.paid ? acc + (bill.payedAmount ?? 0) : acc, 0) } }) } return({ ...acc, [key]: { yearMonth: location.yearMonth, locations: [location], monthlyExpense: location.bills.reduce((acc, bill) => bill.paid ? acc + (bill.payedAmount ?? 0) : acc, 0) } }); }, {} as {[key:string]:{ yearMonth: YearMonth, locations: BillingLocation[], monthlyExpense: number } }); return (
{ Object.entries(months).map(([monthKey, { yearMonth, locations, monthlyExpense }], monthIx) => { locations.map((location, ix) => ) } { // show AddLocationButton as a last item in the first month monthIx === 0 ? : null } ) }
); } export default Page;