A extensão de sessão permite que o dono adicione tempo à chamada sem encerrar — útil quando a conversa rendeu mais que o esperado e você não quer cortar abruptamente.
Quem pode estender?
Apenas o dono (RN-V01). Cliente nunca vê os botões de extensão. Implementação:
- API valida
negocio_iddo agendamento contra a sessão autenticada - Componente
ExtensaoControleé renderizado condicionalmente (isOwner=true)
Onde aparecem os controles
Modo 1 — Dropdown completo no header (sempre visível pro dono)
No header da VideoSala, há um dropdown com:
- Countdown ao vivo: ícone Clock + horário de fim atual + "(N min restantes)"
- Cor do clock muda conforme tempo: 🟢 verde (acima de 5min) → 🟡 amarelo (abaixo de 5min) → 🔴 vermelho (abaixo de 2min)
- Click abre menu com:
- 4 presets: +5, +10, +15, +30 minutos
- Cada preset mostra "até HH:MM" (resultado se aplicar)
- Picker
<input type="time">pra escolher horário arbitrário
Modo 2 — Inline dentro dos toasts T-5min e T-1min
Quando o sistema dispara o toast de aviso de fim (Tempo da sessão), os mesmos 4 botões aparecem inline dentro do toast — pra dono estender com 1 click sem precisar abrir dropdown:
🕐 A chamada termina em 5 minutos.
[+5] [+10] [+15] [+30]
Click direto → estende → toast some → continua a chamada.
Os 4 presets fixos
| Botão | Adiciona | Caso de uso |
|---|---|---|
| +5 | 5 minutos | "Só finalizar este pensamento" |
| +10 | 10 minutos | Mais tempo confortável pra fechar |
| +15 | 15 minutos | Aprofundar em tópico que apareceu |
| +30 | 30 minutos | Sessão dobrou de escopo |
Se o preset passaria de 23:59 do mesmo dia, fica disabled (cinza, sem click) com tooltip "Passa de 23:59".
Picker arbitrário (modo dropdown completo)
No menu dropdown do header tem também:
Definir horário: [HH:MM] [Aplicar]
- Mínimo permitido: hora_fim_atual + 5 min
- Máximo: 23:59 do mesmo dia
Útil pra estender em quantidades não-padrão (ex: até 14:47 exato).
O que acontece no backend
Click → POST /api/agendamentos/{id}/estender-sessao com payload:
{ delta_minutos: 5, metodo: "botao" }(preset){ nova_hora_fim: "14:45", metodo: "picker" }(horário direto)
Backend valida:
- hora_fim_nova ≥ hora_fim_atual + 5min (mínimo) — não dá pra "encolher" via essa API
- hora_fim_nova ≤ 23:59 do mesmo dia (sem rolar pro dia seguinte)
- Atualiza
agendamentos.hora_fimno banco (publica via Realtime) - Atualiza
video_sessoes.expira_em=nova_hora_fim + 2min(buffer pro Daily não cortar antes)
Cliente vê o que?
Cliente recebe a nova_hora_fim via Supabase Realtime automaticamente:
- Toast T-5min/T-1min que estava aparecendo some (re-agendado pra próxima janela)
- Banner T-15s some se já estava ativo
- Header da sala atualiza pra "Atendimento até [novo HH:MM]"
- Cliente NÃO vê quanto tempo foi adicionado — só percebe que o aviso sumiu e continua
Decisão de design: cliente não precisa saber "+10min foram adicionados" porque o foco dele é a conversa, não o cronômetro.
Custo no add-on
Cada minuto extra é cobrado normalmente no add-on (R$ 0,30/min). Estender +30min em chamada de 30min vira chamada de 1h = R$ 18,00 no item da fatura.
Sem desconto, sem free tier extra, sem nada — extensão é uso normal cobrado pós-pago.
Em trial (15min cumulativos), estender pode esgotar o trial mid-extensão — sistema vai encerrar automaticamente quando bater os 900 segundos totais (mesmo se você tentou estender +30 antes).
Conflito com próximo agendamento da mesma agenda
⚠️ Limitação atual (v0.28.x): o endpoint estender-sessao NÃO valida se o novo hora_fim colide com o próximo agendamento da mesma agenda.
Cenário problemático:
- 14:00–14:30: Maria (em curso, dono estende +30 pra 15:00)
- 14:30–15:00: João (já agendado)
Resultado: a chamada da Maria continua ativa até 15:00 mesmo com o slot do João começando às 14:30. O João vai entrar no /v/[token] dele e a sala dele é uma instância Daily separada — então tecnicamente não há colisão de mídia. Mas o dono está em duas chamadas conceitualmente sobrepostas.
Recomendação operacional:
- Antes de clicar +30 ou picker tarde demais, olhe a sua agenda pra confirmar que o próximo slot está livre
- Roadmap futuro: validação server-side com retorno 409 se overlap detectado
Múltiplas extensões em sequência
Sem limite. Você pode clicar +10, +5, +10 → atualiza hora_fim 3 vezes → cada update dispara Realtime → cliente recebe os 3 updates.
Sistema é idempotente (hora_fim é o estado, não delta acumulado em log).
Edge cases
Falha de rede ao estender
Click → fetch falha → componente mostra erro vermelho "Falha ao estender" abaixo do dropdown. Você pode tentar de novo. Estado da chamada não muda.
Cliente perdeu Realtime
Se cliente está com banda ruim e o Realtime falhou, ele pode continuar vendo o toast antigo de fim. Quando reconectar (ou no próximo tick do hook), vai sincronizar a nova hora_fim. Sem bug — só atraso visual.
Dono fecha aba durante extensão
A request continua executando no servidor. Banco vai ser atualizado mesmo assim. Próxima vez que dono abrir, vai ver hora_fim atualizada.
Não dá pra encolher (reduzir tempo)
A API só aceita estender — hora_fim_nova ≥ hora_fim_atual + 5min. Não tem botão "-5min". Decisão de design: encolher chamada em curso é confuso pro cliente (toast T-5min apareceria sem motivo). Pra encerrar antes do previsto, use botão Sair normalmente.
Próximos artigos
- Tempo da sessão e avisos — onde aparecem os toasts
- Botões da sala — glossário completo
- Como ativar vídeo — trial vs add-on