Skip to content

Commit

Permalink
feat(cdk): make it configurable to run change detection of not in use…
Browse files Browse the repository at this point in the history
…HostListener$
  • Loading branch information
michaelbe812 committed May 3, 2023
1 parent b098529 commit 13e7890
Showing 1 changed file with 18 additions and 15 deletions.
33 changes: 18 additions & 15 deletions libs/cdk/rx-interop/src/lib/use-functions/use-host-listener$.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import {ChangeDetectorRef, ElementRef, inject, NgZone, ViewRef} from "@angular/core";
import {distinctUntilChanged, fromEvent, Observable, ReplaySubject, takeUntil} from "rxjs";
import {ChangeDetectorRef, ElementRef, inject, NgZone, ViewRef} from '@angular/core';
import {distinctUntilChanged, fromEvent, Observable, ReplaySubject, takeUntil} from 'rxjs';

export interface UseHostListenerConfig {
zoneless?: boolean;
}
/**
*
* @publicApi
Expand All @@ -17,25 +20,25 @@ import {distinctUntilChanged, fromEvent, Observable, ReplaySubject, takeUntil} f
*
* @param eventName
*/
export function useHostListener$<T extends Event>(eventName: string): Observable<T>{
const {nativeElement} = inject(ElementRef);
export function useHostListener$<T extends Event>(eventName: string): Observable<T>;
export function useHostListener$<T extends Event>(eventName: string, cfg: UseHostListenerConfig): Observable<T>;
export function useHostListener$<T extends Event>(eventName: string, cfg?: UseHostListenerConfig): Observable<T> {
const { nativeElement } = inject(ElementRef);
const ngZone = inject(NgZone);
const cdr = cfg?.zoneless ? undefined : inject(ChangeDetectorRef);

const events$ = new ReplaySubject<T>(1);

ngZone.runOutsideAngular(() => {
fromEvent<T>(nativeElement, eventName)
.pipe(
takeUntil(useOnDestroy())
)
.subscribe(value =>
events$.next(value)
);
})
.pipe(takeUntil(useOnDestroy()))
.subscribe((value) => {
events$.next(value);
cfg?.zoneless ? void 0 : cdr.detectChanges();
});
});

return events$.asObservable().pipe(
distinctUntilChanged()
);
return events$.asObservable().pipe(distinctUntilChanged());
}

/**
Expand All @@ -50,7 +53,7 @@ export function useOnDestroy() {
viewRef?.onDestroy(() => {
onDestroy$.next(void 0);
onDestroy$.complete();
})
});

return onDestroy$;
}

0 comments on commit 13e7890

Please sign in to comment.