A sala de vídeo da Kontato tem gestão de tempo automática baseada na hora_fim do agendamento. Você não precisa cronometrar nada — o sistema avisa nos momentos certos e (em alguns cenários) encerra automaticamente.
Os 3 marcos de aviso
A partir do momento que você entra na sala, o sistema agenda 3 toasts/banners conforme a hora_fim do agendamento:
| Quando | Componente visual | Cor | Duração |
|---|---|---|---|
| 5 minutos antes | Toast top-right | 🟡 Amarelo | 8 segundos |
| 1 minuto antes | Toast top-right | 🟠 Laranja | 8 segundos |
| 15 segundos antes | Banner fixo no topo | 🔴 Vermelho pulsante | até zerar |
O que cada um diz
- T-5min (amarelo): "A chamada termina em 5 minutos." — relax, dá tempo de fechar tópico
- T-1min (laranja): "A chamada termina em 1 minuto." — alerta, hora de despedir
- T-15s (vermelho banner): "Encerrando em 15… 14… 13…" — countdown ao vivo, banner não some até
00
Quem vê?
Ambos dono e cliente veem todos os toasts (isOwner é apenas pra renderizar controles inline de extensão que ficam dentro do toast — só dono pode estender).
Estendendo a chamada
Quando aparece o toast T-5min ou T-1min, só o dono vê os botões inline:
- +5 min
- +10 min
Click → agendamentos.hora_fim é atualizado no banco → todos os clientes conectados (incluindo cliente remoto) recebem a nova hora_fim via Supabase Realtime → toasts são re-agendados automaticamente pra nova janela.
Sync em tempo real: cliente vê o aviso desaparecer e a chamada continuar normalmente quando o dono estende. Cliente NÃO vê quanto tempo a mais foi adicionado — só sabe que o aviso sumiu.
Lobby NÃO consome tempo
Tempo no lobby (cliente esperando autorização do dono) não conta pra nenhum cronômetro:
- ❌ Não conta pro trial (15min cumulativos do negócio)
- ❌ Não dispara toasts T-5min/T-1min (toasts só aparecem após
joined-meeting) - ❌ Não conta no consumo do add-on (R$ 0,30/min)
Cronômetro começa do primeiro joined-meeting ao último leave-meeting.
Útil pra cenários onde o cliente entra cedo: ele pode esperar 10 minutos no lobby sem custo nem desperdício de trial.
Trial vs add-on — limites diferentes
Trial (15 min cumulativos por negócio)
- Todo negócio tem 15 minutos gratuitos cumulativos de vídeo (
TRIAL_LIMITE_SEGUNDOS = 900) - Soma TODAS as sessões — não é por chamada
- Quando atinge 15min totais, a próxima chamada NÃO conecta (mostra
TrialEsgotadoViewcom CTA pra ativar add-on) - Se o trial esgota mid-call (ex: tinha 14min42s cumulativos, entra numa chamada e ao chegar em 18s totais bate 15min), a sessão é encerrada automaticamente — substitui a tela da
PesquisaQualidadeporTrialEsgotadoView
Add-on de vídeo (R$ 0,30/min pós-pago)
- Sem limite individual de chamada — você pode ter chamada de 3 horas se quiser
- Cobrança pós-paga: cada chamada vira um item na fatura mensal
- Arredondado pra cima por minuto fracionado (chamada de 1m30s = 2min cobrados)
- Toasts T-5min/T-1min/T-15s continuam funcionando (baseados na
hora_fimdo agendamento, não no add-on)
E se a chamada estourar a hora_fim?
A hora_fim do agendamento não força encerramento automaticamente. A Kontato apenas:
- Mostra o banner T-15s pulsante até zerar
- Banner zerado → continua no overlay mostrando
Encerrando em 0… - NÃO desconecta a sala automaticamente — quem encerra é dono ou cliente clicando "Sair"
Decisão de design: queremos que dono tenha controle final mesmo se chamada estourou — pra fechar com elegância em vez de cortar abruptamente.
Se add-on está ativo e a chamada vai até as 14:35 mesmo com
hora_fim=14:30, os 5 minutos extras são cobrados normalmente no add-on.
Edge cases
Relógio do cliente vs servidor
O cálculo do tempo restante usa Date.now() do navegador do user. Se o relógio do user está descalibrado (ex: 5 minutos atrasado), os toasts saem 5 minutos atrasados pra ele.
Em prática isso é raro — celulares modernos sincronizam NTP. Mas vale lembrar em PCs corporativos sem sync.
Chamada cai e volta
Se o cliente perde conexão (banda ruim) e volta:
useTempoSessaore-monta no remount- Lê
agendamentos.hora_fimatual via Realtime - Re-agenda os 3 toasts conforme tempo restante
- Se o user voltou DEPOIS do T-5min mas antes do T-1min → toast T-5min não aparece (já passou); T-1min vai aparecer normal
Múltiplas extensões
Dono clica "+5min" 3 vezes seguidas → hora_fim atualiza 3 vezes → toasts re-agendam 3 vezes. Sem bug — sistema lida com cada update individualmente.
Hora_fim mal-formada
Em casos raros (DB corrompido, edge case), se hora_fim vem como string inválida, o hook usa fallback +1h a partir de agora — chamada não trava, toasts ainda funcionam (com horário aproximado).
Cliente vê o contador?
NÃO. Não há cronômetro HH:MM:SS persistente na sala (decisão de design — cronômetro causa ansiedade). Cliente só vê:
- Os mesmos toasts que o dono vê
- O banner T-15s pulsante
- O horário de fim previsto no header (ex: "Atendimento até 14:30") — atualiza em real-time se dono estender
Customização (futuro, não MVP)
Hoje os 3 marcos (5min, 1min, 15s) são fixos. Roadmap futuro pode incluir:
- Dono escolher os marcos (ex: T-10min em vez de T-5min)
- Aviso só visual sem som vs com bipe sonoro
- Auto-encerramento ao bater hora_fim (opt-in)
Por enquanto, padrão fixo serve 95% dos casos sem complexidade adicional.
Próximos artigos
- Extensão de sessão — botões +5/+10 do dono
- Como ativar vídeo — trial + add-on
- Jornada do cliente — incluindo lobby