--- export const prerender = false; import { actions } from 'astro:actions'; import { getLiveCollection } from 'astro:content'; import Base from '../layouts/Base.astro'; import Header from '../components/layout/Header.astro'; import Footer from '../components/layout/Footer.astro'; import EventCard from '../components/events/EventCard.astro'; import RsvpNotice from '../components/events/RsvpNotice.astro'; import { getRsvpsForEvents, type CalendarRsvp } from '../lib/rsvps'; const rsvpResult = Astro.getActionResult(actions.rsvpEvent); if (rsvpResult?.data?.redirectUrl) { return Astro.redirect(rsvpResult.data.redirectUrl, 303); } if (rsvpResult?.error) { return Astro.redirect('/events?rsvp=error', 303); } const eventsResult = await getLiveCollection('events'); const allEvents = (eventsResult.entries ?? []) .map((entry) => entry.data) .sort((a, b) => a.startsAt.getTime() - b.startsAt.getTime()); const { upcoming: upcomingEvents = [], past: pastEvents = [] } = Object.groupBy( allEvents, (event) => (event.isPast ? 'past' : 'upcoming'), ); pastEvents.reverse(); const loggedInUser = Astro.locals.loggedInUser; let rsvpsByEvent = new Map(); let rsvpReadFailed = false; if (loggedInUser) { try { rsvpsByEvent = await getRsvpsForEvents(loggedInUser, [ ...upcomingEvents.map((event) => ({ uri: event.atUri })), ...pastEvents.map((event) => ({ uri: event.atUri })), ]); } catch { rsvpReadFailed = true; } } const rsvpMessage = Astro.url.searchParams.get('rsvp'); ---

Upcoming events

Community meetups, conferences, and hangouts across the Atmosphere. Events are sourced from Smoke Signal and OpenMeet.

{rsvpReadFailed && (

We couldn't check which events you're going to right now.

)} {upcomingEvents.length > 0 ? (
{upcomingEvents.map((event) => ( ))}
) : (

No upcoming events right now. Check back soon or create one on Smoke Signal.

)} {pastEvents.length > 0 && (

Past events

{pastEvents.map((event) => ( ))}
)}