UNPKG

nrgy

Version:

The library for reactive programming using efficient computing and MVC/MVVM patterns

70 lines (63 loc) 2.21 kB
import "./chunk-JYWBIFMU.js"; import { defaultEquals } from "./chunk-6EESSQRU.js"; // src/rxjs-react/useObservable.ts import { identity } from "rxjs"; // src/rxjs-react/useSelector.ts import { useEffect, useState } from "react"; function useSelector(source$, initialValue, selector, comparator = defaultEquals) { const [value, setValue] = useState(() => selector(initialValue)); useEffect(() => { const subscription = source$.subscribe((state) => { const value2 = selector(state); setValue( (prevValue) => comparator(value2, prevValue) ? prevValue : value2 ); }); return () => subscription.unsubscribe(); }, [comparator, selector, source$]); return value; } // src/rxjs-react/useObservable.ts function useObservable(source$, initialValue, comparator) { return useSelector(source$, initialValue, identity, comparator); } // src/rxjs-react/useObserver.ts import { useEffect as useEffect3, useRef } from "react"; // src/rxjs-react/useIsomorphicLayoutEffect.ts import { useEffect as useEffect2, useLayoutEffect } from "react"; var IS_BROWSER = typeof window !== "undefined"; var useIsomorphicLayoutEffect = IS_BROWSER ? useLayoutEffect : ( /* istanbul ignore next: both are not called on server */ useEffect2 ); // src/rxjs-react/useObserver.ts function useObserver(source$, observerOrNext) { const argsRef = useRef(); useIsomorphicLayoutEffect(() => { argsRef.current = typeof observerOrNext === "function" ? { next: observerOrNext } : observerOrNext; }); useEffect3(() => { const subscription = source$.subscribe({ next: (value) => { var _a, _b; return (_b = (_a = argsRef.current) == null ? void 0 : _a.next) == null ? void 0 : _b.call(_a, value); }, error: (error) => { var _a, _b; return (_b = (_a = argsRef.current) == null ? void 0 : _a.error) == null ? void 0 : _b.call(_a, error); }, complete: () => { var _a, _b; return (_b = (_a = argsRef.current) == null ? void 0 : _a.complete) == null ? void 0 : _b.call(_a); } }); return () => subscription.unsubscribe(); }, [source$]); } export { useObservable, useObserver, useSelector };