@kovalenko/has-unsaved-data
Version:
Provides a router guard preventing route deactivation, if the component\`s method decorated with `@CheckUnsavedData()` returns `true`. Also it prevents the window to be unloaded.
29 lines • 4.98 kB
JavaScript
export const UnsavedDataChecker = (optionsHandler) => {
return (target, methodName, descriptor) => {
if (target.constructor.prototype.____UnsavedDataChecker____) {
throw new Error('There can be only one @UnsavedDataChecker() in a class');
}
target.constructor.prototype.____UnsavedDataChecker____ = methodName;
target.constructor.prototype.____UnsavedDataOptionsHandler____ = optionsHandler;
function beforeUnload(e) {
// @ts-ignore
if (this[methodName]()) {
e.returnValue = true;
}
}
let binded;
const originalNgOnInit = target.constructor.prototype.ngOnInit;
target.constructor.prototype.ngOnInit = function () {
originalNgOnInit && originalNgOnInit.call(this);
binded = beforeUnload.bind(this);
window.addEventListener('beforeunload', binded);
};
const originalNgOnDestroy = target.constructor.prototype.ngOnDestroy;
target.constructor.prototype.ngOnDestroy = function () {
originalNgOnDestroy && originalNgOnDestroy.call(this);
window.removeEventListener('beforeunload', binded);
};
return descriptor;
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zYXZlZC1kYXRhLWNoZWNrZXIuZGVjb3JhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaGFzLXVuc2F2ZWQtZGF0YS9zcmMvbGliL3Vuc2F2ZWQtZGF0YS1jaGVja2VyLmRlY29yYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFnQyxjQUE4QyxFQUFtQixFQUFFO0lBQ25JLE9BQU8sQ0FBQyxNQUEyQixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsRUFBRTtRQUM3RCxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLDBCQUEwQixFQUFFO1lBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztTQUMzRTtRQUVELE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLDBCQUEwQixHQUFHLFVBQVUsQ0FBQztRQUNyRSxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxpQ0FBaUMsR0FBRyxjQUFjLENBQUM7UUFFaEYsU0FBUyxZQUFZLENBQUMsQ0FBUTtZQUM1QixhQUFhO1lBQ2IsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRTtnQkFDdEIsQ0FBQyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7YUFDdEI7UUFDSCxDQUFDO1FBRUQsSUFBSSxNQUEwQixDQUFDO1FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO1FBQy9ELE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRztZQUN0QyxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFaEQsTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFFRixNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUNyRSxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUc7WUFDekMsbUJBQW1CLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXRELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDO1FBRUYsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtVbnNhdmVkRGF0YUNvbmZpZ30gZnJvbSAnLi91bnNhdmVkLWRhdGEtY29uZmlnLmludGVyZmFjZSc7XHJcblxyXG5leHBvcnQgY29uc3QgVW5zYXZlZERhdGFDaGVja2VyID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihvcHRpb25zSGFuZGxlcj86IChvYmo6IFQpID0+IFVuc2F2ZWREYXRhQ29uZmlnKTogTWV0aG9kRGVjb3JhdG9yID0+IHtcclxuICByZXR1cm4gKHRhcmdldDogUmVjb3JkPHN0cmluZywgYW55PiwgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcikgPT4ge1xyXG4gICAgaWYgKHRhcmdldC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuX19fX1Vuc2F2ZWREYXRhQ2hlY2tlcl9fX18pIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBjYW4gYmUgb25seSBvbmUgQFVuc2F2ZWREYXRhQ2hlY2tlcigpIGluIGEgY2xhc3MnKTtcclxuICAgIH1cclxuXHJcbiAgICB0YXJnZXQuY29uc3RydWN0b3IucHJvdG90eXBlLl9fX19VbnNhdmVkRGF0YUNoZWNrZXJfX19fID0gbWV0aG9kTmFtZTtcclxuICAgIHRhcmdldC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuX19fX1Vuc2F2ZWREYXRhT3B0aW9uc0hhbmRsZXJfX19fID0gb3B0aW9uc0hhbmRsZXI7XHJcblxyXG4gICAgZnVuY3Rpb24gYmVmb3JlVW5sb2FkKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgaWYgKHRoaXNbbWV0aG9kTmFtZV0oKSkge1xyXG4gICAgICAgIGUucmV0dXJuVmFsdWUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGJpbmRlZDogKGU6IEV2ZW50KSA9PiB2b2lkO1xyXG4gICAgY29uc3Qgb3JpZ2luYWxOZ09uSW5pdCA9IHRhcmdldC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUubmdPbkluaXQ7XHJcbiAgICB0YXJnZXQuY29uc3RydWN0b3IucHJvdG90eXBlLm5nT25Jbml0ID0gZnVuY3Rpb24odGhpczogYW55KTogdm9pZCB7XHJcbiAgICAgIG9yaWdpbmFsTmdPbkluaXQgJiYgb3JpZ2luYWxOZ09uSW5pdC5jYWxsKHRoaXMpO1xyXG5cclxuICAgICAgYmluZGVkID0gYmVmb3JlVW5sb2FkLmJpbmQodGhpcyk7XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBiaW5kZWQpO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBvcmlnaW5hbE5nT25EZXN0cm95ID0gdGFyZ2V0LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5uZ09uRGVzdHJveTtcclxuICAgIHRhcmdldC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbih0aGlzOiBhbnkpOiB2b2lkIHtcclxuICAgICAgb3JpZ2luYWxOZ09uRGVzdHJveSAmJiBvcmlnaW5hbE5nT25EZXN0cm95LmNhbGwodGhpcyk7XHJcblxyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgYmluZGVkKTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XHJcbiAgfVxyXG59XHJcbiJdfQ==