prostgles-client
Version:
Reactive client for Postgres
48 lines (47 loc) • 1.95 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useSubscribe = void 0;
const prostgles_types_1 = require("prostgles-types");
const reactImports_1 = require("../hooks/reactImports");
const { useRef, useState } = reactImports_1.reactImports;
const useIsMounted_1 = require("./useIsMounted");
const useAsyncEffectQueue_1 = require("./useAsyncEffectQueue");
const useSubscribe = (subFunc, expectsOne, filter, options, hookOptions) => {
const { skip } = hookOptions !== null && hookOptions !== void 0 ? hookOptions : {};
const defaultLoadingResult = { data: undefined, error: undefined, isLoading: true };
const [hookResult, setHookResult] = useState(defaultLoadingResult);
const hookResultRef = useRef(hookResult);
hookResultRef.current = hookResult;
const getIsMounted = (0, useIsMounted_1.useIsMounted)();
(0, useAsyncEffectQueue_1.useAsyncEffectQueue)(async () => {
if (!getIsMounted() || skip)
return;
if (!(0, prostgles_types_1.isEqual)(hookResultRef.current, defaultLoadingResult)) {
setHookResult(defaultLoadingResult);
}
const setError = (newError) => {
if (!getIsMounted())
return;
setHookResult({ data: undefined, error: newError, isLoading: false });
};
try {
const sub = await subFunc(filter, options, (newData) => {
if (!getIsMounted())
return;
setHookResult({
data: expectsOne ? newData[0] : newData,
error: undefined,
isLoading: false,
});
}, setError);
return () => {
sub.unsubscribe();
};
}
catch (error) {
setError(error);
}
}, [subFunc, filter, options, skip]);
return hookResult;
};
exports.useSubscribe = useSubscribe;