fix(inbox): corrigir agrupamento de data por fuso de Brasilia

O Companion envia hora local com 'Z' literal (nao converte para UTC),
entao o timestamp no DB ja carrega a data correta de Brasilia. Usava-se
+3h no frontend, que deslocava a virada de dia para as 21h locais e
fazia compras da tarde aparecerem como 'Ontem'.

- getItemDateKey: remove offset (data UTC ja e a data de Brasilia)
- getBrasiliaDateKey: usa UTC-3 apenas para calcular hoje/ontem
- Paraleliza insercoes no batch endpoint com Promise.allSettled
- Usa selectDistinct no fetchInboxSourceApps
- Envolve InboxCard em memo e callbacks em useCallback

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Felipe Coutinho
2026-03-22 00:55:46 +00:00
parent 60a52b9873
commit 50477fb1be
4 changed files with 62 additions and 47 deletions

View File

@@ -86,12 +86,10 @@ export async function POST(request: Request) {
const body = await request.json();
const { items } = inboxBatchSchema.parse(body);
// Processar cada item
const results: BatchResult[] = [];
for (const item of items) {
try {
const [inserted] = await db
// Processar todos os itens em paralelo
const settled = await Promise.allSettled(
items.map((item) =>
db
.insert(inboxItems)
.values({
userId: tokenRecord.userId,
@@ -104,22 +102,26 @@ export async function POST(request: Request) {
parsedAmount: item.parsedAmount?.toString(),
status: "pending",
})
.returning({ id: inboxItems.id });
.returning({ id: inboxItems.id }),
),
);
results.push({
clientId: item.clientId,
serverId: inserted.id,
const results: BatchResult[] = settled.map((result, i) => {
const item = items[i];
if (result.status === "fulfilled") {
return {
clientId: item?.clientId,
serverId: result.value[0]?.id,
success: true,
});
} catch (error) {
console.error("[API] Error processing batch item:", error);
results.push({
clientId: item.clientId,
success: false,
error: "Erro ao processar notificação",
});
};
}
}
console.error("[API] Error processing batch item:", result.reason);
return {
clientId: item?.clientId,
success: false,
error: "Erro ao processar notificação",
};
});
// Atualizar último uso do token
const clientIp =