UNPKG

prostgles-client

Version:

Reactive client for Postgres

48 lines (47 loc) 1.95 kB
"use strict"; 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;