From 1488f8ef00d3ca61c7cd4b8a28d644a8fad35c64 Mon Sep 17 00:00:00 2001 From: "k.triantafyllou" Date: Fri, 5 Nov 2021 17:22:41 +0200 Subject: [PATCH] Add AdvancedAsyncSubject in order to avoid duplicate code to be executed while userInfo has been called --- services/user-management.service.ts | 10 +++--- utils/AdvancedAsyncSubject.ts | 50 +++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 utils/AdvancedAsyncSubject.ts diff --git a/services/user-management.service.ts b/services/user-management.service.ts index d936409d..a19e85cb 100644 --- a/services/user-management.service.ts +++ b/services/user-management.service.ts @@ -1,19 +1,20 @@ import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; -import {BehaviorSubject, from, Observable, of} from "rxjs"; +import {from, Observable} from "rxjs"; import {COOKIE, Session, User} from "../login/utils/helper.class"; import {map} from "rxjs/operators"; import {NavigationEnd, Router} from "@angular/router"; import {properties} from "../../../environments/environment"; import {StringUtils} from "../utils/string-utils.class"; import {CustomOptions} from "./servicesUtils/customOptions.class"; +import {AdvancedAsyncSubject} from "../utils/AdvancedAsyncSubject"; @Injectable({ providedIn: 'root' }) export class UserManagementService { - private getUserInfoSubject: BehaviorSubject = new BehaviorSubject(null); + private getUserInfoSubject: AdvancedAsyncSubject = new AdvancedAsyncSubject(); public fixRedirectURL: string = null; private redirectUrl: string = null; private readonly promise: Promise; @@ -53,9 +54,8 @@ export class UserManagementService { } public updateUserInfo(resolve: Function = null) { - /** @deprecated **/ const token = COOKIE.getCookie('AccessToken'); - if (!token && properties.userInfoUrl.includes("accessToken")) { + if (!token) { this.getUserInfoSubject.next(null); if (resolve) { resolve(); @@ -70,7 +70,7 @@ export class UserManagementService { resolve(); } }, error => { - if(this.getUserInfoSubject.value) { + if(this.getUserInfoSubject.getValue()) { this.getUserInfoSubject.next(null); } if (resolve) { diff --git a/utils/AdvancedAsyncSubject.ts b/utils/AdvancedAsyncSubject.ts new file mode 100644 index 00000000..e3c657b6 --- /dev/null +++ b/utils/AdvancedAsyncSubject.ts @@ -0,0 +1,50 @@ +import {Subject, Subscriber, Subscription} from "rxjs"; + +export class AdvancedAsyncSubject extends Subject{ + private _value: T = null; + private hasNext: boolean = false; + private hasFinished: boolean = false; + + /** @deprecated This is an internal implementation detail, do not use. */ + _subscribe(subscriber: Subscriber): Subscription { + if (this.hasError) { + subscriber.error(this.thrownError); + return Subscription.EMPTY; + } else if (this.hasFinished && this.hasNext) { + subscriber.next(this._value); + } + return super._subscribe(subscriber); + } + + next(value: T): void { + if (!this.hasFinished) { + this._value = value; + this.hasNext = true; + this.finish(); + } else { + this._value = value; + super.next(value); + } + } + + get value() { + return this.getValue(); + } + + getValue() { + return this._value; + } + + error(error: any): void { + if (!this.hasFinished) { + super.error(error); + } + } + + finish(): void { + this.hasFinished = true; + if (this.hasNext) { + super.next(this._value); + } + } +}