1. MessageArea: handleRedownloadMedia usava selectedChat?.instanceId (undefined
no formato legado) — substituído por instance_name ?? instanceId. O clique
em 'Toque para baixar áudio' agora chama o backend corretamente.
2. MessageBubble/AudioBubble: botão de velocidade (1×/1.5×/2×) movido para
entre o botão play e as barras do waveform, conforme layout do WhatsApp.
A linha inferior agora exibe apenas o tempo decorrido.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Armazena payload WAMessage (serializado com _b64 para Uint8Array) em
messages.mediaPayload no momento da recepção da mensagem
- Nova rota POST /instances/:id/redownload-media/:msgId que usa
sock.updateMediaMessage para renovar URL expirada + re-upload Wasabi
- Frontend: placeholders clicáveis (spinner + texto) para imagem, vídeo,
áudio, documento e figurinha sem media_url; atualização automática via
socket message:media_ready existente
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>