From 2a150d481ab070cdd01b4afb39daf48188920921 Mon Sep 17 00:00:00 2001 From: David Frassi Date: Wed, 20 May 2026 12:18:00 +0200 Subject: [PATCH] perf: ottimizzato il controllo degli aggiornamenti PWA all'avvio e al ripristino dell'app MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Implementato il controllo immediato non appena l'applicazione Angular si stabilizza (isStable). - Aggiunto il controllo reattivo al cambio di visibilità (document visibilityState === visible) quando la PWA viene riportata in primo piano/focalizzata. - Mantendo il controllo periodico in background ogni 5 minuti. --- src/app/app.component.ts | 44 +++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 3a566de..64f8d7e 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,7 +1,7 @@ import { Component, inject, ApplicationRef } from '@angular/core'; import { SwUpdate, VersionReadyEvent } from '@angular/service-worker'; import { filter, first } from 'rxjs/operators'; -import { concat, interval } from 'rxjs'; +import { concat, interval, fromEvent } from 'rxjs'; @Component({ selector: 'app-root', @@ -19,14 +19,44 @@ export class AppComponent { private setupUpdates() { if (this.swUpdate.isEnabled) { - // Controlla aggiornamenti ogni 5 minuti invece di 30 - const everyFiveMinutes$ = interval(5 * 60 * 1000); - - everyFiveMinutes$.subscribe(() => { - console.log('Checking for PWA updates...'); - this.swUpdate.checkForUpdate(); + // 1. Check for updates immediately as soon as the application stabilizes + const appIsStable$ = this.appRef.isStable.pipe( + first(isStable => isStable === true) + ); + + appIsStable$.subscribe(async () => { + console.log('[PWA-Update] App is stable, checking for PWA updates immediately...'); + try { + await this.swUpdate.checkForUpdate(); + } catch (err) { + console.warn('[PWA-Update] Failed startup update check:', err); + } }); + // 2. Check for updates when the app is resumed/focused + fromEvent(document, 'visibilitychange') + .pipe(filter(() => document.visibilityState === 'visible')) + .subscribe(async () => { + console.log('[PWA-Update] App resumed, checking for PWA updates...'); + try { + await this.swUpdate.checkForUpdate(); + } catch (err) { + console.warn('[PWA-Update] Failed visible resume update check:', err); + } + }); + + // 3. Periodic check in background every 5 minutes + const everyFiveMinutes$ = interval(5 * 60 * 1000); + everyFiveMinutes$.subscribe(async () => { + console.log('[PWA-Update] Periodic check for updates...'); + try { + await this.swUpdate.checkForUpdate(); + } catch (err) { + console.warn('[PWA-Update] Failed periodic update check:', err); + } + }); + + // 4. Activate update and reload when a new version is ready this.swUpdate.versionUpdates .pipe(filter((evt): evt is VersionReadyEvent => evt.type === 'VERSION_READY')) .subscribe(() => {