From 7a8d01debe2e40be8563cbe4de3ae99916c4e14c Mon Sep 17 00:00:00 2001 From: lucas Date: Fri, 22 May 2026 23:35:11 -0300 Subject: [PATCH] feat(logos): adiciona nomes de exibicao via dicionario e busca sem acentos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adiciona arquivo display-names.ts com 433 nomes legiveis (ex: bb.png → "Banco do Brasil") - Adiciona getLogoDisplayName() que consulta dicionario primeiro, com fallback para deriveNameFromLogo - Adiciona normalizeForSearch() para busca accent-insensitive - Atualiza account-dialog, card-dialog, logo-picker e use-logo-selection para usar a nova API Co-Authored-By: Claude Opus 4.7 --- .../accounts/components/account-dialog.tsx | 4 +- src/features/cards/components/card-dialog.tsx | 4 +- .../components/logo-picker/logo-picker.tsx | 14 +- .../logo-picker/use-logo-selection.ts | 6 +- src/shared/lib/logo/display-names.ts | 433 ++++++++++++++++++ src/shared/lib/logo/index.ts | 25 + 6 files changed, 474 insertions(+), 12 deletions(-) create mode 100644 src/shared/lib/logo/display-names.ts diff --git a/src/features/accounts/components/account-dialog.tsx b/src/features/accounts/components/account-dialog.tsx index 1e302d5..d5337a1 100644 --- a/src/features/accounts/components/account-dialog.tsx +++ b/src/features/accounts/components/account-dialog.tsx @@ -23,7 +23,7 @@ import { } from "@/shared/components/ui/dialog"; import { useControlledState } from "@/shared/hooks/use-controlled-state"; import { useFormState } from "@/shared/hooks/use-form-state"; -import { deriveNameFromLogo, normalizeLogo } from "@/shared/lib/logo"; +import { getLogoDisplayName, normalizeLogo } from "@/shared/lib/logo"; import { formatInitialBalanceInput, normalizeDecimalInput, @@ -66,7 +66,7 @@ const buildInitialValues = ({ }): AccountFormValues => { const fallbackLogo = logoOptions[0] ?? ""; const selectedLogo = normalizeLogo(account?.logo) || fallbackLogo; - const derivedName = deriveNameFromLogo(selectedLogo); + const derivedName = getLogoDisplayName(selectedLogo); return { name: account?.name ?? derivedName, diff --git a/src/features/cards/components/card-dialog.tsx b/src/features/cards/components/card-dialog.tsx index 60f4588..f0ba3a8 100644 --- a/src/features/cards/components/card-dialog.tsx +++ b/src/features/cards/components/card-dialog.tsx @@ -24,7 +24,7 @@ import { DEFAULT_CARD_BRANDS, DEFAULT_CARD_STATUS, } from "@/shared/lib/cards/constants"; -import { deriveNameFromLogo, normalizeLogo } from "@/shared/lib/logo"; +import { getLogoDisplayName, normalizeLogo } from "@/shared/lib/logo"; import { formatLimitInput, normalizeDecimalInput, @@ -59,7 +59,7 @@ const buildInitialValues = ({ }): CardFormValues => { const fallbackLogo = logoOptions[0] ?? ""; const selectedLogo = normalizeLogo(card?.logo) || fallbackLogo; - const derivedName = deriveNameFromLogo(selectedLogo); + const derivedName = getLogoDisplayName(selectedLogo); return { name: card?.name ?? derivedName, diff --git a/src/shared/components/logo-picker/logo-picker.tsx b/src/shared/components/logo-picker/logo-picker.tsx index a31b7ee..a0d207c 100644 --- a/src/shared/components/logo-picker/logo-picker.tsx +++ b/src/shared/components/logo-picker/logo-picker.tsx @@ -10,7 +10,11 @@ import { DialogTitle, } from "@/shared/components/ui/dialog"; import { Input } from "@/shared/components/ui/input"; -import { deriveNameFromLogo, resolveLogoSrc } from "@/shared/lib/logo"; +import { + getLogoDisplayName, + normalizeForSearch, + resolveLogoSrc, +} from "@/shared/lib/logo"; import { cn } from "@/shared/utils/ui"; const DEFAULT_BASE_PATH = "/logos"; @@ -35,7 +39,7 @@ export function LogoPickerTrigger({ className, }: LogoPickerTriggerProps) { const hasLogo = Boolean(selectedLogo); - const selectedLogoLabel = deriveNameFromLogo(selectedLogo); + const selectedLogoLabel = getLogoDisplayName(selectedLogo); const selectedLogoPath = hasLogo && selectedLogo ? resolveLogoSrc(selectedLogo, { basePath }) : null; @@ -102,8 +106,8 @@ export function LogoPickerDialog({ const filteredLogos = logos.filter((logo) => { if (!search.trim()) return true; - const logoLabel = deriveNameFromLogo(logo).toLowerCase(); - return logoLabel.includes(search.toLowerCase().trim()); + const logoLabel = getLogoDisplayName(logo); + return normalizeForSearch(logoLabel).includes(normalizeForSearch(search)); }); const handleOpenChange = (isOpen: boolean) => { @@ -145,7 +149,7 @@ export function LogoPickerDialog({
{filteredLogos.map((logo) => { const isActive = value === logo; - const logoLabel = deriveNameFromLogo(logo); + const logoLabel = getLogoDisplayName(logo); return (