@selfage/stateful_navigator
Version:
Navigate with observable state tracked in browser history.
38 lines • 4.19 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.HistoryLoader = void 0;
const parser_1 = require("@selfage/observable/parser");
class HistoryLoader {
constructor(stateDescriptor, queryParamKey, window) {
this.stateDescriptor = stateDescriptor;
this.queryParamKey = queryParamKey;
this.window = window;
this.state = new this.stateDescriptor.constructor();
}
static create(stateDescriptor, queryParamKey) {
return new HistoryLoader(stateDescriptor, queryParamKey, window).init();
}
init() {
this.load();
this.window.addEventListener("popstate", () => this.load());
return this;
}
load() {
let stateStr = new URLSearchParams(this.window.location.search).get(this.queryParamKey);
let stateObj;
if (stateStr) {
try {
stateObj = JSON.parse(stateStr);
}
catch (e) {
stateObj = {};
}
}
else {
stateObj = {};
}
parser_1.parseObservable(stateObj, this.stateDescriptor, this.state);
}
}
exports.HistoryLoader = HistoryLoader;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeV9sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJoaXN0b3J5X2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx1REFBNkQ7QUFFN0QsTUFBYSxhQUFhO0lBR3hCLFlBQ1UsZUFBd0MsRUFDeEMsYUFBcUIsRUFDckIsTUFBYztRQUZkLG9CQUFlLEdBQWYsZUFBZSxDQUF5QjtRQUN4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBTGpCLFVBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7SUFNbkQsQ0FBQztJQUVHLE1BQU0sQ0FBQyxNQUFNLENBQ2xCLGVBQXdDLEVBQ3hDLGFBQXFCO1FBRXJCLE9BQU8sSUFBSSxhQUFhLENBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxRSxDQUFDO0lBRU0sSUFBSTtRQUNULElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLElBQUk7UUFDVixJQUFJLFFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQ2pFLElBQUksQ0FBQyxhQUFhLENBQ25CLENBQUM7UUFDRixJQUFJLFFBQWEsQ0FBQztRQUNsQixJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUk7Z0JBQ0YsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDakM7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixRQUFRLEdBQUcsRUFBRSxDQUFDO2FBQ2Y7U0FDRjthQUFNO1lBQ0wsUUFBUSxHQUFHLEVBQUUsQ0FBQztTQUNmO1FBQ0Qsd0JBQWUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUQsQ0FBQztDQUNGO0FBdENELHNDQXNDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGVEZXNjcmlwdG9yIH0gZnJvbSBcIkBzZWxmYWdlL29ic2VydmFibGUvZGVzY3JpcHRvclwiO1xuaW1wb3J0IHsgcGFyc2VPYnNlcnZhYmxlIH0gZnJvbSBcIkBzZWxmYWdlL29ic2VydmFibGUvcGFyc2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBIaXN0b3J5TG9hZGVyPFQ+IHtcbiAgcHVibGljIHN0YXRlID0gbmV3IHRoaXMuc3RhdGVEZXNjcmlwdG9yLmNvbnN0cnVjdG9yKCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RhdGVEZXNjcmlwdG9yOiBPYnNlcnZhYmxlRGVzY3JpcHRvcjxUPixcbiAgICBwcml2YXRlIHF1ZXJ5UGFyYW1LZXk6IHN0cmluZyxcbiAgICBwcml2YXRlIHdpbmRvdzogV2luZG93XG4gICkge31cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZTxUPihcbiAgICBzdGF0ZURlc2NyaXB0b3I6IE9ic2VydmFibGVEZXNjcmlwdG9yPFQ+LFxuICAgIHF1ZXJ5UGFyYW1LZXk6IHN0cmluZ1xuICApOiBIaXN0b3J5TG9hZGVyPFQ+IHtcbiAgICByZXR1cm4gbmV3IEhpc3RvcnlMb2FkZXIoc3RhdGVEZXNjcmlwdG9yLCBxdWVyeVBhcmFtS2V5LCB3aW5kb3cpLmluaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KCk6IHRoaXMge1xuICAgIHRoaXMubG9hZCgpO1xuICAgIHRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCAoKSA9PiB0aGlzLmxvYWQoKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIGxvYWQoKTogdm9pZCB7XG4gICAgbGV0IHN0YXRlU3RyID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh0aGlzLndpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldChcbiAgICAgIHRoaXMucXVlcnlQYXJhbUtleVxuICAgICk7XG4gICAgbGV0IHN0YXRlT2JqOiBhbnk7XG4gICAgaWYgKHN0YXRlU3RyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGF0ZU9iaiA9IEpTT04ucGFyc2Uoc3RhdGVTdHIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzdGF0ZU9iaiA9IHt9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZU9iaiA9IHt9O1xuICAgIH1cbiAgICBwYXJzZU9ic2VydmFibGUoc3RhdGVPYmosIHRoaXMuc3RhdGVEZXNjcmlwdG9yLCB0aGlzLnN0YXRlKTtcbiAgfVxufVxuIl19