diff --git a/src/pages/events-new.astro b/src/pages/events-new.astro index 3b6aaf5..feb2e5a 100644 --- a/src/pages/events-new.astro +++ b/src/pages/events-new.astro @@ -1,6 +1,7 @@ --- import { getEnv } from "../utils/getEnv"; import { fetchEvents, type EventItem } from "../store/eventsClient"; +import { eventMetaTags } from "../utils/eventMeta"; import HomeLayout from "../layouts/HomeLayout.astro"; import HomeNavbar from "../components/home/HomeNavbar.astro"; import Button from "../components/ui/Button.astro"; @@ -10,6 +11,12 @@ const membershipLive = getEnv("MEMBERSHIP_LIVE", Astro.locals) === "true"; const events: EventItem[] = await fetchEvents(Astro.locals).catch(() => []); +// A shared `?event=` link (see the modal's "copy link" button) should +// preview as that specific event, not the generic Events page. +const linkedEventId = Astro.url.searchParams.get("event"); +const linkedEvent = linkedEventId ? events.find((e) => e.id === linkedEventId) : undefined; +const meta = linkedEvent ? eventMetaTags(linkedEvent) : null; + // Pick and describe the next event by its instant, not by the organizer-zone // `date` string — that one is a day off for part of the world. // `fetchEvents` doesn't return the feed in date order, so pick the soonest @@ -42,8 +49,10 @@ const eventSchema = nextEvent && { --- diff --git a/src/pages/events.astro b/src/pages/events.astro index 16016cc..70bf449 100644 --- a/src/pages/events.astro +++ b/src/pages/events.astro @@ -3,17 +3,29 @@ import Layout from "../layouts/Layout.astro"; import EventsComponent from "../components/Events.tsx"; import "../styles/base.css"; import PageHeader from "../components/PageHeader.astro"; -import type { EventItem } from "../store/eventsClient"; +import { fetchEvents, type EventItem } from "../store/eventsClient"; +import { eventMetaTags } from "../utils/eventMeta"; let events: EventItem[] = []; let loading: boolean = true; // Skip SSR fetch for now - let client handle it + +// Exception to the above: a shared `?event=` link (see the modal's "copy +// link" button) needs a real title/description/image for its link preview, +// which only a server-side fetch can provide before the client ever renders. +const linkedEventId = Astro.url.searchParams.get("event"); +const linkedEvent = linkedEventId + ? (await fetchEvents(Astro.locals).catch(() => [])).find((e) => e.id === linkedEventId) + : undefined; +const meta = linkedEvent ? eventMetaTags(linkedEvent) : null; --- ` URL shows the actual event instead of +// the page's generic "Events" meta. +export function eventMetaTags(event: EventItem): EventMeta { + const title = `${displayTitle(event)} - Tech for Palestine Events`; + const description = event.description + ? getDescriptionExcerpt(event.description) || DEFAULT_DESCRIPTION + : DEFAULT_DESCRIPTION; + + let image = DEFAULT_OG_IMAGE; + if (event.image && event.image !== DEFAULT_EVENT_IMAGE) { + image = event.image.startsWith("http") + ? event.image + : new URL(event.image, SITE_ORIGIN).toString(); + } + + return { title, description, image }; +}