"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { api } from "@/lib/api"; import { useAuth } from "@/lib/auth"; import { useI18n } from "@/lib/i18n"; import type { MeetupSession } from "@/lib/types"; import RingNext from "@/components/RingNext"; import { useRingSteps } from "@/lib/rings"; export default function MeetupLiveClient({ meetupId, title }: { meetupId: string; title: string }) { const { token } = useAuth(); const { t } = useI18n(); const rings = useRingSteps(); const [session, setSession] = useState(null); const [error, setError] = useState(false); const [layout, setLayout] = useState<"split" | "video" | "chat">("split"); useEffect(() => { setError(false); setSession(null); api .getMeetupSession(meetupId, token || undefined) .then(setSession) .catch(() => { setSession(null); setError(true); }); }, [meetupId, token]); if (error) { return (

{t.live.unavailable}

{t.live.unavailableDesc}

{t.live.back}
); } if (!session) { return (

{t.live.loading}

); } if (!session.canJoin) { const reason = session.lockReason || (session.mode === "offline" ? "offline" : "login_required"); const copy = reason === "vip_required" ? t.live.vipRequired : reason === "host_required" ? t.live.hostRequired : reason === "offline" ? t.live.offlineOnly : t.live.loginRequired; const href = reason === "vip_required" ? "/join" : reason === "offline" ? "/meetups" : `/login?next=/meetups/${meetupId}/live`; const label = reason === "vip_required" ? t.join.payBtn : reason === "offline" ? t.live.back : t.nav.login; return (

{title}

{copy}

{label} {t.live.back}
); } return (
← {t.live.back} {title}
{(["split", "video", "chat"] as const).map((m) => ( ))}
{(layout === "split" || layout === "video") && session.videoUrl && (