diff --git a/app/db/models/calendar.server.ts b/app/db/models/calendar.server.ts index 82fd00f02..8632d24cf 100644 --- a/app/db/models/calendar.server.ts +++ b/app/db/models/calendar.server.ts @@ -69,32 +69,24 @@ export function findById(id: CalendarEvent["id"]) { >; } -const eventsCountPerWeekStm = sql.prepare(` +const startTimesOfRangeStm = sql.prepare(` select "CalendarEventDate"."startTime" from "CalendarEventDate" where "CalendarEventDate"."startTime" between $startTime and $endTime `); -export function eventsCountPerWeek({ +export function startTimesOfRange({ startTime, endTime, }: { startTime: Date; endTime: Date; }) { - const startTimes = eventsCountPerWeekStm.all({ - startTime: dateToDatabaseTimestamp(startTime), - endTime: dateToDatabaseTimestamp(endTime), - }) as Array>; - - const result = new Map(); - - for (const { startTime } of startTimes) { - const week = dateToWeekNumber(databaseTimestampToDate(startTime)); - const previousCount = result.get(week) ?? 0; - result.set(week, previousCount + 1); - } - - return result; + return ( + startTimesOfRangeStm.all({ + startTime: dateToDatabaseTimestamp(startTime), + endTime: dateToDatabaseTimestamp(endTime), + }) as Array> + ).map(({ startTime }) => startTime); } diff --git a/app/routes/calendar/index.tsx b/app/routes/calendar/index.tsx index 3bb7b7f9d..f1afd5034 100644 --- a/app/routes/calendar/index.tsx +++ b/app/routes/calendar/index.tsx @@ -68,26 +68,20 @@ export const loader = async ({ request }: LoaderArgs) => { ? parsedParams.data.year : now.getFullYear(); - const eventCounts = db.calendar.eventsCountPerWeek({ - startTime: subMonths( - weekNumberToDate({ week: displayedWeek, year: displayedYear }), - 1 - ), - endTime: addMonths( - weekNumberToDate({ week: displayedWeek, year: displayedYear }), - 1 - ), - }); - return json({ - currentWeek, // the week that is currently in real life + currentWeek, displayedWeek, - weeks: closeByWeeks({ week: displayedWeek, year: displayedYear }).map( - (week) => ({ - ...week, - numberOfEvents: eventCounts.get(week.number) ?? 0, - }) - ), + nearbyStartTimes: db.calendar.startTimesOfRange({ + startTime: subMonths( + weekNumberToDate({ week: displayedWeek, year: displayedYear }), + 1 + ), + endTime: addMonths( + weekNumberToDate({ week: displayedWeek, year: displayedYear }), + 1 + ), + }), + weeks: closeByWeeks({ week: displayedWeek, year: displayedYear }), events: fetchEventsOfWeek({ week: displayedWeek, year: displayedYear }), title: makeTitle([`Week ${displayedWeek}`, t("pages.calendar")]), }); @@ -133,6 +127,11 @@ export default function CalendarPage() { function WeekLinks() { const data = useLoaderData(); + const isMounted = useIsMounted(); + + const eventCounts = isMounted + ? getEventsCountPerWeek(data.nearbyStartTimes) + : null; return ( number).join("")}> @@ -166,8 +165,12 @@ function WeekLinks() {
Week -
- ×{week.numberOfEvents} +
+ ×{eventCounts?.get(week.number) ?? 0}
@@ -180,6 +183,20 @@ function WeekLinks() { ); } +function getEventsCountPerWeek( + startTimes: UseDataFunctionReturn["nearbyStartTimes"] +) { + const result = new Map(); + + for (const startTime of startTimes) { + const week = dateToWeekNumber(databaseTimestampToDate(startTime)); + const previousCount = result.get(week) ?? 0; + result.set(week, previousCount + 1); + } + + return result; +} + function EventsList() { const data = useLoaderData(); const { i18n } = useTranslation();