From c95d88562e71c215410a44b83f5fc2e2340c695f Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 3 Aug 2026 00:11:22 +0000 Subject: [PATCH] format + e2e prewarm for pledge autosave routes --- docs/plans/municipio-v2-rede-impl.md | 6 ++--- .../municipios/pledge-declared-votes/route.ts | 2 +- .../municipios/pledge-declared-votes/types.ts | 3 ++- .../pledge-estimated-votes/route.ts | 7 +++--- .../MunicipalityV2EstimatedVotesCell.tsx | 23 ++++++++++--------- .../MunicipalityV2NetworkSection.tsx | 4 +--- tests/e2e/setup.e2e.spec.ts | 2 ++ 7 files changed, 24 insertions(+), 23 deletions(-) diff --git a/docs/plans/municipio-v2-rede-impl.md b/docs/plans/municipio-v2-rede-impl.md index 02105e67..d9575783 100644 --- a/docs/plans/municipio-v2-rede-impl.md +++ b/docs/plans/municipio-v2-rede-impl.md @@ -31,9 +31,9 @@ flowchart LR **Opções consideradas:** -| | A — Reusar panels atuais (cards + forms) | B — Lista densa + B9 cell autosave + JSON routes | C — CampaignTable completo com colunas B17 | -| --- | --- | --- | --- | -| | Rápido mas cards + Salvar | Alinha B9 e aceite | Overkill sem picker de colunas | +| | A — Reusar panels atuais (cards + forms) | B — Lista densa + B9 cell autosave + JSON routes | C — CampaignTable completo com colunas B17 | +| --- | ---------------------------------------- | ------------------------------------------------ | ------------------------------------------ | +| | Rápido mas cards + Salvar | Alinha B9 e aceite | Overkill sem picker de colunas | **Recomendação:** B — lista densa com `CampaignCellEditOverlay` + `useCampaignCellAutosave`; writes via `declareVotes`/`estimateVotes` existentes; revalidate v2 via `revalidateMunicipalityListPaths`. diff --git a/src/app/(campaign)/campanha/(app)/municipios/pledge-declared-votes/route.ts b/src/app/(campaign)/campanha/(app)/municipios/pledge-declared-votes/route.ts index 13c68993..084bc521 100644 --- a/src/app/(campaign)/campanha/(app)/municipios/pledge-declared-votes/route.ts +++ b/src/app/(campaign)/campanha/(app)/municipios/pledge-declared-votes/route.ts @@ -8,8 +8,8 @@ import { VOTE_PLEDGE_LEADERSHIP_REQUIRED_MESSAGE, VOTE_PLEDGE_MUNICIPALITY_NOT_LINKED_MESSAGE, } from '@/lib/schemas/votePledge' -import { revalidateMunicipalityListPaths } from '@/utilities/municipality/municipalityRevalidation' import { campaignJsonMutationRoute } from '@/utilities/campaignJsonMutationRoute' +import { revalidateMunicipalityListPaths } from '@/utilities/municipality/municipalityRevalidation' import type { MunicipalityPledgeDeclaredVotesResponse } from './types' diff --git a/src/app/(campaign)/campanha/(app)/municipios/pledge-declared-votes/types.ts b/src/app/(campaign)/campanha/(app)/municipios/pledge-declared-votes/types.ts index 6c542169..ea5bdcdd 100644 --- a/src/app/(campaign)/campanha/(app)/municipios/pledge-declared-votes/types.ts +++ b/src/app/(campaign)/campanha/(app)/municipios/pledge-declared-votes/types.ts @@ -1,4 +1,5 @@ -export const MUNICIPALITY_PLEDGE_DECLARED_VOTES_ENDPOINT = '/campanha/municipios/pledge-declared-votes' +export const MUNICIPALITY_PLEDGE_DECLARED_VOTES_ENDPOINT = + '/campanha/municipios/pledge-declared-votes' export type MunicipalityPledgeDeclaredVotesResponse = | { status: 'success'; message: string; savedDeclaredVotes: number; pledgeId: number } diff --git a/src/app/(campaign)/campanha/(app)/municipios/pledge-estimated-votes/route.ts b/src/app/(campaign)/campanha/(app)/municipios/pledge-estimated-votes/route.ts index 5fdaaf9c..5c6d412c 100644 --- a/src/app/(campaign)/campanha/(app)/municipios/pledge-estimated-votes/route.ts +++ b/src/app/(campaign)/campanha/(app)/municipios/pledge-estimated-votes/route.ts @@ -3,13 +3,13 @@ import { z } from 'zod' import { estimateVotes } from '@/app/(campaign)/campanha/actions/votePledge' import { positiveRelationshipId } from '@/lib/schemas/primitives' -import { toVoteEstimateScenarioViewModel } from '@/lib/voteEstimate' import { VOTE_PLEDGE_ESTIMATE_STAFF_MESSAGE, voteEstimateScenarioFieldsSchema, } from '@/lib/schemas/votePledge' -import { revalidateMunicipalityListPaths } from '@/utilities/municipality/municipalityRevalidation' +import { toVoteEstimateScenarioViewModel } from '@/lib/voteEstimate' import { campaignJsonMutationRoute } from '@/utilities/campaignJsonMutationRoute' +import { revalidateMunicipalityListPaths } from '@/utilities/municipality/municipalityRevalidation' import type { MunicipalityPledgeEstimatedVotesResponse } from './types' @@ -26,8 +26,7 @@ export const POST = campaignJsonMutationRoute( { bodySchema, safeMessages: [VOTE_PLEDGE_ESTIMATE_STAFF_MESSAGE], - genericMessage: - 'Não foi possível salvar a estimativa. Verifique seu acesso e tente novamente.', + genericMessage: 'Não foi possível salvar a estimativa. Verifique seu acesso e tente novamente.', }, async ({ pledgeId, estimatedVotes }) => { const pledge = await estimateVotes({ diff --git a/src/components/campaign/municipality/MunicipalityV2EstimatedVotesCell.tsx b/src/components/campaign/municipality/MunicipalityV2EstimatedVotesCell.tsx index 49fe0143..177c2ba5 100644 --- a/src/components/campaign/municipality/MunicipalityV2EstimatedVotesCell.tsx +++ b/src/components/campaign/municipality/MunicipalityV2EstimatedVotesCell.tsx @@ -54,17 +54,18 @@ const MunicipalityV2EstimatedVotesCellEditable = ({ ) const { open, onOpenChange, value, change, isPending, errorMessage, statusMessage } = - useCampaignCellAutosave( - { - value: estimatedVotes, - equals: voteEstimatesEqual, - endpoint: MUNICIPALITY_PLEDGE_ESTIMATED_VOTES_ENDPOINT, - buildBody: (votes) => ({ pledgeId: pledgeID, estimatedVotes: votes }), - readSaved: (payload) => payload.savedEstimatedVotes, - errorMessage: SAVE_ERROR_MESSAGE, - pendingMessage: 'Salvando estimativa.', - }, - ) + useCampaignCellAutosave< + VoteEstimateScenarioViewModel, + MunicipalityPledgeEstimatedVotesResponse + >({ + value: estimatedVotes, + equals: voteEstimatesEqual, + endpoint: MUNICIPALITY_PLEDGE_ESTIMATED_VOTES_ENDPOINT, + buildBody: (votes) => ({ pledgeId: pledgeID, estimatedVotes: votes }), + readSaved: (payload) => payload.savedEstimatedVotes, + errorMessage: SAVE_ERROR_MESSAGE, + pendingMessage: 'Salvando estimativa.', + }) const [focusedScenario, setFocusedScenario] = useState('central') diff --git a/src/components/campaign/municipality/MunicipalityV2NetworkSection.tsx b/src/components/campaign/municipality/MunicipalityV2NetworkSection.tsx index fdd9adac..7ee7d87f 100644 --- a/src/components/campaign/municipality/MunicipalityV2NetworkSection.tsx +++ b/src/components/campaign/municipality/MunicipalityV2NetworkSection.tsx @@ -20,9 +20,7 @@ export const MunicipalityV2NetworkSection = ({ network }: MunicipalityV2NetworkS

Rede - {network.totalCount > 0 - ? ` (${formatElectionNumber(network.totalCount)})` - : ''} + {network.totalCount > 0 ? ` (${formatElectionNumber(network.totalCount)})` : ''}

Quem segura o município — ajuste declarado e estimado sem trocar de aba. diff --git a/tests/e2e/setup.e2e.spec.ts b/tests/e2e/setup.e2e.spec.ts index b5c7194c..f81eef5c 100644 --- a/tests/e2e/setup.e2e.spec.ts +++ b/tests/e2e/setup.e2e.spec.ts @@ -32,6 +32,8 @@ test('prewarms shared Next route bundles sequentially', async ({ request }) => { '/campanha/municipios/advisors', '/campanha/municipios/engagement-level', '/campanha/municipios/expected-votes', + '/campanha/municipios/pledge-declared-votes', + '/campanha/municipios/pledge-estimated-votes', '/campanha/municipios/political-trend', '/campanha/liderancas/support-status', '/campanha/webauthn/login-options',