-
Notifications
You must be signed in to change notification settings - Fork 70
/
inject-destroy.ts
52 lines (46 loc) · 1.27 KB
/
inject-destroy.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import {
DestroyRef,
inject,
runInInjectionContext,
type Injector,
} from '@angular/core';
import { assertInjector } from 'ngxtension/assert-injector';
import { ReplaySubject } from 'rxjs';
/**
* Injects the `DestroyRef` service and returns a `ReplaySubject` that emits
* when the component is destroyed.
*
* @throws {Error} If no `DestroyRef` is found.
* @returns {ReplaySubject<void>} A `ReplaySubject` that emits when the component is destroyed.
*
* @example
* // In your component:
* export class MyComponent {
* private destroy$ = injectDestroy();
*
* getData() {
* return this.service.getData()
* .pipe(takeUntil(this.destroy$))
* .subscribe(data => { ... });
* }
* }
*/
export const injectDestroy = (
injector?: Injector,
): ReplaySubject<void> & { onDestroy: DestroyRef['onDestroy'] } => {
injector = assertInjector(injectDestroy, injector);
return runInInjectionContext(injector, () => {
const destroyRef = inject(DestroyRef);
const subject$ = new ReplaySubject<void>(1);
destroyRef.onDestroy(() => {
subject$.next();
subject$.complete();
});
Object.assign(subject$, {
onDestroy: destroyRef.onDestroy.bind(destroyRef),
});
return subject$ as ReplaySubject<void> & {
onDestroy: DestroyRef['onDestroy'];
};
});
};