From 2c9894b0bbfc62433082318522d53560350ae2df Mon Sep 17 00:00:00 2001 From: Antoine Kingue Date: Fri, 14 Mar 2025 12:46:21 +0100 Subject: [PATCH 1/3] feat: add related events section on event page (#207) --- src/components/RelatedEvents/index.astro | 29 ++++++++++++++++++++ src/pages/events/[id]/index.astro | 34 +++++++++++++++++------- 2 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 src/components/RelatedEvents/index.astro diff --git a/src/components/RelatedEvents/index.astro b/src/components/RelatedEvents/index.astro new file mode 100644 index 00000000..81dd2de7 --- /dev/null +++ b/src/components/RelatedEvents/index.astro @@ -0,0 +1,29 @@ +--- +import EventCard from "@/components/EventCard/index.astro"; +import TiltedCard from "@/components/TiltedCard"; +import type { CollectionEntry } from "astro:content"; + +interface Props { + currentEvent: CollectionEntry<"events">; + relatedEvents: CollectionEntry<"events">[]; +} + +const { currentEvent, relatedEvents } = Astro.props; +--- + +{ + relatedEvents.length > 0 && ( +
+

+ More Events in {currentEvent.data._computed.city?.data.name} +

+
+ {relatedEvents.map((event) => ( + + + + ))} +
+
+ ) +} diff --git a/src/pages/events/[id]/index.astro b/src/pages/events/[id]/index.astro index f32dfbc7..498bf22c 100644 --- a/src/pages/events/[id]/index.astro +++ b/src/pages/events/[id]/index.astro @@ -40,21 +40,36 @@ import dayjs from "dayjs"; import TiltedCard from "@/components/TiltedCard"; import { lunalink } from "@bearstudio/lunalink"; import { ROUTES } from "@/routes.gen"; +import RelatedEvents from "@/components/RelatedEvents/index.astro"; export async function getStaticPaths() { - const events = await getEventsCollection(); + const allEvents = await getEventsCollection(); return Promise.all( - events.map(async (event) => ({ - params: { id: event.id }, - props: { - event, - }, - })), + allEvents.map(async (event) => { + const relatedEvents = allEvents + .filter( + (e) => + e.id !== event.id && + e.data._computed.city?.id === event.data._computed.city?.id && + (dayjs(e.data.date).isAfter(dayjs()) || + dayjs(e.data.date).isAfter(dayjs().subtract(30, "day"))), + ) + .sort((a, b) => dayjs(a.data.date).diff(dayjs(b.data.date))) + .slice(0, 3); + + return { + params: { id: event.id }, + props: { + event, + relatedEvents, + }, + }; + }), ); } -const { event } = Astro.props; +const { event, relatedEvents } = Astro.props; const partners = await getEntries(event.data.partners ?? []); const speakers = await getEntries(event.data._computed.speakers ?? []); @@ -64,7 +79,6 @@ const coOrganizers = (await getEntries(event.data.coOrganizers ?? [])).filter( const sponsors = await getEntries( (event.data.sponsors ?? []).map((s) => s.slug), ); - const navItems = await getEventNavItems(event.id); const { Content } = await render(event); @@ -646,6 +660,8 @@ const ctaEventMetadata = { + +
From 31451dfe1bfef4164a667fd31cf5a84b35b06901 Mon Sep 17 00:00:00 2001 From: Antoine Kingue Date: Thu, 6 Nov 2025 23:53:43 +0100 Subject: [PATCH 2/3] fix: use EventComputed type for RelatedEvents component --- src/components/RelatedEvents/index.astro | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/RelatedEvents/index.astro b/src/components/RelatedEvents/index.astro index 81dd2de7..9947f459 100644 --- a/src/components/RelatedEvents/index.astro +++ b/src/components/RelatedEvents/index.astro @@ -1,11 +1,11 @@ --- import EventCard from "@/components/EventCard/index.astro"; import TiltedCard from "@/components/TiltedCard"; -import type { CollectionEntry } from "astro:content"; +import type { EventComputed } from "@/lib/events"; interface Props { - currentEvent: CollectionEntry<"events">; - relatedEvents: CollectionEntry<"events">[]; + currentEvent: EventComputed; + relatedEvents: EventComputed[]; } const { currentEvent, relatedEvents } = Astro.props; From 2c0a141aa61a70ec34f7a6fa35f045ab58bee9d8 Mon Sep 17 00:00:00 2001 From: Antoine Kingue Date: Fri, 7 Nov 2025 00:02:13 +0100 Subject: [PATCH 3/3] fix: handle undefined city in related events filter and display --- src/components/RelatedEvents/index.astro | 4 ++-- src/pages/events/[id]/index.astro | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/RelatedEvents/index.astro b/src/components/RelatedEvents/index.astro index 9947f459..7f010cd7 100644 --- a/src/components/RelatedEvents/index.astro +++ b/src/components/RelatedEvents/index.astro @@ -12,10 +12,10 @@ const { currentEvent, relatedEvents } = Astro.props; --- { - relatedEvents.length > 0 && ( + relatedEvents.length > 0 && currentEvent.data._computed.city?.data.name && (

- More Events in {currentEvent.data._computed.city?.data.name} + More Events in {currentEvent.data._computed.city.data.name}

{relatedEvents.map((event) => ( diff --git a/src/pages/events/[id]/index.astro b/src/pages/events/[id]/index.astro index 498bf22c..22145624 100644 --- a/src/pages/events/[id]/index.astro +++ b/src/pages/events/[id]/index.astro @@ -51,6 +51,7 @@ export async function getStaticPaths() { .filter( (e) => e.id !== event.id && + event.data._computed.city?.id !== undefined && e.data._computed.city?.id === event.data._computed.city?.id && (dayjs(e.data.date).isAfter(dayjs()) || dayjs(e.data.date).isAfter(dayjs().subtract(30, "day"))),