import { useEffect, useRef, useState } from 'react'; import { useParams, Link } from 'react-router-dom'; import { Loader2, Maximize, Minimize, AlertCircle, Eye } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { supabase } from '@/integrations/supabase/client'; import { joinAsViewer, type ViewerHandle } from '@/lib/webrtc/viewer'; type ConnState = 'checking' | 'connecting' | 'waiting' | 'live' | 'error' | 'not-found'; export default function Watch() { const { code = '' } = useParams(); const videoRef = useRef(null); const handleRef = useRef(null); const [state, setState] = useState('checking'); const [error, setError] = useState(''); const [fullscreen, setFullscreen] = useState(false); const [fallbackFrame, setFallbackFrame] = useState(''); useEffect(() => { let cancelled = false; (async () => { const { data, error: dbErr } = await supabase .from('share_rooms') .select('code, is_active, expires_at') .eq('code', code.toUpperCase()) .maybeSingle(); if (cancelled) return; if (dbErr) { setError(dbErr.message); setState('error'); return; } if (!data) { setState('not-found'); return; } if (!videoRef.current) return; try { const handle = await joinAsViewer( code.toUpperCase(), videoRef.current, (s, detail) => { setState(s as ConnState); if (detail) setError(detail); }, setFallbackFrame, ); handleRef.current = handle; } catch (e) { setError(e instanceof Error ? e.message : String(e)); setState('error'); } })(); return () => { cancelled = true; if (handleRef.current) handleRef.current.stop(); }; }, [code]); const toggleFullscreen = async () => { const el = videoRef.current; if (!el) return; if (document.fullscreenElement) { await document.exitFullscreen(); setFullscreen(false); } else { await el.requestFullscreen(); setFullscreen(true); } }; return (
TrackSteelXR
SALA {code.toUpperCase()} {state === 'live' && ( AO VIVO )}
); }