teqo-backup/docs/plans/petition-form-lead-guard-impl.md

2.6 KiB

Impl: PetitionForm — Lead dentro do try pode transformar assinatura commitada em erro (retry duplica)

Status: rascunho Atualizado em: 2026-08-24 Issue: #766 Intenção: body da Issue #766 (sem plano de intenção separado — body é a spec) Appetite restante: herdado (chore P3, ~4 linhas + teste)

Leitura da intenção

  • Outcome: falha de tracking (crypto.randomUUID em contexto não-secure, navegadores antigos) nunca mais vira erro de UI após assinatura commitada — eliminando retry duplicado e re-disparo de Lead.
  • O que NÃO negociar: assinatura commitada deve sempre mostrar sucesso; tracking invisível ao visitante; no máximo um Lead por captura.
  • O que reavaliar: nada — padrão já resolvido no S10 (CampaignNewsletterForm), replicar no PetitionForm.

Abordagem recomendada

flowchart LR
  A[submitPetitionSignature ok] --> B{facebookPixelId set?}
  B -- sim --> C[try trackMetaLead]
  C -- throw --> D[catch vazio — tracking invisível]
  B -- não --> E[reset + sucesso]
  C -- ok --> E

Opções consideradas: A) guarda interna try/catch no bloco de tracking; B) mover tracking para fora do try de submit. Recomendação: A — espelha exatamente o padrão S10 já aplicado e revisado em CampaignNewsletterForm.tsx:59-65. Rejeitadas: B — cria fluxo de sucesso fora do try com estado sutil; divergiria do precedente consolidado.

Componentes / mudanças

  • PetitionForm.onSubmit (src/components/PetitionForm.tsx): envolver trackMetaLead(...) em try/catch próprio com catch vazio.
  • Migration: sem migration.
  • Access / Consent: não se aplica.
  • UI: nenhuma mudança de UI.

Fases verificáveis

  1. Código — guarda interna no PetitionForm (~4 linhas).
  2. Teste — unit espelhando campaignNewsletterLead.unit.spec.tsx: Lead uma vez com pixel em captura ok; tracking que lança não vira erro de UI; nenhum Lead sem pixel.
  3. Gates — pnpm gate:fast; push via pnpm push.

Rabbit holes / Não escopo (engenharia)

  • Não mexer no trackMetaLead (já no-op seguro sem fbq).
  • Não tocar no CampaignNewsletterForm (já corrigido).
  • Sem e2e novo: superfície já coberta por e2e existente da petição; o teste unit cobre o contrato do Lead.

Riscos e mitigação

  • Teste unit do form é frágil (jsdom + Radix comboboxes): copiar scaffolding já provado do spec S10 (ResizeObserver stub, fireEvent.input nativo). Baixo.

Aceite de engenharia

  • Aceite de produto da intenção ainda coberto
  • Invariantes AGENTS/engineering-standards
  • Testes de domínio previstos (unit) onde write paths mudam