import { useEffect, useMemo, useState } from "react"; import { Calendar, MapPin } from "lucide-react"; import { Link, useSearchParams } from "react-router-dom"; import { getVisitorEventAgenda, getVisitorLoginPreview, type VisitorSessionPreview, } from "../lib/api"; import { formatEventScheduleRange } from "../lib/sessionDisplay"; import { groupSessionsIntoAgendaDays, LandingAgendaCards, LandingMySessionsList, } from "../components/EventLandingAgenda"; import { EventBanner } from "../components/EventBanner"; import { useEventRegistrationSettings } from "../hooks/useEventRegistrationSettings"; import { useSessionBookmarks } from "../hooks/useSessionBookmarks"; import { readStoredVisitorContext } from "../types/visitorContext"; import type { LoginPreviewResponse } from "../types/visitorContext"; import { EventRatingBadge } from "../components/EventRatingBadge"; import { HeaderMobile } from "../components/HeaderMobile"; import { MobileShell } from "../components/MobileShell"; export function EventLandingPage() { const [searchParams] = useSearchParams(); const urlEventId = searchParams.get("event_id")?.trim() || ""; const ctx = readStoredVisitorContext(); const eventId = urlEventId || ctx?.eventId || ""; const [fetchedEvent, setFetchedEvent] = useState(null); useEffect(() => { if (!eventId) { setFetchedEvent(null); return; } let cancelled = false; getVisitorLoginPreview(eventId) .then((ev) => { if (!cancelled) setFetchedEvent(ev); }) .catch(() => { if (!cancelled) setFetchedEvent(null); }); return () => { cancelled = true; }; }, [eventId]); const event = fetchedEvent ?? (ctx?.eventId === eventId ? ctx.event : null); const reg = useEventRegistrationSettings(event ?? null); const { bookmarkedIds, toggle: toggleBookmark } = useSessionBookmarks(eventId); const [agendaSessions, setAgendaSessions] = useState([]); const [agendaLoading, setAgendaLoading] = useState(false); const [agendaErr, setAgendaErr] = useState(null); useEffect(() => { if (!eventId) { setAgendaSessions([]); setAgendaErr(null); setAgendaLoading(false); return; } let cancelled = false; setAgendaLoading(true); setAgendaErr(null); setAgendaSessions([]); getVisitorEventAgenda(eventId) .then((sessions) => { if (!cancelled) setAgendaSessions(sessions); }) .catch((e) => { if (!cancelled) { setAgendaErr(e instanceof Error ? e.message : "Could not load agenda."); setAgendaSessions([]); } }) .finally(() => { if (!cancelled) setAgendaLoading(false); }); return () => { cancelled = true; }; }, [eventId]); const [dayOpen, setDayOpen] = useState>({}); useEffect(() => { setDayOpen({}); }, [eventId]); const agendaDays = useMemo(() => groupSessionsIntoAgendaDays(agendaSessions), [agendaSessions]); const bookmarkedSessionsSorted = useMemo(() => { if (!bookmarkedIds.size) return []; return agendaSessions .filter((s) => bookmarkedIds.has(s._id)) .sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime()); }, [agendaSessions, bookmarkedIds]); useEffect(() => { const first = agendaDays[0]?.dateKey; if (!first) return; setDayOpen((prev) => { if (Object.keys(prev).length > 0) return prev; return { [first]: true }; }); }, [agendaDays]); const schedule = event?.startDate && event?.endDate ? formatEventScheduleRange( typeof event.startDate === "string" ? event.startDate : String(event.startDate), typeof event.endDate === "string" ? event.endDate : String(event.endDate), ) : ""; const scopedQs = eventId ? new URLSearchParams({ event_id: eventId }).toString() : ""; const ratingsHref = scopedQs ? `/ratings?${scopedQs}` : "/ratings"; const bannerSrc = event?.bannerImage?.trim() || event?.image?.trim() || ""; if (!eventId) { return (

Open this page from your event link or sign in again.

Home
); } if (!event) { return (

Loading event…

); } return (

{event.name}

{reg.enableRatings ? ( rate now ) : ( Ratings off )}

{event.description?.trim() || event.subtitle?.trim() || "Welcome to this event."}

{/* */}
{schedule || "—"}
{event.location?.trim() ? (
{event.location.trim()}
) : null}
{bookmarkedIds.size > 0 ? (

My Sessions

{agendaLoading && !agendaSessions.length ? (

Loading…

) : ( )}
) : null}

Agenda

{agendaErr ? (

{agendaErr}

) : null} {agendaLoading && !agendaSessions.length ? (

Loading agenda…

) : agendaDays.length === 0 ? (

No sessions scheduled for this event yet.

) : ( )}
); }