@idiosync/react-observable
Version:
State management control layer for React projects
41 lines (40 loc) • 1.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useStream = void 0;
const react_1 = require("react");
const use_equality_checker_1 = require("./use-equality-checker");
const observable_1 = require("../factories/observable");
const use_store_proxy_1 = require("./use-store-proxy");
const useStream = (initialise, dependencies) => {
const ref = (0, react_1.useRef)(undefined);
const subscriptionsRef = (0, react_1.useRef)([]);
const entry$ = (0, react_1.useRef)((0, observable_1.createObservable)({ initialValue: dependencies })).current;
const handleSubscription = (0, react_1.useCallback)((unsubscribe) => {
subscriptionsRef.current.push(unsubscribe);
}, []);
const observableStoreProxy = (0, use_store_proxy_1.useStoreProxy)(handleSubscription);
if (!ref.current) {
ref.current = initialise({
$: entry$,
store: observableStoreProxy,
});
}
const isEqual = (0, use_equality_checker_1.useEqualityChecker)(dependencies);
if (!isEqual) {
entry$.set(dependencies);
}
const [data, setData] = (0, react_1.useState)(ref.current.get);
(0, react_1.useEffect)(() => {
var _a;
const sub = (_a = ref.current) === null || _a === void 0 ? void 0 : _a.subscribe((newData) => {
setData(newData);
});
return () => {
sub === null || sub === void 0 ? void 0 : sub();
subscriptionsRef.current.forEach((unsub) => unsub());
subscriptionsRef.current.length = 0;
};
}, []);
return data;
};
exports.useStream = useStream;