mirror of
https://github.com/bitwarden/browser
synced 2025-12-10 13:23:34 +00:00
[PM-5500] Implement StateProvider in RouterService (#8119)
* implement StateProvider in RouterService * Remove 'export' Co-authored-by: Andreas Coroiu <acoroiu@bitwarden.com> * Skip parameter Co-authored-by: Andreas Coroiu <acoroiu@bitwarden.com> --------- Co-authored-by: Andreas Coroiu <acoroiu@bitwarden.com>
This commit is contained in:
@@ -1,14 +1,31 @@
|
||||
import { Injectable } from "@angular/core";
|
||||
import { Title } from "@angular/platform-browser";
|
||||
import { ActivatedRoute, NavigationEnd, Router } from "@angular/router";
|
||||
import { filter } from "rxjs";
|
||||
import { filter, firstValueFrom } from "rxjs";
|
||||
|
||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
||||
import { Utils } from "@bitwarden/common/platform/misc/utils";
|
||||
import {
|
||||
KeyDefinition,
|
||||
ROUTER_DISK,
|
||||
StateProvider,
|
||||
GlobalState,
|
||||
} from "@bitwarden/common/platform/state";
|
||||
|
||||
const DEEP_LINK_REDIRECT_URL = new KeyDefinition(ROUTER_DISK, "deepLinkRedirectUrl", {
|
||||
deserializer: (value: string) => value,
|
||||
});
|
||||
|
||||
@Injectable()
|
||||
export class RouterService {
|
||||
/**
|
||||
* The string value of the URL the user tried to navigate to while unauthenticated.
|
||||
*
|
||||
* Developed to allow users to deep link even when the navigation gets interrupted
|
||||
* by the authentication process.
|
||||
*/
|
||||
private deepLinkRedirectUrlState: GlobalState<string>;
|
||||
|
||||
private previousUrl: string = undefined;
|
||||
private currentUrl: string = undefined;
|
||||
|
||||
@@ -16,9 +33,11 @@ export class RouterService {
|
||||
private router: Router,
|
||||
private activatedRoute: ActivatedRoute,
|
||||
private titleService: Title,
|
||||
private stateService: StateService,
|
||||
private stateProvider: StateProvider,
|
||||
i18nService: I18nService,
|
||||
) {
|
||||
this.deepLinkRedirectUrlState = this.stateProvider.getGlobal(DEEP_LINK_REDIRECT_URL);
|
||||
|
||||
this.currentUrl = this.router.url;
|
||||
|
||||
router.events
|
||||
@@ -67,14 +86,14 @@ export class RouterService {
|
||||
* @param url URL being saved to the Global State
|
||||
*/
|
||||
async persistLoginRedirectUrl(url: string): Promise<void> {
|
||||
await this.stateService.setDeepLinkRedirectUrl(url);
|
||||
await this.deepLinkRedirectUrlState.update(() => url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch and clear persisted LoginRedirectUrl if present in state
|
||||
*/
|
||||
async getAndClearLoginRedirectUrl(): Promise<string> | undefined {
|
||||
const persistedPreLoginUrl = await this.stateService.getDeepLinkRedirectUrl();
|
||||
const persistedPreLoginUrl = await firstValueFrom(this.deepLinkRedirectUrlState.state$);
|
||||
|
||||
if (!Utils.isNullOrEmpty(persistedPreLoginUrl)) {
|
||||
await this.persistLoginRedirectUrl(null);
|
||||
|
||||
Reference in New Issue
Block a user