Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 53 54 55 56 57 | 1x 1x 5x 5x 5x 4x 2x 1x 2x 2x 2x 4x | import { useState, useLayoutEffect, useMemo } from 'react';
import { BehaviorSubject, Observable } from 'rxjs';
type RxInput<T> =
| BehaviorSubject<T>
| Observable<T>
| (() => BehaviorSubject<T> | Observable<T>);
export function useRx<T>(
obsInput$: BehaviorSubject<T>,
deps?: React.DependencyList | undefined
): T;
export function useRx<T>(
obsInput$: () => BehaviorSubject<T>,
deps?: React.DependencyList | undefined
): T;
export function useRx<T>(
obsInput$: Observable<T>,
deps?: React.DependencyList | undefined
): T | undefined;
export function useRx<T>(
obsInput$: () => Observable<T>,
deps?: React.DependencyList | undefined
): T | undefined;
export function useRx<T>(
obsInput$: RxInput<T>,
deps?: React.DependencyList | undefined
): T | undefined {
const obs$ = useMemo(
() => (typeof obsInput$ === 'function' ? obsInput$() : obsInput$),
deps
);
const [value, setValue] = useState<T>(
// @ts-ignore
'getValue' in obs$ ? obs$.getValue() : ((undefined as unknown) as T)
);
// subscribe to observable
useLayoutEffect(() => {
const sub = obs$.subscribe(setValue, (err: any) => {
setValue(() => {
throw err;
});
});
return () => {
sub.unsubscribe();
};
}, [obs$]);
return value;
}
|