import { useState, useEffect } from "react"; import { LiveKitRoom, ControlBar, useTracks, useLocalParticipant } from "@livekit/components-react"; import "@livekit/components-styles"; import StudioHeader from "./StudioHeader"; import StudioLeftSidebar from "./StudioLeftSidebar"; import StudioRightPanel, { TabsColumn, TabType } from "./StudioRightPanel"; import { SceneProvider } from "../context/SceneContext"; import StreamView from "./broadcast/StreamView"; import ControlPanel from "./broadcast/ControlPanel"; function Studio() { const [token, setToken] = useState(""); const [serverUrl, setServerUrl] = useState( "wss://avanzacast-test-0kl2kzjr.livekit.cloud", ); const [roomName, setRoomName] = useState(""); const [userName, setUserName] = useState(""); const [showLeftPanel, setShowLeftPanel] = useState(true); const [showRightPanel, setShowRightPanel] = useState(true); const [activeRightTab, setActiveRightTab] = useState("comments"); const [needsUserName, setNeedsUserName] = useState(false); const [inputUserName, setInputUserName] = useState(""); const [isConnecting, setIsConnecting] = useState(false); useEffect(() => { const params = new URLSearchParams(window.location.search); const urlToken = params.get("token"); const urlRoom = params.get("room"); const urlUser = params.get("user"); const savedToken = urlToken || localStorage.getItem("avanzacast_studio_token") || ""; const savedRoom = urlRoom || localStorage.getItem("avanzacast_studio_room") || ""; const savedServerUrl = localStorage.getItem("avanzacast_studio_serverUrl") || "wss://avanzacast-test-0kl2kzjr.livekit.cloud"; const savedUserName = urlUser || localStorage.getItem("avanzacast_studio_userName") || ""; setToken(savedToken); setRoomName(savedRoom); setServerUrl(savedServerUrl); if (savedUserName) { setUserName(savedUserName); setNeedsUserName(false); } else if (savedToken && savedRoom) { setNeedsUserName(true); } if (savedToken) localStorage.setItem("avanzacast_studio_token", savedToken); if (savedRoom) localStorage.setItem("avanzacast_studio_room", savedRoom); if (savedServerUrl) localStorage.setItem("avanzacast_studio_serverUrl", savedServerUrl); }, []); const handleSubmitUserName = (e: React.FormEvent) => { e.preventDefault(); if (inputUserName.trim()) { const finalUserName = inputUserName.trim(); setUserName(finalUserName); localStorage.setItem("avanzacast_studio_userName", finalUserName); setNeedsUserName(false); } }; if (needsUserName) { return (
A
AvanzaCast

Bienvenido al Estudio

Ingresa tu nombre para unirte a la transmisión

setInputUserName(e.target.value)} placeholder="Tu nombre" className="w-full px-4 py-3 bg-gray-900/50 border border-gray-600 rounded-lg text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent transition-all" autoFocus required />
); } if (isConnecting) { return (
Conectando al estudio...
); } if (!token || !roomName) { return (
A

AvanzaCast Studio

No hay datos de conexión disponibles.

Para acceder al estudio, debes iniciar una transmisión desde el panel de broadcast.

); } return ( console.log("[LiveKit] Desconectado.")} onError={(e) => console.error("[LiveKit] Error:", e)} data-lk-theme="default" className="studio-container" >
{/* Header */}
{/* Contenedor principal entre header y footer */}
{/* Panel izquierdo */}
{/* Botón toggle panel izquierdo */} {/* Contenedor del estudio (StreamView + ControlPanel) */}
Producido con
A
AvanzaCast
{/* Panel derecho: tabs siempre visibles en el extremo derecho, contenido se oculta */} {/* Panel de contenido con animación de slide */}
setActiveRightTab(t)} />
{/* TabsColumn siempre visible en el extremo derecho */}
{ setActiveRightTab(t); if (!showRightPanel) { setShowRightPanel(true); } }} onTogglePanel={() => setShowRightPanel(!showRightPanel)} isCollapsed={!showRightPanel} />
{/* ControlBar como footer fijo */}
); } export default Studio;