UNPKG

@terminus/ngx-tools

Version:

[![CircleCI][circle-badge]][circle-link] [![codecov][codecov-badge]][codecov-project] [![semantic-release][semantic-release-badge]][semantic-release] [![MIT License][license-image]][license-url] <br> [![NPM version][npm-version-image]][npm-url] [![Github

40 lines 5.2 kB
import { ReplaySubject, } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; /** * Patch the component with unsubscribe behavior * * @param component - The component class (`this` context) * @returns An observable representing the unsubscribe event */ export function componentDestroyed(component) { if (component.componentDestroyed$) { return component.componentDestroyed$; } // eslint-disable-next-line @angular-eslint/no-lifecycle-call var oldNgOnDestroy = component.ngOnDestroy; var stop$ = new ReplaySubject(); // eslint-disable-next-line @angular-eslint/no-lifecycle-call component.ngOnDestroy = function () { // istanbul ignore else if (oldNgOnDestroy) { oldNgOnDestroy.apply(component); } stop$.next(true); stop$.complete(); }; component.componentDestroyed$ = stop$.asObservable(); return component.componentDestroyed$; } /** * A pipe-able operator to unsubscribe during OnDestroy lifecycle event * * @param component - The component class (`this` context) * @returns The component wrapped in an Observable * * @example * source.pipe(untilComponentDestroyed(this)).subscribe... */ export var untilComponentDestroyed = // eslint-disable-next-line max-len function (component) { return function (source) { return source.pipe(takeUntil(componentDestroyed(component))); }; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW50aWwtY29tcG9uZW50LWRlc3Ryb3llZC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0ZXJtaW51cy9uZ3gtdG9vbHMvdXRpbGl0aWVzLyIsInNvdXJjZXMiOlsidW50aWwtY29tcG9uZW50LWRlc3Ryb3llZC91bnRpbC1jb21wb25lbnQtZGVzdHJveWVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxhQUFhLEdBQ2QsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFjM0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsU0FBd0I7SUFDekQsSUFBSSxTQUFTLENBQUMsbUJBQW1CLEVBQUU7UUFDakMsT0FBTyxTQUFTLENBQUMsbUJBQW1CLENBQUM7S0FDdEM7SUFFRCw2REFBNkQ7SUFDN0QsSUFBTSxjQUFjLEdBQXlCLFNBQVMsQ0FBQyxXQUFXLENBQUM7SUFDbkUsSUFBTSxLQUFLLEdBQXdCLElBQUksYUFBYSxFQUFRLENBQUM7SUFFN0QsNkRBQTZEO0lBQzdELFNBQVMsQ0FBQyxXQUFXLEdBQUc7UUFDdEIsdUJBQXVCO1FBQ3ZCLElBQUksY0FBYyxFQUFFO1lBQ2xCLGNBQWMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDakM7UUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixTQUFTLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JELE9BQU8sU0FBUyxDQUFDLG1CQUFtQixDQUFDO0FBQ3ZDLENBQUM7QUFHRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxJQUFNLHVCQUF1QjtBQUNsQyxtQ0FBbUM7QUFDbkMsVUFBSSxTQUF3QixJQUErQyxPQUFBLFVBQUMsTUFBcUIsSUFBSyxPQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBckQsQ0FBcUQsRUFBaEYsQ0FBZ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIFJlcGxheVN1YmplY3QsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHRoYXQgcmVxdWlyZXMgbmdPbkRlc3Ryb3lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaXRoT25EZXN0cm95IHtcbiAgbmdPbkRlc3Ryb3koKTogdm9pZDtcbiAgY29tcG9uZW50RGVzdHJveWVkJD86IE9ic2VydmFibGU8dHJ1ZT47XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuXG4vKipcbiAqIFBhdGNoIHRoZSBjb21wb25lbnQgd2l0aCB1bnN1YnNjcmliZSBiZWhhdmlvclxuICpcbiAqIEBwYXJhbSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGNsYXNzIChgdGhpc2AgY29udGV4dClcbiAqIEByZXR1cm5zIEFuIG9ic2VydmFibGUgcmVwcmVzZW50aW5nIHRoZSB1bnN1YnNjcmliZSBldmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9uZW50RGVzdHJveWVkKGNvbXBvbmVudDogV2l0aE9uRGVzdHJveSk6IE9ic2VydmFibGU8dHJ1ZT4ge1xuICBpZiAoY29tcG9uZW50LmNvbXBvbmVudERlc3Ryb3llZCQpIHtcbiAgICByZXR1cm4gY29tcG9uZW50LmNvbXBvbmVudERlc3Ryb3llZCQ7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWxpZmVjeWNsZS1jYWxsXG4gIGNvbnN0IG9sZE5nT25EZXN0cm95OiBGdW5jdGlvbiB8IHVuZGVmaW5lZCA9IGNvbXBvbmVudC5uZ09uRGVzdHJveTtcbiAgY29uc3Qgc3RvcCQ6IFJlcGxheVN1YmplY3Q8dHJ1ZT4gPSBuZXcgUmVwbGF5U3ViamVjdDx0cnVlPigpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tbGlmZWN5Y2xlLWNhbGxcbiAgY29tcG9uZW50Lm5nT25EZXN0cm95ID0gKCkgPT4ge1xuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG4gICAgaWYgKG9sZE5nT25EZXN0cm95KSB7XG4gICAgICBvbGROZ09uRGVzdHJveS5hcHBseShjb21wb25lbnQpO1xuICAgIH1cblxuICAgIHN0b3AkLm5leHQodHJ1ZSk7XG4gICAgc3RvcCQuY29tcGxldGUoKTtcbiAgfTtcblxuICBjb21wb25lbnQuY29tcG9uZW50RGVzdHJveWVkJCA9IHN0b3AkLmFzT2JzZXJ2YWJsZSgpO1xuICByZXR1cm4gY29tcG9uZW50LmNvbXBvbmVudERlc3Ryb3llZCQ7XG59XG5cblxuLyoqXG4gKiBBIHBpcGUtYWJsZSBvcGVyYXRvciB0byB1bnN1YnNjcmliZSBkdXJpbmcgT25EZXN0cm95IGxpZmVjeWNsZSBldmVudFxuICpcbiAqIEBwYXJhbSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGNsYXNzIChgdGhpc2AgY29udGV4dClcbiAqIEByZXR1cm5zIFRoZSBjb21wb25lbnQgd3JhcHBlZCBpbiBhbiBPYnNlcnZhYmxlXG4gKlxuICogQGV4YW1wbGVcbiAqIHNvdXJjZS5waXBlKHVudGlsQ29tcG9uZW50RGVzdHJveWVkKHRoaXMpKS5zdWJzY3JpYmUuLi5cbiAqL1xuZXhwb3J0IGNvbnN0IHVudGlsQ29tcG9uZW50RGVzdHJveWVkID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgPFQ+KGNvbXBvbmVudDogV2l0aE9uRGVzdHJveSk6IChzb3VyY2U6IE9ic2VydmFibGU8VD4pID0+IE9ic2VydmFibGU8VD4gPT4gKHNvdXJjZTogT2JzZXJ2YWJsZTxUPikgPT4gc291cmNlLnBpcGUodGFrZVVudGlsKGNvbXBvbmVudERlc3Ryb3llZChjb21wb25lbnQpKSk7XG4iXX0=