From 2c7ea44afd273a3e7d2ad9484fc89df9f4329014 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 18 May 2021 14:27:09 +0200 Subject: [PATCH] don't expose last url to root VM so it isn't confused by empty path instead, check the length of the path in a dedicated method in the router --- src/domain/RootViewModel.js | 8 +++--- src/domain/navigation/URLRouter.js | 41 ++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/domain/RootViewModel.js b/src/domain/RootViewModel.js index f6e566e3..8d9a032f 100644 --- a/src/domain/RootViewModel.js +++ b/src/domain/RootViewModel.js @@ -35,10 +35,10 @@ export class RootViewModel extends ViewModel { async load() { this.track(this.navigation.observe("login").subscribe(() => this._applyNavigation())); this.track(this.navigation.observe("session").subscribe(() => this._applyNavigation())); - this._applyNavigation(this.urlCreator.getLastUrl()); + this._applyNavigation(true); } - async _applyNavigation(restoreUrlIfAtDefault) { + async _applyNavigation(shouldRestoreLastUrl) { const isLogin = this.navigation.observe("login").get(); const sessionId = this.navigation.observe("session").get(); if (isLogin) { @@ -67,9 +67,7 @@ export class RootViewModel extends ViewModel { } } else { try { - if (restoreUrlIfAtDefault) { - this.urlCreator.pushUrl(restoreUrlIfAtDefault); - } else { + if (!(shouldRestoreLastUrl && this.urlCreator.tryRestoreLastUrl())) { const sessionInfos = await this.platform.sessionInfoStorage.getAll(); if (sessionInfos.length === 0) { this.navigation.push("login"); diff --git a/src/domain/navigation/URLRouter.js b/src/domain/navigation/URLRouter.js index 1c60a467..b38791a0 100644 --- a/src/domain/navigation/URLRouter.js +++ b/src/domain/navigation/URLRouter.js @@ -24,20 +24,22 @@ export class URLRouter { this._pathSubscription = null; this._isApplyingUrl = false; this._defaultSessionId = this._getLastSessionId(); - } _getLastSessionId() { - const urlPath = this._history.urlAsPath(this._history.getLastUrl()); - const navPath = this._navigation.pathFrom(this._parseUrlPath(urlPath, this._navigation.path)); - return navPath.get("session")?.value; + const navPath = this._urlAsNavPath(this._history.getLastUrl() || ""); + const sessionId = navPath.get("session")?.value; + if (typeof sessionId === "string") { + return sessionId; + } + return null; } attach() { this._subscription = this._history.subscribe(url => this._applyUrl(url)); // subscribe to path before applying initial url - // so redirects in _applyNavigationPath are reflected in url bar - this._pathSubscription = this._navigation.pathObservable.subscribe(path => this._applyNavigationPath(path)); + // so redirects in _applyNavPathToHistory are reflected in url bar + this._pathSubscription = this._navigation.pathObservable.subscribe(path => this._applyNavPathToHistory(path)); this._applyUrl(this._history.get()); } @@ -46,7 +48,7 @@ export class URLRouter { this._pathSubscription = this._pathSubscription(); } - _applyNavigationPath(path) { + _applyNavPathToHistory(path) { const url = this.urlForPath(path); if (url !== this._history.get()) { if (this._isApplyingUrl) { @@ -58,10 +60,8 @@ export class URLRouter { } } - _applyUrl(url) { - const urlPath = this._history.urlAsPath(url) - const navPath = this._navigation.pathFrom(this._parseUrlPath(urlPath, this._navigation.path, this._defaultSessionId)); - // this will cause _applyNavigationPath to be called, + _applyNavPathToNavigation(navPath) { + // this will cause _applyNavPathToHistory to be called, // so set a flag whether this request came from ourselves // (in which case it is a redirect if the url does not match the current one) this._isApplyingUrl = true; @@ -69,12 +69,27 @@ export class URLRouter { this._isApplyingUrl = false; } + _urlAsNavPath(url) { + const urlPath = this._history.urlAsPath(url); + return this._navigation.pathFrom(this._parseUrlPath(urlPath, this._navigation.path, this._defaultSessionId)); + } + + _applyUrl(url) { + const navPath = this._urlAsNavPath(url); + this._applyNavPathToNavigation(navPath); + } + pushUrl(url) { this._history.pushUrl(url); } - getLastUrl() { - return this._history.getLastUrl(); + tryRestoreLastUrl() { + const lastNavPath = this._urlAsNavPath(this._history.getLastUrl() || ""); + if (lastNavPath.segments.length !== 0) { + this._applyNavPathToNavigation(navPath); + return true; + } + return false; } urlForSegments(segments) {