FEAT: Painel de templates HSM com preview WhatsApp e integração Meta
Some checks are pending
Deploy Dev / deploy (push) Waiting to run

- TemplateManagementPanel reescrito: form com header/body/footer/
  botões (Quick Reply, URL, Ligar) e preview visual estilo WhatsApp
- Detecção automática de variáveis {{1}} {{2}} com editor de rótulo
  e exemplo para cada variável do corpo
- Cartões de template com status Meta (Aprovado/Aguardando/Rejeitado)
  e ações Editar, Enviar para Meta, Excluir
- Botão Sincronizar para buscar status atualizado da Meta API
- WhatsappConfigModal agora inclui campo WABA ID (obrigatório para
  criação e sincronização de templates)
- templateService.js: submitTemplateToMeta() e syncTemplatesFromMeta()

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Rafael Alves Lopes 2026-06-23 09:57:09 -03:00
parent e2e3e626c4
commit aed077f344
3 changed files with 702 additions and 416 deletions

File diff suppressed because it is too large Load Diff

View File

@ -40,6 +40,7 @@ export function WhatsappConfigModal({ onClose }) {
phone_number_id: '',
api_version: 'v25.0',
webhook_token: '',
waba_id: '',
});
useEffect(() => {
@ -51,6 +52,7 @@ export function WhatsappConfigModal({ onClose }) {
phone_number_id: data.phone_number_id || '',
api_version: data.api_version || 'v25.0',
webhook_token: data.webhook_token || '',
waba_id: data.waba_id || '',
}));
})
.catch(() => setError('Não foi possível carregar a configuração atual.'))
@ -262,6 +264,23 @@ export function WhatsappConfigModal({ onClose }) {
/>
</div>
<div>
<label htmlFor="wa-waba-id" style={labelStyle}>
WABA ID (WhatsApp Business Account ID)
</label>
<input
id="wa-waba-id"
type="text"
placeholder="ex: 123456789012345"
value={form.waba_id}
onChange={(e) => handleChange('waba_id', e.target.value)}
style={fieldStyle}
/>
<p style={{ margin: '0.2rem 0 0', fontSize: '0.75rem', color: 'var(--color-text-soft)', fontWeight: 600 }}>
Necessário para criar e sincronizar templates HSM.
</p>
</div>
<div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '0.65rem' }}>
<div>
<label htmlFor="wa-api-version" style={labelStyle}>

View File

@ -25,14 +25,14 @@ export function updateTemplate(id, payload) {
});
}
export function approveTemplateByAdmin(id) {
return request(`/whatsapp/templates/approve-admin/${id}`, {
export function submitTemplateToMeta(id) {
return request(`/whatsapp/templates/${id}/submit-meta`, {
method: 'POST',
});
}
export function rejectTemplateByAdmin(id) {
return request(`/whatsapp/templates/reject-admin/${id}`, {
export function syncTemplatesFromMeta() {
return request('/whatsapp/templates/sync-meta', {
method: 'POST',
});
}