"use client"; import { useQueryState, parseAsStringLiteral, parseAsString } from "nuqs"; import { EventItem } from "./EventItem"; import { EventFilter } from "./EventFilter"; import { EventFragment, EventCategory, SingularEvent, getSingularEvents, organizeEventsByDate, } from "@/lib/event"; import { isTodayOrFuture } from "@/lib/date"; import styles from "./eventContainer.module.scss"; import { formatDate, formatYearMonth } from "@/lib/date"; import { parse } from "date-fns"; /* TODO: canonical / alternate URLs https://github.com/47ng/nuqs?tab=readme-ov-file#seo */ export const EventContainer = ({ events, eventCategories, }: { events: EventFragment[]; eventCategories: EventCategory[]; }) => { const [mode, setMode] = useQueryState( "mode", parseAsStringLiteral(["list", "calendar"]).withDefault("list") ); const filterableCategories = eventCategories.filter((x) => x.showInFilters); const [category, setCategory] = useQueryState("category", parseAsString); const filteredEvents = events.filter( (x) => !category || x.categories.map((eventCategory) => eventCategory.slug).includes(category) ); return (
{mode === "list" && } {mode === "calendar" && }
); }; const EventList = ({ events }: { events: EventFragment[] }) => { return ( ); }; const CalendarDay = ({ day, events, }: { day: string; events: SingularEvent[]; }) => (

{formatDate(parse(day, "yyyy-MM-dd", new Date()), "eeee dd.MM.")}

); const EventCalendar = ({ events }: { events: EventFragment[] }) => { const futureSingularEvents = getSingularEvents(events).filter( (x) => x.occurrence?.start && isTodayOrFuture(x.occurrence.start) ); const eventsByDate = organizeEventsByDate(futureSingularEvents); return (
{Object.keys(eventsByDate).map((yearMonth) => (

{formatYearMonth(yearMonth)}

{Object.keys(eventsByDate[yearMonth]).map((week) => (
{Object.keys(eventsByDate[yearMonth][week]).map((day) => ( ))}
))}
))}
); };