Implementei um chat drawer interativo na hero da home page que se comunica com o webhook da deco.chat. A funcionalidade permite que os usuários digitiem uma pergunta no input da hero e abram um chat em tempo real.
islands/ChatDrawer.tsx- Componente Island para interatividadesections/new-home/NewHomeHero.tsx- Hero modificada para integrar o chat.deco/blocks/pages-home-5afd25174424.json- Configuração atualizada
- Fechado: Não visível na tela
- Aberto: Drawer completo com chat funcional
- Minimizado: Pequeno botão arredondado no canto inferior direito
- Mobile: Chat ocupa tela inteira quando aberto
- Desktop: Chat em drawer lateral (396px width)
- Minimizado: 320px x 64px no canto inferior direito
- Transições suaves de 500ms com easing
- Backdrop blur quando aberto
- Indicador de digitação com pontos animados
- Scroll automático para novas mensagens
- Header com gradiente primary-light → primary-dark
- Mensagens do usuário em primary-dark
- Mensagens do agente em dc-100
- Timestamps em cada mensagem
- Usuário digita no input da hero → Pressiona Enter ou clica no botão
- Chat drawer abre automaticamente → Input fica preenchido com a mensagem
- Usuário confirma/edita a mensagem → Pressiona enviar
- Mensagem enviada via webhook → Loading state ativado
- Resposta do agente recebida → Exibida no chat com animação
// URL configurada no JSON block
const webhookUrl = "https://api.deco.chat/actors/Trigger/invoke/run?passphrase=undefined&deno_isolate_instance_id=/shared/deco.cx/Agents/a213785a-57b4-4800-a207-e408fb476841/triggers/632bce52-a316-43d0-a724-bd1de45d980b&output_tool=undefined"
// Formato da requisição
{
"message": "Pergunta do usuário"
}
// Formato esperado da resposta
{
"message": "Resposta do agente"
}- isLoading: Controla se pode enviar nova mensagem
- isTyping: Mostra indicador de digitação
- Timeout de 1 segundo para simular digitação natural
- Minimizar (
removeicon): Minimiza o chat para o canto - Fechar (
closeicon): Fecha completamente o chat
- Backdrop click: Minimiza o chat (não fecha)
- Chat minimizado click: Reabre o chat
- Enter no input: Envia mensagem
- Botão enviar: Envia mensagem
// Hero renderiza o ChatDrawer e configura handlers
<ChatDrawer
webhookUrl={chatWebhookUrl}
placeholder={inputPlaceholder}
/>;
// Script para conectar input com chat
window.openChatDrawer = openChat;// Gerencia estado e comunicação com webhook
const [isOpen, setIsOpen] = useState(false);
const [isMinimized, setIsMinimized] = useState(false);
const [messages, setMessages] = useState<Message[]>([]);
// Função exposta globalmente
useEffect(() => {
(window as any).openChatDrawer = openChat;
}, []);- Mobile (< 640px): Chat full-screen
- Tablet (640px+): Chat em drawer
- Desktop (1024px+): Chat posicionado melhor
- Chat ocupa
w-full h-fullem telas pequenas - Botões maiores para touch
- Espaçamento otimizado
- Persistência: Salvar mensagens no localStorage
- Notificações: Badge de novas mensagens quando minimizado
- Emoji Picker: Adicionar suporte a emojis
- File Upload: Permitir envio de arquivos
- Voice Input: Integração com Web Speech API
- Custom Styling: Permitir personalização de cores
- Multiple Agents: Suporte a diferentes agentes/workflows
- Conversation History: Histórico de conversas anteriores
- Digite uma pergunta no input da hero
- Pressione Enter ou clique no botão de enviar
- O chat abrirá automaticamente com sua pergunta
- Confirme ou edite a mensagem e pressione enviar
- Aguarde a resposta do agente da deco.chat
- Continue a conversa ou minimize/feche quando terminar
A funcionalidade está completamente implementada e pronta para uso! 🎉