@fivethree/core
Version:
Fivethree Core Components
309 lines • 20.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/back-button/routing-state.service.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
import { filter } from 'rxjs/operators';
import { NavController, Platform } from '@ionic/angular';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@ionic/angular";
/**
* @record
*/
export function RoutingStateConfig() { }
if (false) {
/** @type {?} */
RoutingStateConfig.prototype.clearOn;
/** @type {?} */
RoutingStateConfig.prototype.root;
}
var FivRoutingStateService = /** @class */ (function () {
function FivRoutingStateService(router, navCtrl, platform) {
this.router = router;
this.navCtrl = navCtrl;
this.platform = platform;
this.history = [];
}
/**
* @param {?=} config
* @return {?}
*/
FivRoutingStateService.prototype.loadRouting = /**
* @param {?=} config
* @return {?}
*/
function (config) {
var _this = this;
this.config = config;
this.handleAndroidBackButton();
this.router.events
.pipe(filter((/**
* @param {?} event
* @return {?}
*/
function (event) { return event instanceof NavigationEnd; })))
.subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var urlAfterRedirects = _a.urlAfterRedirects;
if (urlAfterRedirects === _this.getPreviousUrl(_this.config.root)) {
_this.pop();
_this.pop();
}
// add url to history
_this.history.push(urlAfterRedirects);
if (_this.config && _this.config.clearOn) {
/** @type {?} */
var clear = _this.config.clearOn.some((/**
* @param {?} s
* @return {?}
*/
function (s) { return s === urlAfterRedirects; }));
if (clear) {
_this.clearHistory(urlAfterRedirects);
}
}
}));
};
/**
* @param {?} target
* @return {?}
*/
FivRoutingStateService.prototype.registerNavigateable = /**
* @param {?} target
* @return {?}
*/
function (target) {
if (isNavigateable(target)) {
this.history.push(target);
}
};
/**
* @return {?}
*/
FivRoutingStateService.prototype.handleAndroidBackButton = /**
* @return {?}
*/
function () {
var _this = this;
this.platform.backButton
.pipe(filter((/**
* @return {?}
*/
function () { return !isNavigateable(_this.getCurrentUrl()); })))
.subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
_this.goBack();
}));
this.platform.backButton
.pipe(filter((/**
* @return {?}
*/
function () { return isNavigateable(_this.getCurrentUrl()); })))
.subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
event.register(99999, (/**
* @return {?}
*/
function () {
_this.goBack('/');
}));
}));
};
/**
* @return {?}
*/
FivRoutingStateService.prototype.getHistory = /**
* @return {?}
*/
function () {
return this.history;
};
/**
* @param {?=} defaultHref
* @return {?}
*/
FivRoutingStateService.prototype.getPreviousUrl = /**
* @param {?=} defaultHref
* @return {?}
*/
function (defaultHref) {
if (defaultHref === void 0) { defaultHref = '/'; }
if (this.history.length >= 2) {
return this.history[this.history.length - 2];
}
return defaultHref;
};
/**
* @return {?}
*/
FivRoutingStateService.prototype.pop = /**
* @return {?}
*/
function () {
return this.history.pop();
};
/**
* @param {?} fromUrl
* @return {?}
*/
FivRoutingStateService.prototype.clearHistory = /**
* @param {?} fromUrl
* @return {?}
*/
function (fromUrl) {
var _this = this;
this.history = this.history.filter((/**
* @param {?} h
* @return {?}
*/
function (h) {
return _this.config.clearOn.some((/**
* @param {?} s
* @return {?}
*/
function (s) { return s === h; }));
}));
if (fromUrl !== this.config.root) {
this.history.push(fromUrl);
}
this.history = this.history
.reverse()
.filter((/**
* @param {?} item
* @param {?} pos
* @param {?} self
* @return {?}
*/
function (item, pos, self) {
return self.indexOf(item) === pos;
}))
.reverse();
if (this.history[0] !== this.config.root) {
this.history = tslib_1.__spread([this.config.root], this.history);
}
};
/**
* @return {?}
*/
FivRoutingStateService.prototype.getCurrentUrl = /**
* @return {?}
*/
function () {
return this.history[this.history.length - 1];
};
/**
* @param {?=} defaultHref
* @return {?}
*/
FivRoutingStateService.prototype.goBack = /**
* @param {?=} defaultHref
* @return {?}
*/
function (defaultHref) {
if (defaultHref === void 0) { defaultHref = '/'; }
if (this.getHistory().length <= 1) {
// close the app because we are at root level
return navigator['app']
? navigator['app'].exitApp()
: this.navCtrl.navigateBack(defaultHref);
}
/** @type {?} */
var current = this.getCurrentUrl();
if (typeof current !== 'string' && isNavigateable(current)) {
current.dismiss();
return this.pop();
}
/** @type {?} */
var previous = this.getPreviousUrl(defaultHref);
if (typeof previous === 'string') {
return this.navCtrl.navigateBack(previous);
}
if (isNavigateable(previous)) {
return this.navCtrl.navigateBack(this.getLatestUrl(defaultHref));
}
};
/**
* @param {?} defaultHref
* @return {?}
*/
FivRoutingStateService.prototype.getLatestUrl = /**
* @param {?} defaultHref
* @return {?}
*/
function (defaultHref) {
/** @type {?} */
var urls = this.history.filter((/**
* @param {?} e
* @return {?}
*/
function (e) { return !!(typeof e === 'string'); }));
/** @type {?} */
var latest = urls[urls.length - 1];
if (urls.length > 0 && latest && typeof latest === 'string') {
return latest;
}
return defaultHref;
};
FivRoutingStateService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
FivRoutingStateService.ctorParameters = function () { return [
{ type: Router },
{ type: NavController },
{ type: Platform }
]; };
/** @nocollapse */ FivRoutingStateService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function FivRoutingStateService_Factory() { return new FivRoutingStateService(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i2.NavController), i0.ɵɵinject(i2.Platform)); }, token: FivRoutingStateService, providedIn: "root" });
return FivRoutingStateService;
}());
export { FivRoutingStateService };
if (false) {
/**
* @type {?}
* @private
*/
FivRoutingStateService.prototype.history;
/**
* @type {?}
* @private
*/
FivRoutingStateService.prototype.config;
/**
* @type {?}
* @private
*/
FivRoutingStateService.prototype.router;
/**
* @type {?}
* @private
*/
FivRoutingStateService.prototype.navCtrl;
/**
* @type {?}
* @private
*/
FivRoutingStateService.prototype.platform;
}
/**
* @param {?} object
* @return {?}
*/
export function isNavigateable(object) {
return !!object && object.dismiss !== undefined;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpdmV0aHJlZS9jb3JlLyIsInNvdXJjZXMiOlsibGliL2JhY2stYnV0dG9uL3JvdXRpbmctc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE1BQU0sRUFBa0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBSXpELHdDQUdDOzs7SUFGQyxxQ0FBa0I7O0lBQ2xCLGtDQUFhOztBQUdmO0lBT0UsZ0NBQ1UsTUFBYyxFQUNkLE9BQXNCLEVBQ3RCLFFBQWtCO1FBRmxCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFOcEIsWUFBTyxHQUE4QixFQUFFLENBQUM7SUFPN0MsQ0FBQzs7Ozs7SUFFRyw0Q0FBVzs7OztJQUFsQixVQUFtQixNQUEyQjtRQUE5QyxpQkFtQkM7UUFsQkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2FBQ2YsSUFBSSxDQUFDLE1BQU07Ozs7UUFBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUssWUFBWSxhQUFhLEVBQTlCLENBQThCLEVBQUMsQ0FBQzthQUNyRCxTQUFTOzs7O1FBQUMsVUFBQyxFQUFvQztnQkFBbEMsd0NBQWlCO1lBQzdCLElBQUksaUJBQWlCLEtBQUssS0FBSSxDQUFDLGNBQWMsQ0FBQyxLQUFJLENBQUMsTUFBTSxD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VSxjQUFjLENBQUMsTUFBVztJQUN4QyxPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUM7QUFDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciwgTmF2aWdhdGlvbkVuZCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBmaWx0ZXIsIHRhcCwgdGFrZVdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTmF2Q29udHJvbGxlciwgUGxhdGZvcm0gfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBOYXZpZ2F0ZWFibGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGZyb21FdmVudCwgemlwLCByYWNlLCBmcm9tIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGluZ1N0YXRlQ29uZmlnIHtcbiAgY2xlYXJPbjogc3RyaW5nW107XG4gIHJvb3Q6IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRml2Um91dGluZ1N0YXRlU2VydmljZSB7XG4gIHByaXZhdGUgaGlzdG9yeTogKHN0cmluZyB8IE5hdmlnYXRlYWJsZSlbXSA9IFtdO1xuICBwcml2YXRlIGNvbmZpZzogUm91dGluZ1N0YXRlQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBuYXZDdHJsOiBOYXZDb250cm9sbGVyLFxuICAgIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtXG4gICkge31cblxuICBwdWJsaWMgbG9hZFJvdXRpbmcoY29uZmlnPzogUm91dGluZ1N0YXRlQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5oYW5kbGVBbmRyb2lkQmFja0J1dHRvbigpO1xuICAgIHRoaXMucm91dGVyLmV2ZW50c1xuICAgICAgLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpXG4gICAgICAuc3Vic2NyaWJlKCh7IHVybEFmdGVyUmVkaXJlY3RzIH06IE5hdmlnYXRpb25FbmQpID0+IHtcbiAgICAgICAgaWYgKHVybEFmdGVyUmVkaXJlY3RzID09PSB0aGlzLmdldFByZXZpb3VzVXJsKHRoaXMuY29uZmlnLnJvb3QpKSB7XG4gICAgICAgICAgdGhpcy5wb3AoKTtcbiAgICAgICAgICB0aGlzLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFkZCB1cmwgdG8gaGlzdG9yeVxuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaCh1cmxBZnRlclJlZGlyZWN0cyk7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5jbGVhck9uKSB7XG4gICAgICAgICAgY29uc3QgY2xlYXIgPSB0aGlzLmNvbmZpZy5jbGVhck9uLnNvbWUocyA9PiBzID09PSB1cmxBZnRlclJlZGlyZWN0cyk7XG4gICAgICAgICAgaWYgKGNsZWFyKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFySGlzdG9yeSh1cmxBZnRlclJlZGlyZWN0cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHJlZ2lzdGVyTmF2aWdhdGVhYmxlKHRhcmdldDogTmF2aWdhdGVhYmxlKSB7XG4gICAgaWYgKGlzTmF2aWdhdGVhYmxlKHRhcmdldCkpIHtcbiAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRhcmdldCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQW5kcm9pZEJhY2tCdXR0b24oKSB7XG4gICAgdGhpcy5wbGF0Zm9ybS5iYWNrQnV0dG9uXG4gICAgICAucGlwZShmaWx0ZXIoKCkgPT4gIWlzTmF2aWdhdGVhYmxlKHRoaXMuZ2V0Q3VycmVudFVybCgpKSkpXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5nb0JhY2soKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5wbGF0Zm9ybS5iYWNrQnV0dG9uXG4gICAgICAucGlwZShmaWx0ZXIoKCkgPT4gaXNOYXZpZ2F0ZWFibGUodGhpcy5nZXRDdXJyZW50VXJsKCkpKSlcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICBldmVudC5yZWdpc3Rlcig5OTk5OSwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZ29CYWNrKCcvJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlzdG9yeSgpOiAoc3RyaW5nIHwgTmF2aWdhdGVhYmxlKVtdIHtcbiAgICByZXR1cm4gdGhpcy5oaXN0b3J5O1xuICB9XG5cbiAgcHVibGljIGdldFByZXZpb3VzVXJsKGRlZmF1bHRIcmVmID0gJy8nKTogc3RyaW5nIHwgTmF2aWdhdGVhYmxlIHtcbiAgICBpZiAodGhpcy5oaXN0b3J5Lmxlbmd0aCA+PSAyKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9yeS5sZW5ndGggLSAyXTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIcmVmO1xuICB9XG5cbiAgcHVibGljIHBvcCgpOiBzdHJpbmcgfCBOYXZpZ2F0ZWFibGUge1xuICAgIHJldHVybiB0aGlzLmhpc3RvcnkucG9wKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJIaXN0b3J5KGZyb21Vcmw6IHN0cmluZykge1xuICAgIHRoaXMuaGlzdG9yeSA9IHRoaXMuaGlzdG9yeS5maWx0ZXIoaCA9PlxuICAgICAgdGhpcy5jb25maWcuY2xlYXJPbi5zb21lKHMgPT4gcyA9PT0gaClcbiAgICApO1xuICAgIGlmIChmcm9tVXJsICE9PSB0aGlzLmNvbmZpZy5yb290KSB7XG4gICAgICB0aGlzLmhpc3RvcnkucHVzaChmcm9tVXJsKTtcbiAgICB9XG4gICAgdGhpcy5oaXN0b3J5ID0gdGhpcy5oaXN0b3J5XG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0sIHBvcywgc2VsZikge1xuICAgICAgICByZXR1cm4gc2VsZi5pbmRleE9mKGl0ZW0pID09PSBwb3M7XG4gICAgICB9KVxuICAgICAgLnJldmVyc2UoKTtcbiAgICBpZiAodGhpcy5oaXN0b3J5WzBdICE9PSB0aGlzLmNvbmZpZy5yb290KSB7XG4gICAgICB0aGlzLmhpc3RvcnkgPSBbdGhpcy5jb25maWcucm9vdCwgLi4udGhpcy5oaXN0b3J5XTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VycmVudFVybCgpOiBzdHJpbmcgfCBOYXZpZ2F0ZWFibGUge1xuICAgIHJldHVybiB0aGlzLmhpc3RvcnlbdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgZ29CYWNrKGRlZmF1bHRIcmVmID0gJy8nKSB7XG4gICAgaWYgKHRoaXMuZ2V0SGlzdG9yeSgpLmxlbmd0aCA8PSAxKSB7XG4gICAgICAvLyBjbG9zZSB0aGUgYXBwIGJlY2F1c2Ugd2UgYXJlIGF0IHJvb3QgbGV2ZWxcbiAgICAgIHJldHVybiBuYXZpZ2F0b3JbJ2FwcCddXG4gICAgICAgID8gbmF2aWdhdG9yWydhcHAnXS5leGl0QXBwKClcbiAgICAgICAgOiB0aGlzLm5hdkN0cmwubmF2aWdhdGVCYWNrKGRlZmF1bHRIcmVmKTtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZ2V0Q3VycmVudFVybCgpO1xuICAgIGlmICh0eXBlb2YgY3VycmVudCAhPT0gJ3N0cmluZycgJiYgaXNOYXZpZ2F0ZWFibGUoY3VycmVudCkpIHtcbiAgICAgIGN1cnJlbnQuZGlzbWlzcygpO1xuICAgICAgcmV0dXJuIHRoaXMucG9wKCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmdldFByZXZpb3VzVXJsKGRlZmF1bHRIcmVmKTtcbiAgICBpZiAodHlwZW9mIHByZXZpb3VzID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMubmF2Q3RybC5uYXZpZ2F0ZUJhY2socHJldmlvdXMpO1xuICAgIH1cbiAgICBpZiAoaXNOYXZpZ2F0ZWFibGUocHJldmlvdXMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXZDdHJsLm5hdmlnYXRlQmFjayh0aGlzLmdldExhdGVzdFVybChkZWZhdWx0SHJlZikpO1xuICAgIH1cbiAgfVxuXG4gIGdldExhdGVzdFVybChkZWZhdWx0SHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB1cmxzID0gdGhpcy5oaXN0b3J5LmZpbHRlcihlID0+ICEhKHR5cGVvZiBlID09PSAnc3RyaW5nJykpO1xuICAgIGNvbnN0IGxhdGVzdCA9IHVybHNbdXJscy5sZW5ndGggLSAxXTtcbiAgICBpZiAodXJscy5sZW5ndGggPiAwICYmIGxhdGVzdCAmJiB0eXBlb2YgbGF0ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGxhdGVzdDtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIcmVmO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05hdmlnYXRlYWJsZShvYmplY3Q6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFvYmplY3QgJiYgb2JqZWN0LmRpc21pc3MgIT09IHVuZGVmaW5lZDtcbn1cbiJdfQ==