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.
41 lines
1.3 KiB
TypeScript
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' }
|
|
}
|