fetch and filter on event categories

This commit is contained in:
2024-05-13 03:50:48 +02:00
parent 79c7b8ba43
commit 26df80b65e
8 changed files with 118 additions and 24 deletions

View File

@ -5,6 +5,7 @@ import { EventItem } from "./EventItem";
import { EventFilter } from "./EventFilter";
import {
EventFragment,
EventCategoryFragment,
SingularEvent,
getSingularEvents,
organizeEventsByDate,
@ -12,23 +13,54 @@ import {
import { isTodayOrFuture } from "@/lib/date";
import styles from "./eventContainer.module.scss";
import { formatDate, formatYearMonth } from "@/lib/date";
import { getYear, parse } from "date-fns";
import { parse } from "date-fns";
export const EventContainer = ({ events }: { events: EventFragment[] }) => {
/*
TODO: canonical / alternate URLs https://github.com/47ng/nuqs?tab=readme-ov-file#seo
*/
export const EventContainer = ({
events,
eventCategories,
}: {
events: EventFragment[];
eventCategories: EventCategoryFragment[];
}) => {
const [mode, setMode] = useQueryState(
"mode",
parseAsStringLiteral(["list", "calendar"]).withDefault("list")
);
const filterableCategories = eventCategories.filter((x) => x.showInFilters);
const [category, setCategory] = useQueryState(
"category",
parseAsStringLiteral(filterableCategories.map((x) => x.slug)).withDefault(
null
)
);
const filteredEvents = events.filter(
(x) =>
!category ||
x.categories
?.map((eventCategory) => eventCategory.slug)
.includes(category)
);
return (
<div className={styles.events}>
<EventFilter />
<EventFilter
eventCategories={filterableCategories}
setCategory={setCategory}
activeCategory={category}
/>
<div className={styles.eventWrapper}>
<div className={styles.displayOptions}>
<button onClick={() => setMode(null)}>Vis liste</button>
<button onClick={() => setMode("calendar")}>Vis kalender</button>
</div>
{mode === "list" && <EventList events={events} />}
{mode === "calendar" && <EventCalendar events={events} />}
{mode === "list" && <EventList events={filteredEvents} />}
{mode === "calendar" && <EventCalendar events={filteredEvents} />}
</div>
</div>
);