2.5 KiB
2.5 KiB
Escala/DRY: chrome comum dos passos finais do wizard (pós-B195)
Status: rascunho Atualizado em: 2026-08-10 Issue: #597 (D11) Priority: P2 Kind: chore Depends: #591 (B195) Appetite: ~0,5–1 dia eng
O débito (colhido no /simplify do B195)
O passo final dos wizards de /campanha/acoes duplica o mesmo chrome:
- Submit bar + pendência —
aria-busy/data-pendingno form, bloco de botão comSpinner+ "Salvando…",aria-livesr-only de pendência: idênticos emWizardRegisterDemandStep,WizardUpdateBodyStep,WizardTrendNoteStepeWizardExpectedVotesStep. - Campos do cadastro de demanda — Tipo (NativeSelect), Atividade (
AsyncSearchCombobox) e campo único de texto: copy-paste entreWizardRegisterDemandStepeDemandForm(diferem só no prefixo deide no seletor de município, necessário só no/demandas/nova).
Extração proposta: WizardStepFormChrome (form + pending chrome + submit bar como props pendingAnnouncement/ctaLabel) e um componente de campos de demanda parametrizado por prefixo de id + showMunicipality. Copy já vive em schemas/campaignDemand.ts (B195) — o lote não mexe em copy.
Appetite e rabbit holes
- Tocar os 3 steps legados exige rodar o e2e de
campaignHomeActions+campaignWizardChrome(regressão de foco/a11y:contentFocus, aria-live, label do botão). - Rabbit hole: "extrair o shell inteiro" (cada step tem corpo próprio — NÃO unificar os corpos); não renomear arquivos de steps (histórico de PRs); não mexer em copy nem em comportamento (toast/push/retorno intactos).
Já resolvido no simplify do B195 (não reabrir)
- Constantes de copy compartilhadas (
CAMPAIGN_DEMAND_*emlib/schemas/campaignDemand.ts), parser únicoparseCampaignDemandCreateFormData, limite centralCAMPAIGN_DEMAND_BODY_MAX_LENGTH,htmlForórfãos removidos, CTA únicoCAMPAIGN_DEMAND_SUBMIT_LABEL, bug douseCampaignFormSuccessToastcorrigido no hook.
Explicitamente fora (defers do triage do B195)
- Fail-closed de
campaignDemandUniqueSlugsem teste (gatilho: próxima mudança no hook). - Copy "Informe um título com letras ou números." num form sem campo de título (decisão de produto; gatilho: feedback em campo).
- Casa de copy inconsistente (
WIZARD_UPDATE_*emwizardUpdateUi.tsvsWIZARD_DEMAND_*emcampaignWizardCopy.ts) — cosmético. canLeaderEditmorto emcampaignDemandData.ts(pré-existente).- Update de demanda com descrição inalterada ainda grava (documentado em teste).