nrgy
Version:
The library for reactive programming using efficient computing and MVC/MVVM patterns
70 lines (63 loc) • 2.21 kB
JavaScript
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
};