Pular para o conteúdo

Estender a sessão (+5/+10/+15/+30)

Dono pode adicionar tempo à chamada sem encerrar — botões +5, +10, +15, +30 ou picker de horário arbitrário. Sync via Realtime, cliente vê o aviso desaparecer. Cobrado normalmente no add-on.

4 minAtualizado em 06/05/2026

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_id do 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ãoAdicionaCaso de uso
+55 minutos"Só finalizar este pensamento"
+1010 minutosMais tempo confortável pra fechar
+1515 minutosAprofundar em tópico que apareceu
+3030 minutosSessã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:

  1. hora_fim_nova ≥ hora_fim_atual + 5min (mínimo) — não dá pra "encolher" via essa API
  2. hora_fim_nova ≤ 23:59 do mesmo dia (sem rolar pro dia seguinte)
  3. Atualiza agendamentos.hora_fim no banco (publica via Realtime)
  4. 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 estenderhora_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

Esse artigo foi útil?

Ainda não usa a Kontato?

Trial grátis · sem cartão de crédito · cancele quando quiser.

Criar conta grátis