Feature: Sala de Reunião
Introdução ao documento
Este documento cobre a experiência de reunião coletiva e de grupo baseada em Jitsi, incluindo resolução de credenciais, presença automática e fluxo de recuperação associado. Evidências: src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:13-45, src/app/(protected-routes)/grupo/[slug]/page.tsx:15-44, src/components/MeetingRoom/MeetingRoom.component.tsx:90-289.
Versionamento
- Documento criado em
2026-03-20. - Revisar quando mudarem as páginas
/sala-de-reuniao/*,/grupo/[slug],MeetingRoom,MeetRoomou/api/presence/auto. Evidências:src/app/(protected-routes)/sala-de-reuniao/page.tsx:7-15,src/app/(protected-routes)/grupo/[slug]/page.tsx:15-44,src/components/MeetingRoom/MeetingRoom.component.tsx:206-229,src/app/api/presence/auto/route.ts:6-38.
Referencial teórico
O comportamento foi derivado das páginas de sala, do wrapper MeetRoom, do componente MeetingRoom e das rotas de presença. Evidências: src/components/MeetRoom/MeetRoom.component.tsx:20-139, src/components/MeetingRoom/MeetingRoom.component.tsx:131-289, src/app/services/bff/ClassService.ts:73-99.
Visão geral
- A rota
/sala-de-reuniao/{classId}resolve credenciais da sala coletiva da turma. Evidências:src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:23-42. - A rota
/grupo/{slug}resolve credenciais de sala de grupo com base em turma, usuário e identificador do grupo. Evidências:src/app/(protected-routes)/grupo/[slug]/page.tsx:21-42. - O componente
MeetingRoommonta a chamada Jitsi, lida com drawer lateral e dispara presença automática para aluno em sala coletiva. Evidências:src/components/MeetingRoom/MeetingRoom.component.tsx:185-229,src/components/MeetingRoom/MeetingRoom.component.tsx:286-292.
Atores
- Participante em sala coletiva. Evidências:
src/components/MeetingRoom/MeetingRoom.component.tsx:223-229. - Facilitador/supervisor moderando a sala. Evidências:
src/components/MeetingRoom/MeetingRoom.component.tsx:185-193,src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:38-42. - Serviços Jitsi e backend de turma/presença. Evidências:
src/components/MeetingRoom/MeetingRoom.component.tsx:131-183,src/app/api/jitsi/config/route.ts:3-18,src/app/api/presence/auto/route.ts:6-38.
Pré-condições
- Sessão válida. Evidências:
src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:18-21,src/app/(protected-routes)/grupo/[slug]/page.tsx:16-19. - Credenciais válidas de sala (
updRoomName,updRootToken). Evidências:src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:31-42,src/components/MeetingRoom/MeetingRoom.component.tsx:231-240. classIdpresente no contexto para o wrapper/sala-de-reuniaosem slug. Evidências:src/components/MeetRoom/MeetRoom.component.tsx:73-108.
Fluxo principal
- A página autenticada resolve credenciais da sala a partir da turma ou do grupo. Evidências:
src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:23-42,src/app/(protected-routes)/grupo/[slug]/page.tsx:21-42. MeetingRoomescolhe a URL do servidor Jitsi com prioridade para credencial direta, depois/api/jitsi/config, depoismeet.jit.si. Evidências:src/components/MeetingRoom/MeetingRoom.component.tsx:131-159,src/app/api/jitsi/config/route.ts:3-18.- Para Jitsi on-premises, o nome da sala é limpo para remover
app_idantes da barra. Evidências:src/components/MeetingRoom/MeetingRoom.component.tsx:161-183. - Em sala coletiva e para não-admin, a UI agenda presença automática após 10 minutos. Evidências:
src/components/MeetingRoom/MeetingRoom.component.tsx:206-229. - A chamada Jitsi é montada com
jwt,domain,roomNameesubject. Evidências:src/components/MeetingRoom/MeetingRoom.component.tsx:286-297.
Fluxos alternativos
- O wrapper
/sala-de-reuniaosem slug só redireciona para a rota específica da turma. Evidências:src/components/MeetRoom/MeetRoom.component.tsx:96-108. - Se faltar credencial, a UI mostra
NotifyModale orienta o usuário a tentar novamente. Evidências:src/components/MeetRoom/MeetRoom.component.tsx:118-127,src/components/MeetingRoom/MeetingRoom.component.tsx:231-240. - Enquanto a configuração Jitsi está carregando, a UI exibe placeholder textual. Evidências:
src/components/MeetingRoom/MeetingRoom.component.tsx:242-259.
Regras de negócio
- A presença automática só roda para usuário não-admin em
roomType === 'ClassRoom'. Evidências:src/components/MeetingRoom/MeetingRoom.component.tsx:223-229. - Se
setAutoPresenceByClassIdresponder403, o componente reprograma a presença automática. Evidências:src/components/MeetingRoom/MeetingRoom.component.tsx:212-219. - Drawers laterais de atividade só aparecem quando a turma tem
enable_strategic_activities. Evidências:src/components/MeetingRoom/MeetingRoom.component.tsx:185-191. - A sala faz fallback para
meet.jit.siquando nem credencial nem/api/jitsi/configinformam servidor. Evidências:src/components/MeetingRoom/MeetingRoom.component.tsx:135-146.
Estados possíveis
loading_config: configuração Jitsi ainda carregando. Evidências:src/components/MeetingRoom/MeetingRoom.component.tsx:242-259.sem_credencial: modal de erro. Evidências:src/components/MeetingRoom/MeetingRoom.component.tsx:231-240.presenca_programada: presença automática iniciada. Evidências:src/components/MeetingRoom/MeetingRoom.component.tsx:206-229.em_reuniao: componenteJitsiMeetingrenderizado. Evidências:src/components/MeetingRoom/MeetingRoom.component.tsx:286-292.
Endpoints envolvidos
- Ver OpenAPI:
GET /api/room/{id},GET /api/jitsi/config,POST /api/presence/auto,POST /api/presence/recovery. - O fluxo
/grupo/[slug]usa serviço externo de turma para credenciais, sem rota local dedicada nomeadagroup.
Evidências: src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:23-42, src/app/(protected-routes)/grupo/[slug]/page.tsx:24-29, src/app/api/jitsi/config/route.ts:3-18, src/app/api/presence/auto/route.ts:6-38, src/app/api/presence/recovery/route.ts:6-39.
Dados impactados
- Ver model.md:
Class,MeetingRecover, presença de recuperação e estado da reunião. - O wrapper
MeetRoomtambém lê credenciais de cookie/sessionStorage (updRoomCredentials,updRoom1on1Credentials). Evidências:src/components/MeetRoom/MeetRoom.component.tsx:20-49.
Pendências
- O contrato completo das credenciais retornadas por
getGroupRoomnão está formalizado além do uso local. - Não há documentação de gravação/retomada de reuniões no repositório.