UNPKG

@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
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==