import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { toSignal } from '@angular/core/rxjs-interop' import { SwUpdate } from '@angular/service-worker' import { WA_WINDOW } from '@ng-web-apis/common' import { LoadingService } from '@start9labs/shared' import { Version } from '@start9labs/start-sdk' import { TuiResponsiveDialog } from '@taiga-ui/addon-mobile' import { TuiAutoFocus } from '@taiga-ui/cdk' import { TuiButton } from '@taiga-ui/core' import { PatchDB } from 'patch-db-client' import { distinctUntilChanged, map, merge, Subject } from 'rxjs' import { ConfigService } from 'src/app/services/config.service' import { DataModel } from 'src/app/services/patch-db/data-model' @Component({ selector: 'refresh-alert', template: ` @if (isPwa) {

Your user interface is cached and out of date. Attempt to reload the PWA using the button below. If you continue to see this message, uninstall and reinstall the PWA.

} @else { Your user interface is cached and out of date. Hard refresh the page to get the latest UI. }
`, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TuiResponsiveDialog, TuiButton, TuiAutoFocus], }) export class RefreshAlertComponent { private readonly win = inject(WA_WINDOW) private readonly updates = inject(SwUpdate) private readonly loader = inject(LoadingService) private readonly version = Version.parse(inject(ConfigService).version) readonly dismiss$ = new Subject() readonly isPwa = this.win.matchMedia('(display-mode: standalone)').matches readonly show = toSignal( merge( this.dismiss$.pipe(map(() => false)), inject>(PatchDB) .watch$('serverInfo', 'version') .pipe( distinctUntilChanged(), map(v => this.version.compare(Version.parse(v)) !== 'equal'), ), ), { initialValue: false, }, ) async pwaReload() { const loader = this.loader.open('Reloading PWA').subscribe() try { // attempt to update to the latest client version available await this.updates.activateUpdate() } catch (e) { console.error('Error activating update from service worker: ', e) } finally { loader.unsubscribe() // always reload, as this resolves most out of sync cases this.win.location.reload() } } }