import { useEffect, useState } from "react"; import { Calendar, ChevronDown, Clock, User } from "lucide-react"; import { Link, useSearchParams } from "react-router-dom"; import type { AgendaRowData } from "../components/AgendaRow"; import { AgendaRow } from "../components/AgendaRow"; import { EventBanner } from "../components/EventBanner"; import { HeaderMobile } from "../components/HeaderMobile"; import { HyperNavigationFAB } from "../components/HyperNavigationFAB"; import { MobileShell } from "../components/MobileShell"; import { getVisitorLoginPreview, getVisitorTrackPreview, type VisitorTrackPreview } from "../lib/api"; import { formatEventScheduleRange } from "../lib/sessionDisplay"; import { readStoredVisitorContext } from "../types/visitorContext"; import type { LoginPreviewResponse } from "../types/visitorContext"; const agendaRows: AgendaRowData[] = [ { time: "06:00 PM", duration: "45 MINS", trackTitle: "Asthma", sessionType: "Symposium", description: "Role of GINA Guidelines for Inning and Monitoring Asthma Treatment", speakers: [ { name: "Dr. Mansi Gupta", role: "Speaker" }, { name: "Dr. Soumya Mitra", role: "Speaker" }, { name: "Dr. Kumar Utsav Samaria", role: "Speaker" }, ], }, { time: "07:00 PM", duration: "45 MINS", trackTitle: "Asthma", sessionType: "Panel Discussion", description: "Role of GINA Guidelines for Iniang and Monitoring Asthma Treatment", speakers: [ { name: "Dr. Mansi Gupta", role: "Speaker" }, { name: "Dr. Soumya Mitra", role: "Speaker" }, { name: "Dr. Kumar Utsav Samaria", role: "Speaker" }, { name: "Dr. Agam Vora", role: "Moderator" }, ], }, { time: "08:00 PM", duration: "45 MINS", trackTitle: "Interventional Pulmonology", sessionType: "Keynote Address", description: "Role of GINA Guidelines for Iniang and Monitoring Asthma Treatment", speakers: [ { name: "Dr. Mansi Gupta", role: "Speaker" }, { name: "Dr. Soumya Mitra", role: "Speaker" }, { name: "Dr. Kumar Utsav Samaria", role: "Speaker" }, ], }, ]; export function EventTrackPage() { const [searchParams] = useSearchParams(); const eventId = searchParams.get("event_id")?.trim() || ""; const trackId = searchParams.get("track_id")?.trim() || ""; const ctx = readStoredVisitorContext(); const [track, setTrack] = useState(null); const [eventInfo, setEventInfo] = useState(null); const [loading, setLoading] = useState(true); const [err, setErr] = useState(null); useEffect(() => { if (!eventId || !trackId) { setErr("Missing track link. Open the track from your event QR code or invite."); setLoading(false); setTrack(null); setEventInfo(null); return; } let cancelled = false; setLoading(true); setErr(null); (async () => { try { const tr = await getVisitorTrackPreview(trackId, eventId); if (cancelled) return; setTrack(tr); if (ctx?.eventId === eventId && ctx.event) { setEventInfo(ctx.event); } else { const ev = await getVisitorLoginPreview(eventId); if (cancelled) return; setEventInfo(ev); } } catch (e) { if (!cancelled) { setErr(e instanceof Error ? e.message : "Could not load track."); setTrack(null); setEventInfo(null); } } finally { if (!cancelled) setLoading(false); } })(); return () => { cancelled = true; }; }, [eventId, trackId, ctx?.eventId]); if (!eventId || !trackId) { return (

{err}

Home
); } if (loading) { return (

Loading track…

); } if (err || !track) { return (

{err ?? "Track not found."}

); } const ev = eventInfo; const eventName = ev?.name ?? "Event"; const schedule = ev?.startDate && ev?.endDate ? formatEventScheduleRange( typeof ev.startDate === "string" ? ev.startDate : String(ev.startDate), typeof ev.endDate === "string" ? ev.endDate : String(ev.endDate), ) : ""; const trackTypeLabel = track.trackType ? String(track.trackType).replace(/_/g, " ") : "Track"; const headerLogo = ev?.logoUrl?.trim() || (ctx?.eventId === eventId && ctx.event?.logoUrl?.trim() ? ctx.event.logoUrl.trim() : undefined); return (
{eventName.toUpperCase()}

{track.name}

{track.hall?.trim() ? (

{track.hall.trim()}

) : null}

{trackTypeLabel}

{schedule || "—"}
See sessions below
Track agenda (sample)

Sessions

{agendaRows.map((row) => ( ))}

Ask & session questions

); }