teqo/src/utilities/municipalityMapNavigation.ts
Francisco Ignácio Fontoura Solla 5ace1a04b2 simplify(B14): corrige o mecanismo da fronteira, estado unsupported e duplicatas
Terceira rodada de /simplify sobre o B14, com dois enunciados errados corrigidos:

- A propriedade da fronteira compartilhada NAO vem da ordem do `.find()`, e sim
  da convencao meio-aberta do ray casting (`point.lng < crossingLng`): a aresta
  pertence ao poligono cujo interior fica a leste (ao norte, se horizontal). Tres
  comentarios diziam o contrario, e o do unit test dizia "oeste" enquanto
  afirmava `east`.
- O plano dizia que o `Promise.all` esconde o decode da malha atras do fix de
  GPS. Nao esconde: o decode roda no topo do modulo, quando o chunk executa. O
  paralelo continua certo por outro motivo (decode ~2 ms; sequencial jogaria os
  42 KB no caminho critico quando o fix vem do cache).

Simplificacoes: `unsupported` virou estado proprio, entao `failureCopy` deixa de
ser anulavel e caem duas leituras defensivas inalcancaveis; "Voce esta em " era
escrito duas vezes (frase sr-only + JSX), o que anulava justamente a invariante
que o comentario alegava; `zoneCityHrefs` virou `Partial` porque a busca falha
para os 416 municipios sem zona e o guard existia sem o tipo exigir;
`MunicipalityForIbgeIndex` era duplicata campo-a-campo de `AccessibleMunicipality`;
`kmFormatter` duplicava `oneDecimalFormatter`; `RecentlyVisitedCard` carregava
tres props que nenhum caller passa (dez condicionais mortas); e o bbox de feature
estava escrito em dois specs (agora `tests/helpers/featureBounds.ts`, compartilhado
por vitest e Playwright).

Copy: fora da Bahia sem nada por perto dizia a mesma coisa em duas frases e nunca
dizia que voce estava fora do estado. Agora o headline afirma o fato e o detalhe
reusa "Nenhum municipio da sua carteira por perto.".

Tambem limpa um achado de knip herdado do main (`MunicipalityPoliticalTrendViewModel`
exportado sem uso) e registra no plano o caminho afiado do debito de payload RSC
mais dois adiados com gatilho.
2026-07-26 18:03:44 -03:00

41 lines
1.3 KiB
TypeScript

import type { AccessibleMunicipality } from '@/lib/municipalityProximity'
type MunicipalityMapSlugEntry = {
slug: string
name: string
}
export type MunicipalitiesByIbgeCode = Record<string, MunicipalityMapSlugEntry[]>
export type MunicipalityMapNavigation =
| { kind: 'none' }
| { kind: 'navigate'; slug: string }
| { kind: 'zones' }
export const buildMunicipalitiesByIbgeCode = (
municipalities: readonly AccessibleMunicipality[],
): MunicipalitiesByIbgeCode => {
const byIbge: MunicipalitiesByIbgeCode = {}
for (const municipality of municipalities) {
const entries = byIbge[municipality.ibgeCode] ?? []
entries.push({ slug: municipality.slug, name: municipality.name })
byIbge[municipality.ibgeCode] = entries
}
for (const ibgeCode of Object.keys(byIbge)) {
byIbge[ibgeCode].sort((left, right) => left.name.localeCompare(right.name, 'pt-BR'))
}
return byIbge
}
export const resolveMunicipalityMapNavigation = (
ibgeCode: string,
municipalitiesByIbgeCode: MunicipalitiesByIbgeCode,
): MunicipalityMapNavigation => {
const entries = municipalitiesByIbgeCode[ibgeCode]
if (!entries || entries.length === 0) return { kind: 'none' }
if (entries.length === 1) return { kind: 'navigate', slug: entries[0].slug }
return { kind: 'zones' }
}