MeetingRoomShell — Wrapper standalone del popup de videollamada (/reunion)
MeetingRoomShell
Archivo: src/components/widgets/MeetingRoomShell.tsx
Introducido: s80 (22-05-2026)
Sprint: s80
Descripción
MeetingRoomShell es el componente React que actúa de wrapper para la página standalone /reunion, montada como ventana popup independiente del navegador. Su responsabilidad es leer los parámetros de la URL (author, target, silent), inicializar el título del documento y renderizar MeetingRoom cubriendo el 100% del viewport del popup. Al cerrar la reunión (botón Colgar o tecla Esc), llama a window.close() para cerrar la ventana del navegador.
Responsabilidades
| Responsabilidad | Detalle |
|---|---|
| Lectura de query params | readParams() extrae author, target y silent de window.location.search; SSR-safe (devuelve defaults si window no está disponible) |
| Título de ventana | useEffect → document.title = "Reunión · {author}" para que la barra de título del popup muestre el contexto |
| Montaje de MeetingRoom | Renderiza <MeetingRoom author target silent onClose /> con los params leídos |
| Cierre del popup | onClose callback ejecuta window.close() — singleton de ventana, sin coordinar con el WS |
Query params aceptados
| Param | Tipo | Default | Descripción |
|---|---|---|---|
author | string | 'anon' | Nombre del usuario que abre la reunión (Edu/Dani/Txell) |
target | string | 'Todos' | Destinatario explícito de la convocatoria |
silent | '1' | false | Si es '1', no anuncia al chat que el usuario se ha unido (caso «Unirme» a reunión ya convocada) |
Relación con el flujo de apertura
TeamChat (botón Video / "Unirme")
└─ openMeetingPopup(author, target, silent)
└─ window.open('/reunion?author=...&target=...', 'crearack-meeting', 'popup=yes,...')
└─ /reunion.astro → <MeetingRoomShell client:only="react" />
└─ <MeetingRoom />
window.open usa el name 'crearack-meeting' como singleton: si ya hay una ventana popup viva con ese nombre, el navegador la refoca en vez de abrir otra. Esto impide duplicar sesiones WebRTC.
Notas de implementación
- Usa
useState<Params>(() => readParams())con inicializador lazy para evitar tocarwindowen SSR, aunque la página usaclient:only="react"(defensa barata). - El cleanup de tracks/peers cuando el usuario cierra el popup desde la barra de título del SO lo gestiona el propio
MeetingRoommediante sus listenersbeforeunload+pagehideconnavigator.sendBeacon.MeetingRoomShellno necesita manejar eso.
Archivo de ruta asociado
src/pages/reunion.astro — página standalone que usa AppLayout (globals.css + prefs de tema/acento) sin Sidebar ni BottomNav. Estilos globales html, body { height: 100vh; overflow: hidden; background: #0d0d0d } para que MeetingRoom pueda ocupar el viewport completo.
Véase también
- [[entity—meeting—component—meeting-room]]
- [[decision—20260522—meetingroom-popup-window]]
- [[feature—workspace—webrtc-peer-to-peer]]
- [[decision—20260522—webrtc-reemplaza-jitsi]]