diff --git a/apps/web/src/components/schedule/ScheduleTimelineBare.tsx b/apps/web/src/components/schedule/ScheduleTimelineBare.tsx new file mode 100644 index 00000000..25bd872a --- /dev/null +++ b/apps/web/src/components/schedule/ScheduleTimelineBare.tsx @@ -0,0 +1,74 @@ +import { type EventType as Event } from "@/lib/types/events"; +import { getClientTimeZone } from "@/lib/utils/client/shared"; +import c from "config"; +import { ReactNode } from "react"; + +const daysOfWeek = [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", +]; + +function splitByDay(schedule: Event[]) { + const days: Map = new Map(); + schedule.forEach((event) => { + const day = daysOfWeek[event.startTime.getDay()]; + const existing = days.get(day); + if (existing) existing.push(event); + else days.set(day, [event]); + }); + return days; +} + +type DayHeaderProps = { dayName: string }; +const DefaultDayHeader = ({ dayName }: DayHeaderProps) => ( + + +

{dayName}

+ + +); + +type RowProps = { event: Event; userTimeZone: string }; + +export default function ScheduleTimelineBare({ + schedule, + timezone, + DayHeader = DefaultDayHeader, + RenderEventRow, +}: { + schedule: Event[]; + timezone?: string; + DayHeader?: React.ComponentType; + RenderEventRow: React.ComponentType; +}) { + const userTimeZone = timezone ?? getClientTimeZone(c.hackathonTimezone); + const days = Array.from(splitByDay(schedule).entries()); + + return ( +
+ + + {days.map( + ([dayName, arr]): ReactNode => ( + <> + + {arr.map((event) => ( + + ))} + + ), + )} + +
+
+ ); +}