@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.16 kB
JavaScript
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
const oldNgOnDestroy = component.ngOnDestroy;
const stop$ = new ReplaySubject();
// eslint-disable-next-line @angular-eslint/no-lifecycle-call
component.ngOnDestroy = () => {
// 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 const untilComponentDestroyed =
// eslint-disable-next-line max-len
(component) => (source) => source.pipe(takeUntil(componentDestroyed(component)));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW50aWwtY29tcG9uZW50LWRlc3Ryb3llZC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0ZXJtaW51cy9uZ3gtdG9vbHMvdXRpbGl0aWVzLyIsInNvdXJjZXMiOlsidW50aWwtY29tcG9uZW50LWRlc3Ryb3llZC91bnRpbC1jb21wb25lbnQtZGVzdHJveWVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxhQUFhLEdBQ2QsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFjM0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsU0FBd0I7SUFDekQsSUFBSSxTQUFTLENBQUMsbUJBQW1CLEVBQUU7UUFDakMsT0FBTyxTQUFTLENBQUMsbUJBQW1CLENBQUM7S0FDdEM7SUFFRCw2REFBNkQ7SUFDN0QsTUFBTSxjQUFjLEdBQXlCLFNBQVMsQ0FBQyxXQUFXLENBQUM7SUFDbkUsTUFBTSxLQUFLLEdBQXdCLElBQUksYUFBYSxFQUFRLENBQUM7SUFFN0QsNkRBQTZEO0lBQzdELFNBQVMsQ0FBQyxXQUFXLEdBQUcsR0FBRyxFQUFFO1FBQzNCLHVCQUF1QjtRQUN2QixJQUFJLGNBQWMsRUFBRTtZQUNsQixjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0lBRUYsU0FBUyxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyRCxPQUFPLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztBQUN2QyxDQUFDO0FBR0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUI7QUFDbEMsbUNBQW1DO0FBQ25DLENBQUksU0FBd0IsRUFBNEMsRUFBRSxDQUFDLENBQUMsTUFBcUIsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgdGhhdCByZXF1aXJlcyBuZ09uRGVzdHJveVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhPbkRlc3Ryb3kge1xuICBuZ09uRGVzdHJveSgpOiB2b2lkO1xuICBjb21wb25lbnREZXN0cm95ZWQkPzogT2JzZXJ2YWJsZTx0cnVlPjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5cbi8qKlxuICogUGF0Y2ggdGhlIGNvbXBvbmVudCB3aXRoIHVuc3Vic2NyaWJlIGJlaGF2aW9yXG4gKlxuICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgY2xhc3MgKGB0aGlzYCBjb250ZXh0KVxuICogQHJldHVybnMgQW4gb2JzZXJ2YWJsZSByZXByZXNlbnRpbmcgdGhlIHVuc3Vic2NyaWJlIGV2ZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb25lbnREZXN0cm95ZWQoY29tcG9uZW50OiBXaXRoT25EZXN0cm95KTogT2JzZXJ2YWJsZTx0cnVlPiB7XG4gIGlmIChjb21wb25lbnQuY29tcG9uZW50RGVzdHJveWVkJCkge1xuICAgIHJldHVybiBjb21wb25lbnQuY29tcG9uZW50RGVzdHJveWVkJDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tbGlmZWN5Y2xlLWNhbGxcbiAgY29uc3Qgb2xkTmdPbkRlc3Ryb3k6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkID0gY29tcG9uZW50Lm5nT25EZXN0cm95O1xuICBjb25zdCBzdG9wJDogUmVwbGF5U3ViamVjdDx0cnVlPiA9IG5ldyBSZXBsYXlTdWJqZWN0PHRydWU+KCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1saWZlY3ljbGUtY2FsbFxuICBjb21wb25lbnQubmdPbkRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICBpZiAob2xkTmdPbkRlc3Ryb3kpIHtcbiAgICAgIG9sZE5nT25EZXN0cm95LmFwcGx5KGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgc3RvcCQubmV4dCh0cnVlKTtcbiAgICBzdG9wJC5jb21wbGV0ZSgpO1xuICB9O1xuXG4gIGNvbXBvbmVudC5jb21wb25lbnREZXN0cm95ZWQkID0gc3RvcCQuYXNPYnNlcnZhYmxlKCk7XG4gIHJldHVybiBjb21wb25lbnQuY29tcG9uZW50RGVzdHJveWVkJDtcbn1cblxuXG4vKipcbiAqIEEgcGlwZS1hYmxlIG9wZXJhdG9yIHRvIHVuc3Vic2NyaWJlIGR1cmluZyBPbkRlc3Ryb3kgbGlmZWN5Y2xlIGV2ZW50XG4gKlxuICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgY2xhc3MgKGB0aGlzYCBjb250ZXh0KVxuICogQHJldHVybnMgVGhlIGNvbXBvbmVudCB3cmFwcGVkIGluIGFuIE9ic2VydmFibGVcbiAqXG4gKiBAZXhhbXBsZVxuICogc291cmNlLnBpcGUodW50aWxDb21wb25lbnREZXN0cm95ZWQodGhpcykpLnN1YnNjcmliZS4uLlxuICovXG5leHBvcnQgY29uc3QgdW50aWxDb21wb25lbnREZXN0cm95ZWQgPVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICA8VD4oY29tcG9uZW50OiBXaXRoT25EZXN0cm95KTogKHNvdXJjZTogT2JzZXJ2YWJsZTxUPikgPT4gT2JzZXJ2YWJsZTxUPiA9PiAoc291cmNlOiBPYnNlcnZhYmxlPFQ+KSA9PiBzb3VyY2UucGlwZSh0YWtlVW50aWwoY29tcG9uZW50RGVzdHJveWVkKGNvbXBvbmVudCkpKTtcbiJdfQ==