Atualizações
Última atualização: 16 de julho de 2026
Visão Geral
Diferente da maioria das outras sub-telas da tab Loja, "Atualizações" é uma funcionalidade real e completa. Ela é o painel manual de sincronização por entidade: além do sync automático já executado pelo app (documentado em Sincronização Offline), esta tela permite ao vendedor forçar a atualização de qualquer entidade individualmente, ou de tudo de uma vez, escolhendo entre uma sincronização completa ou só das modificações recentes.
Arquivos-chave
| Arquivo | Responsabilidade |
|---|---|
features/store/subscreens/updates/store-updates.controller.ts | Orquestração da tela |
services/sync/sync.services.ts | SyncService, já documentado no fluxo de sincronização |
services/sync-changes/sync-changes.service.instance.ts | Captura de snapshot antes/depois pra detectar mudanças |
services/sync-entity-monitor/sync-entity-monitor.service.instance.ts | Registro de atividade de sync em andamento |
services/product/product-image-cache.service.ts | Cache de imagens de produto |
Uma seção por entidade, cada uma com seu handler real
A tela lista cerca de 27 seções (Organização, Usuário, Clientes, Transportadoras, Produtos, Estoque, Tabelas de preço, Rascunhos de venda, entre outras), e cada uma é mapeada para um método real de SyncService:
// store-updates.controller.ts
const SECTION_SYNC_HANDLERS: Record<string, SectionSyncHandler | undefined> = {
clients: (service, mode, onProgress) =>
service.syncClients(2500, onProgress, { recentOnly: mode === "recent" }),
products: (service, mode, onProgress) =>
service.syncProducts(2500, onProgress, { recentOnly: mode === "recent" }),
stocks: (service, mode, onProgress) =>
service.syncStocks(2500, onProgress, { recentOnly: mode === "recent" }),
saleDrafts: (service, mode, onProgress) =>
service.syncSaleDrafts(500, onProgress, { recentOnly: mode === "recent" }),
// ... as demais entidades seguem o mesmo padrão
};
Algumas seções, marcadas em RECENT_SYNC_SECTION_IDS (clientes, produtos, estoques, preços, rascunhos de venda, entre outras), perguntam ao vendedor se ele quer uma sincronização completa ou só as modificações recentes antes de rodar. As demais seções (transportadoras, cidades, grupos de produto, formas de pagamento, empresas etc.) sempre rodam completas, sem essa escolha.
"Atualizar Tudo" reaproveita o motor de sync genérico
O botão principal não tem lógica própria de sincronização, ele só reseta o estado e chama o mesmo startSyncAll do useSync() usado no fluxo automático:
// store-updates.controller.ts
const runSyncAll = async (recentOnly?: boolean) => {
const organizationId = organizationService?.getSelectedOrganization?.()?.organizationId;
reset();
await wait(180);
void startSyncAll(organizationId, { recentOnly });
};
"Última atualização" por entidade e reset de cache de imagens
Cada seção mostra a data da última sincronização daquela entidade específica, lida de syncServiceRef.current.getAllLastSyncedAt(), atualizada automaticamente sempre que um sync (manual ou automático) termina. Há também uma ação independente, "Resetar cache das imagens", que de fato limpa o cache local de imagens de produto via productImageCacheService.clearCache(), forçando o app a rebaixá-las na próxima vez que forem exibidas.
Armadilhas conhecidas
Ao depurar por que uma entidade específica não atualizou, vale checar primeiro se a seção tem um handler mapeado em SECTION_SYNC_HANDLERS; seções sem handler mostram um toast informando que a sincronização daquela seção "ainda não está disponível" em vez de falhar silenciosamente. Como esta tela só orquestra chamadas para o mesmo SyncService do motor de sync automático, qualquer comportamento inesperado de uma entidade específica (ex.: incremental vs completo, lastUpdatedAt) deve ser investigado na documentação de Sincronização Offline, não aqui.