From f38340b13442faaba4c8b28f8f145a76cb29457d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Strei=C3=9Felberger?= <47336957+oliverstreissi@users.noreply.github.com> Date: Thu, 19 Sep 2024 11:18:01 +0200 Subject: [PATCH] fix(admin-ui): Unsubscribe from alerts when logging out (#3071) relates to: #2188 --- .../app-shell/app-shell.component.html | 2 +- .../src/providers/alerts/alerts.service.ts | 18 ++++++++++++++++-- .../core/src/providers/auth/auth.service.ts | 11 ++++++++--- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/packages/admin-ui/src/lib/core/src/components/app-shell/app-shell.component.html b/packages/admin-ui/src/lib/core/src/components/app-shell/app-shell.component.html index 0da8d9d8f7..0c674049d2 100644 --- a/packages/admin-ui/src/lib/core/src/components/app-shell/app-shell.component.html +++ b/packages/admin-ui/src/lib/core/src/components/app-shell/app-shell.component.html @@ -73,7 +73,7 @@ [availableLanguages]="availableLanguages" (selectUiLanguage)="selectUiLanguage()" (logOut)="logOut()" - > + />
diff --git a/packages/admin-ui/src/lib/core/src/providers/alerts/alerts.service.ts b/packages/admin-ui/src/lib/core/src/providers/alerts/alerts.service.ts index 96f0538f0f..c85f9978fe 100644 --- a/packages/admin-ui/src/lib/core/src/providers/alerts/alerts.service.ts +++ b/packages/admin-ui/src/lib/core/src/providers/alerts/alerts.service.ts @@ -8,6 +8,7 @@ import { Observable, of, Subject, + Subscription, switchMap, } from 'rxjs'; import { filter, map, startWith, take } from 'rxjs/operators'; @@ -132,14 +133,15 @@ export class Alert { activeAlert$: Observable; private hasRun$ = new BehaviorSubject(false); private data$ = new BehaviorSubject(undefined); + private readonly subscription: Subscription; constructor( private config: AlertConfig, private context: AlertContext, ) { if (this.config.recheck) { - this.config.recheck(this.context).subscribe(() => this.runCheck()); + this.subscription = this.config.recheck(this.context).subscribe(() => this.runCheck()); } - this.activeAlert$ = combineLatest(this.data$, this.hasRun$).pipe( + this.activeAlert$ = combineLatest([this.data$, this.hasRun$]).pipe( map(([data, hasRun]) => { if (!data) { return; @@ -176,6 +178,12 @@ export class Alert { } this.hasRun$.next(false); } + + destroy() { + if (this.subscription) { + this.subscription.unsubscribe(); + } + } } @Injectable({ @@ -237,6 +245,12 @@ export class AlertsService { } } + clearAlerts() { + this.alertsMap.forEach(alert => alert.destroy()); + this.alertsMap.clear(); + this.configUpdated.next(); + } + protected createContext(): AlertContext { return { injector: this.injector, diff --git a/packages/admin-ui/src/lib/core/src/providers/auth/auth.service.ts b/packages/admin-ui/src/lib/core/src/providers/auth/auth.service.ts index 10c616f361..bea6ace63c 100644 --- a/packages/admin-ui/src/lib/core/src/providers/auth/auth.service.ts +++ b/packages/admin-ui/src/lib/core/src/providers/auth/auth.service.ts @@ -1,13 +1,14 @@ import { Injectable } from '@angular/core'; import { DEFAULT_CHANNEL_CODE } from '@vendure/common/lib/shared-constants'; import { Observable, of } from 'rxjs'; -import { catchError, map, mapTo, mergeMap, switchMap } from 'rxjs/operators'; +import { catchError, map, mergeMap, switchMap, tap } from 'rxjs/operators'; import { AttemptLoginMutation, CurrentUserFragment } from '../../common/generated-types'; import { DataService } from '../../data/providers/data.service'; import { ServerConfigService } from '../../data/server-config'; import { LocalStorageService } from '../local-storage/local-storage.service'; import { PermissionsService } from '../permissions/permissions.service'; +import { AlertsService } from '../alerts/alerts.service'; /** * This service handles logic relating to authentication of the current user. @@ -21,6 +22,7 @@ export class AuthService { private dataService: DataService, private serverConfigService: ServerConfigService, private permissionsService: PermissionsService, + private alertService: AlertsService, ) {} /** @@ -79,7 +81,10 @@ export class AuthService { return []; } }), - mapTo(true), + tap(() => { + this.alertService.clearAlerts(); + }), + map(() => true), ); } @@ -129,7 +134,7 @@ export class AuthService { }), ); }), - mapTo(true), + map(() => true), catchError(err => of(false)), ); }