@idiosync/react-observable
Version:
State management control layer for React projects
40 lines (39 loc) • 1.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useObservableValue = useObservableValue;
const react_1 = require("react");
const use_store_proxy_1 = require("./use-store-proxy");
const stream_1 = require("../utils/stream");
function useObservableValue(initialise) {
const ref = (0, react_1.useRef)(undefined);
const subscriptionsRef = (0, react_1.useRef)([]);
const handleSubscription = (0, react_1.useCallback)((subscription) => {
subscriptionsRef.current.push(subscription);
}, []);
const observableStoreProxy = (0, use_store_proxy_1.useStoreProxy)(handleSubscription);
const handleWrapObservable = (0, react_1.useCallback)((observable) => {
return (0, stream_1.wrapObservable)(observable, handleSubscription);
}, []);
if (!ref.current) {
ref.current = initialise({
store: observableStoreProxy,
wrapObservable: handleWrapObservable,
});
}
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 () => {
var _a;
(_a = ref.current) === null || _a === void 0 ? void 0 : _a.cancelStream();
subscriptionsRef.current.forEach((subscription) => { var _a; return (_a = subscription.cancelStream) === null || _a === void 0 ? void 0 : _a.call(subscription); });
sub === null || sub === void 0 ? void 0 : sub();
subscriptionsRef.current.forEach((subscription) => subscription.unsubscribe());
subscriptionsRef.current.length = 0;
};
}, []);
return data;
}