style(C89): formata (prettier)

This commit is contained in:
Francisco Solla 2026-08-08 23:11:05 -03:00
parent 8d96263554
commit 5a51d60c9e
10 changed files with 51 additions and 68 deletions

View file

@ -113,8 +113,8 @@ estadual — leitura relativa à carteira (restrição da intenção). Sem % abs
## Fases verificáveis
1. **Tracer / pure (server):** `municipalityUpdateListUrl` + `municipalityUpdateOmnibox`
+ unit specs (canonicalização, "todas polaridades→ausente", page clamp,
chips/sugestões/apply/remove) — `pnpm gate:fast`.
- unit specs (canonicalização, "todas polaridades→ausente", page clamp,
chips/sugestões/apply/remove) — `pnpm gate:fast`.
2. **Loader + view model:** `campaignUpdatesFeedData` +
`loadCampaignUserDisplayByIds`; verificação por int spec leve do loader
(carteira de advisor) se existir precedente análogo — senão unit puro.

View file

@ -26,6 +26,5 @@ export const createCampaignUpdatesFormAction = async (
revalidatePath('/campanha/atualizacoes')
return { message: 'Atualização registrada com sucesso.' }
},
genericMessage:
'Não foi possível registrar a atualização. Verifique o município e seu acesso.',
genericMessage: 'Não foi possível registrar a atualização. Verifique o município e seu acesso.',
})

View file

@ -4,11 +4,11 @@ import { getPayload } from 'payload'
import { CampaignUpdatesFeed } from '@/components/campaign/municipality/CampaignUpdatesFeed'
import { CampaignUpdatesFilters } from '@/components/campaign/municipality/CampaignUpdatesFilters'
import { CampaignListFooter } from '@/components/campaign/shared/CampaignListFooter'
import {
CampaignListPendingBoundary,
CampaignListResults,
} from '@/components/campaign/shared/CampaignListPending'
import { CampaignListFooter } from '@/components/campaign/shared/CampaignListFooter'
import { CampaignPageShell } from '@/components/campaign/shell/CampaignPageShell'
import { campaignPageMetadataFromCatalog } from '@/lib/campaignPageChrome'
import { isCampaignStaff } from '@/utilities/campaignAccess'

View file

@ -9,18 +9,13 @@ import { StrictCombobox } from '@/components/campaign/shared/StrictCombobox'
import { useCampaignFormSuccessToast } from '@/components/campaign/shared/useCampaignFormSuccessToast'
import { Button } from '@/components/ui/button'
import { Dialog, DialogContent, DialogDescription, DialogTitle } from '@/components/ui/dialog'
import {
Drawer,
DrawerContent,
DrawerDescription,
DrawerTitle,
} from '@/components/ui/Drawer'
import { Drawer, DrawerContent, DrawerDescription, DrawerTitle } from '@/components/ui/Drawer'
import { Field, FieldDescription, FieldError, FieldLabel } from '@/components/ui/field'
import { Spinner } from '@/components/ui/Spinner'
import { useIsMobile } from '@/hooks/use-mobile'
import { getMunicipalityCatalogEntry } from '@/lib/municipalityCatalog'
import type { CampaignUpdatesFeedFacets } from '@/utilities/municipality/campaignUpdatesFeedData'
import { fieldError } from '@/utilities/campaignFormFields'
import type { CampaignUpdatesFeedFacets } from '@/utilities/municipality/campaignUpdatesFeedData'
type CampaignUpdatesCreateModalProps = {
open: boolean

View file

@ -29,11 +29,7 @@ type CampaignUpdatesFiltersProps = {
isStaff: boolean
}
export const CampaignUpdatesFilters = ({
state,
facets,
isStaff,
}: CampaignUpdatesFiltersProps) => {
export const CampaignUpdatesFilters = ({ state, facets, isStaff }: CampaignUpdatesFiltersProps) => {
const { navigate, isPending } = useCampaignListFilterNavigation({
state,
toHref: (next) => buildCampaignUpdatesFeedHref(next, 1),
@ -107,37 +103,37 @@ export const CampaignUpdatesFilters = ({
>
<CampaignListOmnibox
id="campaign-updates-omnibox"
label="Filtrar atualizações"
placeholder="Digite para filtrar (município, polaridade, autor…)"
chips={chips}
suggestions={suggestions}
query={query}
onQueryChange={setQuery}
isPending={isPending}
onSelectSuggestion={(suggestionId) => {
runAction(applyCampaignUpdatesFeedSuggestion({ state, suggestionId }))
}}
onCommitQuery={(text) => {
runAction(applyCampaignUpdatesFeedSuggestion({ state, suggestionId: `q:${text}` }))
}}
onRemoveChip={(chipId) => {
runAction(removeCampaignUpdatesFeedChip({ state, chipId }))
}}
onClearAll={() => {
runAction(clearCampaignUpdatesFeedFilters())
}}
trailing={
<Button
type="button"
variant="outline"
className="min-h-11 shrink-0 gap-2"
onClick={() => setCreateOpen(true)}
>
<Plus aria-hidden="true" />
Nova atualização
</Button>
}
/>
label="Filtrar atualizações"
placeholder="Digite para filtrar (município, polaridade, autor…)"
chips={chips}
suggestions={suggestions}
query={query}
onQueryChange={setQuery}
isPending={isPending}
onSelectSuggestion={(suggestionId) => {
runAction(applyCampaignUpdatesFeedSuggestion({ state, suggestionId }))
}}
onCommitQuery={(text) => {
runAction(applyCampaignUpdatesFeedSuggestion({ state, suggestionId: `q:${text}` }))
}}
onRemoveChip={(chipId) => {
runAction(removeCampaignUpdatesFeedChip({ state, chipId }))
}}
onClearAll={() => {
runAction(clearCampaignUpdatesFeedFilters())
}}
trailing={
<Button
type="button"
variant="outline"
className="min-h-11 shrink-0 gap-2"
onClick={() => setCreateOpen(true)}
>
<Plus aria-hidden="true" />
Nova atualização
</Button>
}
/>
</form>
<CampaignUpdatesCreateModal
open={createOpen}

View file

@ -55,10 +55,7 @@ export const loadCampaignUserDisplayByIds = async (
overrideAccess: true,
})
return new Map(
result.docs.map((doc) => [
doc.id,
{ name: doc.name, avatarUrl: mediaDocumentUrl(doc.avatar) },
]),
result.docs.map((doc) => [doc.id, { name: doc.name, avatarUrl: mediaDocumentUrl(doc.avatar) }]),
)
}

View file

@ -99,7 +99,11 @@ export const loadCampaignUpdatesFeed = async (
urgent: Boolean(doc.urgent),
adversarySignal: Boolean(doc.adversarySignal),
createdAt: doc.createdAt,
author: { id: authorID, name: author?.name ?? 'Usuário', avatarUrl: author?.avatarUrl ?? null },
author: {
id: authorID,
name: author?.name ?? 'Usuário',
avatarUrl: author?.avatarUrl ?? null,
},
municipality: municipality
? { id: municipalityID, name: municipality.name, slug: municipality.slug }
: { id: municipalityID, name: 'Município', slug: '' },

View file

@ -54,14 +54,7 @@ export type CampaignUpdatesFeedState = {
authors?: number[]
}
const campaignUpdatesFeedParamNames = [
'q',
'slug',
'polarity',
'urgent',
'author',
'page',
] as const
const campaignUpdatesFeedParamNames = ['q', 'slug', 'polarity', 'urgent', 'author', 'page'] as const
const campaignUpdatesFeedParamNameSet = new Set<string>(campaignUpdatesFeedParamNames)

View file

@ -229,12 +229,13 @@ export const removeCampaignUpdatesFeedChip = ({
if (chipId.startsWith('slug:')) {
const slug = chipId.slice(5)
const slugs = (state.slugs ?? []).filter((entry) => entry !== slug)
return { kind: 'url', state: withPageReset({ ...state, slugs: slugs.length ? slugs : undefined }) }
return {
kind: 'url',
state: withPageReset({ ...state, slugs: slugs.length ? slugs : undefined }),
}
}
if (chipId.startsWith('polarity:')) {
const polarities = (state.polarities ?? []).filter(
(entry) => entry !== chipId.slice(9),
)
const polarities = (state.polarities ?? []).filter((entry) => entry !== chipId.slice(9))
return {
kind: 'url',
state: withPageReset({

View file

@ -91,9 +91,7 @@ describe('campaign updates feed data (C89)', () => {
expect(result.cards[0]?.body).toBe('Visita no meu município')
const facets = await loadCampaignUpdatesFeedFacets(payload, advisor)
expect(facets.municipalities.map((municipality) => municipality.slug)).toEqual([
assigned.slug,
])
expect(facets.municipalities.map((municipality) => municipality.slug)).toEqual([assigned.slug])
expect(facets.authorOptions.map((option) => option.label)).toContain(coordinator.name)
expect(facets.authorOptions.map((option) => option.label)).not.toContain(otherAdvisor.name)
})