All files react.ts

100% Statements 14/14
100% Branches 4/4
100% Functions 6/6
100% Lines 12/12

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 571x                                                       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;
}