diff --git a/ui/src/app/services/os-update.service.ts b/ui/src/app/services/os-update.service.ts index 57f97a83c..9e688efda 100644 --- a/ui/src/app/services/os-update.service.ts +++ b/ui/src/app/services/os-update.service.ts @@ -3,6 +3,7 @@ import { NavController } from '@ionic/angular' import { BehaviorSubject, combineLatest, forkJoin, interval, NextObserver, Observable, Observer, of } from 'rxjs' import { catchError, concatMap, distinctUntilChanged, filter, map, take, tap } from 'rxjs/operators' import { ServerModel, ServerStatus } from '../models/server-model' +import { exists } from '../util/misc.util' import { ApiService } from './api/api.service' import { Emver } from './emver.service' @@ -13,39 +14,26 @@ export class OsUpdateService { // holds version latest if update available, undefined if not. private readonly $updateAvailable$ = new BehaviorSubject(undefined) - // same as above, but we only update this as a result of auto check - // this is because we only pop update alert when it comes from an auto check, not the checkForUpdates() call - private readonly $updateAvailableFromAutoCheck$ = new BehaviorSubject(undefined) - watchForUpdateAvailable$ (): Observable { return this.$updateAvailable$.asObservable().pipe(distinctUntilChanged()) } - watchForAutoCheckUpdateAvailable$ (): Observable { - return this.$updateAvailableFromAutoCheck$.asObservable().pipe(distinctUntilChanged()) - } - constructor ( private readonly emver: Emver, private readonly serverModel: ServerModel, private readonly apiService: ApiService, private readonly navCtrl: NavController, ) { - // watch auto check flag and versionLatest for possible update - this.autoCheck$().subscribe(this.$updateAvailableFromAutoCheck$) - - // if update is available from auto check, then it's available (not vice versa) - this.$updateAvailableFromAutoCheck$.subscribe(this.$updateAvailable$) } - - private autoCheck$ (): Observable { - const { autoCheckUpdates } = this.serverModel.watch() - return combineLatest([autoCheckUpdates, interval(5000)]).pipe( - filter( ([check, _]) => check), + // emits everytime autoCheckUpdates becomes (or is) true + autoCheck$ (): Observable { + return this.serverModel.watch().autoCheckUpdates.pipe( + distinctUntilChanged(), + filter(check => check), concatMap(() => this.apiService.getVersionLatest()), - filter( ({ canUpdate }) => canUpdate), - map(({ versionLatest }) => versionLatest), + map(({ canUpdate, versionLatest }) => canUpdate ? versionLatest : undefined), + tap(vl => this.$updateAvailable$.next(vl)), ) } @@ -61,7 +49,7 @@ export class OsUpdateService { return of(undefined) }), // cache the result for components to learn update available without having to have called this method - tap(updateAvailable => this.$updateAvailable$.next(updateAvailable)), + tap(vl => this.$updateAvailable$.next(vl)), ).toPromise() } diff --git a/ui/src/app/services/startup-alerts.notifier.ts b/ui/src/app/services/startup-alerts.notifier.ts index 2c7fe6151..a239a4ea0 100644 --- a/ui/src/app/services/startup-alerts.notifier.ts +++ b/ui/src/app/services/startup-alerts.notifier.ts @@ -35,7 +35,7 @@ export class GlobalAlertsNotifier { const { welcomeAck, versionInstalled } = this.server.watch() return combineLatest([ welcomeAck, versionInstalled ]).pipe( - filter( ([wa, vi]) => !!vi && !wa), + filter( ([wa, vi]) => vi && !wa), take(1), // we will check and show welcome message at most once per app instance concatMap(([_, vi]) => iif( () => vi === this.config.version, @@ -47,9 +47,9 @@ export class GlobalAlertsNotifier { private autoUpdateCheck$ (): Observable { // this emits iff autoCheck is on and update available - return this.osUpdateService.watchForAutoCheckUpdateAvailable$().pipe( + return this.osUpdateService.autoCheck$().pipe( filter(exists), - concatMap(async (vl) => { + concatMap(async vl => { const { update } = await this.presentAlertNewOS(vl) if (update) { return this.loader.displayDuringP(