Pular para o conteúdo

Voltar aos projetos

Projeto na Kobler

Diagnóstico ao vivo para o workshop Appolo

Aplicação web para um workshop presencial de diagnóstico empresarial: o público responde pelo WhatsApp, uma tela projetada mostra as respostas ao vivo e o apresentador avança as perguntas em um painel protegido por PIN.

Cliente
Kobler y Asociados
Contexto
Projeto individual
Período
outubro de 2026 – atual
Tecnologias
  • React
  • TypeScript
  • Vite
  • Tailwind CSS
  • React Router
  • Supabase
  • Vercel
  • Vitest
  • Supabase Realtime
  • n8n
  • WhatsApp

Pontos-chave

  1. Tela pensada para projeção: QR code de entrada pelo WhatsApp, barras ao vivo da pergunta ativa, a média de cada seção por alguns segundos quando ela termina e, no final, os resultados da sala: média por seção, estágio das empresas, principais gargalos, a forma mais comum de organizar a agenda e nuvem de palavras.

  2. Painel do host para notebook ou celular: o acesso é por PIN, os comandos são enviados um de cada vez (um clique duplo em “Próxima” envia apenas um) e os comandos sensíveis pedem confirmação explícita.

  3. Sincronização ao vivo: cada aviso do Supabase Realtime dispara uma consulta do estado completo, com no máximo duas consultas por segundo e uma consulta periódica de reserva a cada 5 segundos (a cada 3 se o canal cair).

  4. Modo demo que simula um evento completo em loop com dados fictícios e passa pelo mesmo sincronizador, para revisar as telas e o design sem uma sala real.

  5. Enquanto está aberta, a tela impede que o computador entre em repouso e esconde o cursor após 3 segundos sem movimento.

Problema

No workshop presencial da Appolo, os participantes respondem pelo WhatsApp a um diagnóstico empresarial de 20 perguntas em três seções (visão e liderança, organização operacional e automação), além de uma pergunta aberta de encerramento. Era preciso projetar para a sala o que ela vai respondendo, ao vivo, e permitir que o apresentador conduzisse o questionário pelo notebook ou pelo celular sem expor as chaves do backend ao navegador.

Solução

A aplicação tem duas visões. A tela ao vivo, somente leitura, mostra o QR code para entrar pelo WhatsApp, a pergunta ativa com suas barras, a média de cada seção quando ela termina, uma nuvem de palavras para a pergunta aberta e os resultados da sala. O painel do host, protegido por PIN, serve para avançar e reenviar perguntas, enviar os resultados, encerrar a sessão e abrir uma nova. A aplicação lê o estado com uma RPC do Supabase, recebe avisos pelo Supabase Realtime e envia os comandos do host ao n8n por meio de funções serverless na Vercel.

Decisões técnicas

  • O navegador nunca vê a chave secreta do Supabase, a chave de host da sessão nem a URL do n8n: o painel conversa com três funções serverless próprias, que validam o PIN e leem do Supabase a sessão vigente a cada requisição, em vez de guardá-la em variáveis de ambiente.
  • O PIN é comparado em tempo constante, sobre o seu hash, para que a duração também não dependa do tamanho, e cada tentativa malsucedida leva cerca de 600 ms.
  • A tela recebe apenas dados agregados e anônimos: nunca nomes nem telefones dos participantes.
  • O encerramento de cada seção é calculado apenas com a resposta da RPC e o horário do servidor; assim, a tela o mostra corretamente mesmo depois de ser recarregada.

Tratamento de falhas

  • Se a rede falhar, a tela mantém o último conteúdo exibido, mostra um aviso discreto de “Reconectando…” e se atualiza sozinha quando a conexão volta. Uma consulta que demora mais de 8 segundos é cancelada e a seguinte tenta de novo.
  • Se uma tela falhar, aparece a mensagem “Algo deu errado” e a página se recarrega sozinha depois de 10 segundos.
  • Se duas pessoas estiverem com o painel aberto, só uma sessão nova é criada, e os comandos do painel que ficou olhando a anterior não são aplicados: o servidor responde com a sessão vigente, e o painel avisa e passa para ela.
  • Tentar de novo repete o último comando exatamente igual; ao avançar, o comando leva a pergunta de onde parte, então uma nova tentativa não pula perguntas.

Meu papel

Escrevi o código deste repositório: as duas visões em React e TypeScript, as funções serverless do host, a sincronização com o Supabase, o modo demo e os testes com Vitest e Testing Library. O backend do evento (o banco de dados no Supabase e os fluxos do n8n do bot de WhatsApp) fica fora do repositório; a aplicação apenas lê o estado dele e envia os comandos do host.

Resultados

  • O apresentador conduz o evento pelo notebook ou pelo celular, e a sala vê ao vivo as respostas agregadas, sem nomes nem telefones.

Código privado por confidencialidade com os clientes; capturas de tela, arquitetura e demonstração disponíveis mediante solicitação.