Olá!
Quando a gente fala de sincronizar dados com IndexedDB
e Service Worker
, o principal ponto é usar o Background Sync. Essa funcionalidade é ótima porque permite agendar a sincronização pra quando a internet voltar.
No Angular, o ngsw-config.json
é usado pra configurar o Service Worker, mas a lógica de sincronização mesmo você precisa implementar por fora. Isso porque o ngsw-worker.js
é gerado automaticamente, então não dá pra mexer direto nele. A solução é criar seu próprio Service Worker customizado.
Cria um arquivo de Service Worker customizado, por exemplo: custom-sw.js
.
Implementa a lógica de sync nele. Você pode escutar o evento de sync e chamar a função que envia os dados pro servidor. Algo assim:
self.addEventListener('sync', function(event) {
if (event.tag === 'sync-dados') {
event.waitUntil(syncData());
}
});
function syncData() {
// Aqui você buscaria os dados no IndexedDB e mandaria pro servidor
return fetch('/api/sync', {
method: 'POST',
body: JSON.stringify(dados),
headers: { 'Content-Type': 'application/json' }
});
}
Registre esse Service Worker customizado no seu Angular, talvez lá no main.ts
ou em outro ponto de inicialização do app.
Configure o uso do Background Sync: seu app precisa pedir permissão pra isso e registrar a tarefa de sincronização no momento certo (tipo quando detectar que o usuário tá offline e fez alguma ação que precisa ser salva depois).
Com isso, você consegue garantir que os dados serão enviados pro servidor assim que a conexão voltar. Dá um pouquinho de trabalho no começo, mas depois que engrena, fica tranquilo.