Back to .md Directory

πŸŽ™οΈ Fluxo: O Que Acontece Quando Para a GravaΓ§Γ£o de Áudio

Documents two different flows for stopping audio recording in a meeting app, one automatic and one manual, with visual feedback and data generation.

May 2, 2026
0 downloads
0 views
ai
View source

What this file does

Documents two different flows for stopping audio recording in a meeting app, one automatic and one manual, with visual feedback and data generation.

When to use it

  • You need to understand the difference between stopping recording from a floating button vs a canvas node
  • You want to implement automatic node generation after recording stops
  • You need to add WhatsApp notifications after processing meeting audio
  • You are designing visual feedback for recording and processing states

Assumes this stack

ReactTypeScriptReact FlowSupabase

πŸŽ™οΈ Fluxo: O Que Acontece Quando Para a GravaΓ§Γ£o de Áudio

πŸ“ Componentes Envolvidos

1. MeetingAI.tsx - BotΓ£o Flutuante

LocalizaΓ§Γ£o: Canto inferior da tela

2. MeetingNode.tsx - NΓ³ de ReuniΓ£o no Canvas

LocalizaΓ§Γ£o: Canvas do React Flow


πŸ”„ FLUXO COMPLETO

Quando vocΓͺ para a gravaΓ§Γ£o no MeetingAI (botΓ£o flutuante):

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1. UsuΓ‘rio clica em "Parar Alinhamento"                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 2. stopRecording() Γ© executado                          β”‚
β”‚    - setStatus('processing')                            β”‚
β”‚    - setIsRecording(false)                              β”‚
β”‚    - AnimaΓ§Γ£o de waveform desaparece                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 3. Processamento de IA (3 segundos)                     β”‚
β”‚    - Status muda para "Processando IA..."              β”‚
β”‚    - Badge aparece: "Analisando contexto editorial..." β”‚
β”‚    - BotΓ£o fica desabilitado                            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 4. IA Processa o Áudio                                  β”‚
β”‚    - TranscriΓ§Γ£o do Γ‘udio                               β”‚
β”‚    - ExtraΓ§Γ£o de entidades (tarefas, prazos, etc.)     β”‚
β”‚    - GeraΓ§Γ£o de JSON estruturado                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 5. autoGenerateNodesFromMeeting() Γ© chamado             β”‚
β”‚    - Cria nΓ³s de tarefas no canvas                      β”‚
β”‚    - Conecta ao nΓ³ de reuniΓ£o                           β”‚
β”‚    - Adiciona checklists, deadlines, assignees          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 6. Status volta para 'idle'                            β”‚
β”‚    - BotΓ£o volta ao estado inicial                      β”‚
β”‚    - Pronto para nova gravaΓ§Γ£o                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š DADOS GERADOS

Mock Result (Exemplo):

{
  campaignName: "LanΓ§amento NewsFlow V4.1",
  tasks: [
    { 
      label: "ProduΓ§Γ£o de VΓ­deo Teaser", 
      assignee: "Video Edit", 
      deadline: "2024-01-10",
      checklist: ["Roteiro", "GravaΓ§Γ£o", "EdiΓ§Γ£o Final"]
    },
    { 
      label: "Copywriting para Landing Page", 
      assignee: "Copywriter", 
      deadline: "2024-01-09",
      checklist: ["Headline", "BenefΓ­cios", "CTA"]
    },
    { 
      label: "Setup de Ads (IG/FB)", 
      assignee: "Traffic Manager", 
      deadline: "2024-01-11",
      checklist: ["PΓΊblicos", "Criativos", "Pixel"]
    }
  ]
}

🎯 Quando vocΓͺ para a gravaΓ§Γ£o no MeetingNode (nΓ³ no canvas):

Fluxo Diferente:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1. UsuΓ‘rio clica em "Parar GravaΓ§Γ£o"                    β”‚
β”‚    - setIsRecording(false)                              β”‚
β”‚    - BotΓ£o volta para "Gravar Áudio"                    β”‚
β”‚    - ❌ NΓƒO processa automaticamente                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 2. UsuΓ‘rio precisa clicar em "IA: Gerar Ata & Tarefas" β”‚
β”‚    - handleProcessIA() Γ© executado                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 3. Processamento de IA (3 segundos)                     β”‚
β”‚    - Gera transcript                                    β”‚
β”‚    - Extrai taskList                                    β”‚
β”‚    - Atualiza nΓ³ de reuniΓ£o                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 4. autoGenerateNodesFromMeeting(id)                     β”‚
β”‚    - Cria nΓ³s filhos conectados                        β”‚
β”‚    - Cada tarefa vira um nΓ³                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 5. WhatsAppAlerts.sendMeetingMinute()                   β”‚
β”‚    - Envia ata da reuniΓ£o via WhatsApp                  β”‚
β”‚    - Notifica stakeholders                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ” DETALHES TΓ‰CNICOS

MeetingAI.tsx - stopRecording()

const stopRecording = () => {
  setStatus('processing');        // Muda para processando
  setIsRecording(false);          // Para a gravaΓ§Γ£o
  
  // SimulaΓ§Γ£o de processamento (3 segundos)
  setTimeout(async () => {
    const mockResult = {
      campaignName: "...",
      tasks: [...]
    };
    
    await autoGenerateNodesFromMeeting(mockResult);
    setStatus('idle');
  }, 3000);
};

MeetingNode.tsx - handleProcessIA()

const handleProcessIA = async () => {
  setIsProcessingIA(true);
  
  // Processa Γ‘udio
  setTimeout(async () => {
    const updatePayload = {
      transcript: "...",
      taskList: [...],
      isProcessing: false,
      status: 'done'
    };
    
    // 1. Atualiza nΓ³
    updateNodeData(id, updatePayload);
    
    // 2. Gera nΓ³s filhos
    await autoGenerateNodesFromMeeting(id);
    
    // 3. Envia WhatsApp
    await WhatsAppAlerts.sendMeetingMinute(...);
  }, 3000);
};

πŸ“ DIFERENΓ‡AS ENTRE OS DOIS

AspectoMeetingAI (Flutuante)MeetingNode (Canvas)
Processamento AutomΓ‘ticoβœ… Sim (3s apΓ³s parar)❌ NΓ£o (precisa clicar)
GeraΓ§Γ£o de NΓ³sβœ… Simβœ… Sim
Envio WhatsApp❌ NΓ£oβœ… Sim
AtualizaΓ§Γ£o do Nó❌ NΓ£oβœ… Sim
Transcript❌ NΓ£o salvoβœ… Salvo no nΓ³

🎨 FEEDBACK VISUAL

Durante GravaΓ§Γ£o:

  • βœ… AnimaΓ§Γ£o de waveform (12 barras animadas)
  • βœ… BotΓ£o vermelho com Γ­cone de stop
  • βœ… Texto: "Gravando Áudio..."

ApΓ³s Parar (Processing):

  • βœ… Badge flutuante: "Analisando contexto editorial..."
  • βœ… BotΓ£o com spinner (Loader2)
  • βœ… Texto: "Processando IA..."
  • βœ… BotΓ£o desabilitado

ApΓ³s Processar:

  • βœ… NΓ³s aparecem no canvas
  • βœ… Status volta para 'idle'
  • βœ… BotΓ£o volta ao estado inicial

πŸ”„ INTEGRAÇÃO COM STORE

autoGenerateNodesFromMeeting()

LocalizaΓ§Γ£o: store.ts (linha 328)

O que faz:

  1. Busca o nΓ³ de reuniΓ£o
  2. Cria novos nΓ³s para cada tarefa
  3. Conecta os nΓ³s ao nΓ³ de reuniΓ£o
  4. Adiciona checklists, deadlines, assignees
  5. Persiste no Supabase

πŸš€ PRΓ“XIMOS PASSOS (Melhorias Futuras)

  1. Gravação Real de Áudio

    • Usar MediaRecorder API
    • Salvar arquivo de Γ‘udio
    • Enviar para serviΓ§o de transcriΓ§Γ£o
  2. IntegraΓ§Γ£o com IA Real

    • Google Speech-to-Text
    • Gemini para extraΓ§Γ£o de entidades
    • Processamento em tempo real
  3. NotificaΓ§Γ΅es

    • Toast quando processamento terminar
    • Som de conclusΓ£o
    • Badge de notificaΓ§Γ£o

βœ… Fluxo completo documentado!

What's inside

Two flow diagrams, a mock data example, technical code snippets, a comparison table, visual feedback details, and future improvements list.

Change this for your project

  • Replace autoGenerateNodesFromMeeting with your own node generation function
  • Replace WhatsAppAlerts.sendMeetingMinute with your notification service
  • Replace mock data structure { campaignName, tasks } with your own data model
  • Replace setTimeout delays (3000ms) with actual async processing

Where it goes

Keep it in your repository where the agent or team that needs it will read it.

Worth borrowing

  • Using a status state machine (idle β†’ processing β†’ idle) to control UI and disable buttons
  • Separating automatic processing (floating button) from manual processing (canvas node) for different user expectations
  • Providing a comparison table to highlight differences between two similar flows

Related Documents