From 985ba7dcccfc3ba497e6ef372f0a04391cdf4a04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zieli=C5=84ski?= Date: Fri, 23 Jun 2023 16:23:18 +0200 Subject: [PATCH] Check app updates --- Frontend/src/app/app.component.ts | 31 +++++++++++++++++-- .../layers-list/layers-list.component.ts | 1 - .../src/app/services/notifications.service.ts | 14 +++++++-- Frontend/src/main.ts | 23 +++++++------- 4 files changed, 52 insertions(+), 17 deletions(-) diff --git a/Frontend/src/app/app.component.ts b/Frontend/src/app/app.component.ts index da92df9..fa1c8d3 100644 --- a/Frontend/src/app/app.component.ts +++ b/Frontend/src/app/app.component.ts @@ -1,5 +1,7 @@ import { Component } from '@angular/core'; import { RouterOutlet } from '@angular/router'; +import { SwUpdate } from '@angular/service-worker'; +import { NotificationsService } from './services/notifications.service'; @Component({ selector: 'app-root', @@ -9,5 +11,30 @@ import { RouterOutlet } from '@angular/router'; imports: [RouterOutlet] }) export class AppComponent { - title = 'DiunaBI'; -} + constructor( + private readonly _swUpdate: SwUpdate, + private _notifications: NotificationsService + ) { + this._swUpdate.versionUpdates.subscribe((evt) => { + console.log('Version update', evt); + if (evt.type === 'VERSION_READY') { + this._swUpdate.activateUpdate().then(() => { + this._notifications.add({ + text: "New version available. DiunaBI will restart in 10 seconds.", + duration: 10000, + dismiss: () => { + window.location.reload() + }, + btn: 'Cancel', + action: () => { + this._notifications.add({ + text: "Restart canceled.", + btn: "Hide" + }); + } + }) + }); + } + }) + } + } diff --git a/Frontend/src/app/modules/layers/layers-list/layers-list.component.ts b/Frontend/src/app/modules/layers/layers-list/layers-list.component.ts index 93444c3..b513f1e 100644 --- a/Frontend/src/app/modules/layers/layers-list/layers-list.component.ts +++ b/Frontend/src/app/modules/layers/layers-list/layers-list.component.ts @@ -27,7 +27,6 @@ export class LayersListComponent implements OnInit { constructor( private _http: HttpClient, - private notifications$: NotificationsService ) { } async ngOnInit() { diff --git a/Frontend/src/app/services/notifications.service.ts b/Frontend/src/app/services/notifications.service.ts index a98d209..dc7e218 100644 --- a/Frontend/src/app/services/notifications.service.ts +++ b/Frontend/src/app/services/notifications.service.ts @@ -37,8 +37,14 @@ export class NotificationsService { } return message.id; } - private remove(id: string|undefined) { - this.messages = this.messages.filter(x => x.id!==id); + private remove(id: string | undefined, checkDismiss: boolean = true) { + if (checkDismiss) { + const message = this.messages.find(x => x.id === id); + if (message && message.dismiss) { + message.dismiss(); + } + } + this.messages = this.messages.filter(x => x.id !== id); this.sortMessages(); if (this.messages.length === 0 && this.handler) { this.handler.dismiss(); @@ -51,7 +57,7 @@ export class NotificationsService { } doAction(message: Message) { if (message.action) { message.action(); } - this.remove(message.id); + this.remove(message.id, false); } } @@ -62,6 +68,8 @@ interface Message { btn?: string; // eslint-disable-next-line @typescript-eslint/ban-types action?: Function; + // eslint-disable-next-line @typescript-eslint/ban-types + dismiss?: Function; createdAt?: Moment, parentId?: string; } diff --git a/Frontend/src/main.ts b/Frontend/src/main.ts index 5a5de85..f1d9b38 100644 --- a/Frontend/src/main.ts +++ b/Frontend/src/main.ts @@ -1,7 +1,7 @@ import { enableProdMode, LOCALE_ID, isDevMode, importProvidersFrom } from '@angular/core'; import { environment } from './environments/environment'; import { AppComponent } from './app/app.component'; -import { ServiceWorkerModule } from '@angular/service-worker'; +import { provideServiceWorker } from '@angular/service-worker'; import { provideAnimations } from '@angular/platform-browser/animations'; import { AppRoutingModule } from './app/app-routing.module'; import { BrowserModule, bootstrapApplication } from '@angular/platform-browser'; @@ -16,18 +16,15 @@ import { registerLocaleData } from '@angular/common'; registerLocaleData(localePl); if (environment.production) { - enableProdMode(); + enableProdMode(); } bootstrapApplication(AppComponent, { providers: [ - importProvidersFrom(BrowserModule, AppRoutingModule, ServiceWorkerModule.register('ngsw-worker.js', { - enabled: !isDevMode(), - // Register the ServiceWorker as soon as the application is stable - // or after 30 seconds (whichever comes first). - registrationStrategy: 'registerWhenStable:30000' - }), - MatBottomSheetModule), + importProvidersFrom( + BrowserModule, + AppRoutingModule, + MatBottomSheetModule), { provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS] }, { provide: MAT_MOMENT_DATE_ADAPTER_OPTIONS, useValue: { useUtc: true } }, { provide: LOCALE_ID, useValue: 'pl' }, @@ -42,7 +39,11 @@ bootstrapApplication(AppComponent, { multi: true }, provideAnimations(), - provideHttpClient(withInterceptorsFromDi()) + provideHttpClient(withInterceptorsFromDi()), + provideServiceWorker('ngsw-worker.js', { + enabled: !isDevMode(), + registrationStrategy: 'registerWhenStable:30000' + }) ] }) - .catch(err => console.error(err)); + .catch(err => console.error(err));