perf(logos): pré-resolver mapeamentos Logo.dev no servidor

Cada EstablishmentLogo dispara um GET para /api/logo/mapping por
nome único (deduplicado pelo React Query, mas ainda N requests por
página). Em /dashboard, /transactions e /payers/[payerId] agora
fazemos uma única query SQL em batch (fetchEstablishmentLogoMap) e
semeamos o cache do React Query antes do primeiro render via novo
LogoPrefetchProvider — eliminando os requests da rede.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Felipe Coutinho
2026-04-25 14:45:54 +00:00
parent 7f05d2a681
commit b453b432ed
8 changed files with 257 additions and 125 deletions

View File

@@ -0,0 +1,28 @@
import type { DashboardData } from "./fetch-dashboard-data";
/**
* Coleta todos os nomes de estabelecimentos exibidos nos widgets do
* dashboard que renderizam `<EstablishmentLogo />`. Usado para
* pré-resolver os mapeamentos Logo.dev no servidor.
*/
export function extractDashboardLogoNames(data: DashboardData): string[] {
const names: string[] = [];
for (const bill of data.billsSnapshot.bills) names.push(bill.name);
for (const expense of data.recurringExpensesData.expenses)
names.push(expense.name);
for (const expense of data.installmentExpensesData.expenses)
names.push(expense.name);
for (const establishment of data.topEstablishmentsData.establishments)
names.push(establishment.name);
for (const expense of data.topExpensesAll.expenses) names.push(expense.name);
for (const expense of data.topExpensesCardOnly.expenses)
names.push(expense.name);
for (const transactions of Object.values(
data.purchasesByCategoryData.transactionsByCategory,
)) {
for (const transaction of transactions) names.push(transaction.name);
}
return names;
}