fix an applying an url also pushing a copy of the url back on history

it should replace instead, as it is a redirect
This commit is contained in:
Bruno Windels 2020-10-19 12:55:42 +02:00
parent fb273782bf
commit 8357260133

View file

@ -22,22 +22,13 @@ export class URLRouter {
this._stringifyPath = stringifyPath; this._stringifyPath = stringifyPath;
this._subscription = null; this._subscription = null;
this._pathSubscription = null; this._pathSubscription = null;
this._isApplyingUrl = false;
} }
attach() { attach() {
this._subscription = this._history.subscribe(url => { this._subscription = this._history.subscribe(url => this._applyUrl(url));
const redirectedUrl = this._applyUrl(url);
if (redirectedUrl !== url) {
this._history.replaceUrlSilently(redirectedUrl);
}
});
this._applyUrl(this._history.get()); this._applyUrl(this._history.get());
this._pathSubscription = this._navigation.pathObservable.subscribe(path => { this._pathSubscription = this._navigation.pathObservable.subscribe(path => this._applyNavigationPath(path));
const url = this.urlForPath(path);
if (url !== this._history.get()) {
this._history.pushUrlSilently(url);
}
});
} }
dispose() { dispose() {
@ -45,11 +36,27 @@ export class URLRouter {
this._pathSubscription = this._pathSubscription(); this._pathSubscription = this._pathSubscription();
} }
_applyNavigationPath(path) {
const url = this.urlForPath(path);
if (url !== this._history.get()) {
if (this._isApplyingUrl) {
// redirect
this._history.replaceUrlSilently(url);
} else {
this._history.pushUrlSilently(url);
}
}
}
_applyUrl(url) { _applyUrl(url) {
const urlPath = this._history.urlAsPath(url) const urlPath = this._history.urlAsPath(url)
const navPath = this._navigation.pathFrom(this._parseUrlPath(urlPath, this._navigation.path)); const navPath = this._navigation.pathFrom(this._parseUrlPath(urlPath, this._navigation.path));
// this will cause _applyNavigationPath 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;
this._navigation.applyPath(navPath); this._navigation.applyPath(navPath);
return this._history.pathAsUrl(this._stringifyPath(navPath)); this._isApplyingUrl = false;
} }
pushUrl(url) { pushUrl(url) {