UNPKG

prostgles-client

Version:

Reactive client for Postgres

69 lines (68 loc) 2.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.usePromise = void 0; const prostgles_types_1 = require("prostgles-types"); const reactImports_1 = require("../hooks/reactImports"); const { useState } = reactImports_1.reactImports; const useAsyncEffectQueue_1 = require("./useAsyncEffectQueue"); const useIsMounted_1 = require("./useIsMounted"); const usePromise = (f, deps = []) => { const isPromiseFunc = (val) => { try { return typeof val === "function" || val instanceof Promise; } catch (e) { console.error(e); } return false; }; const isNamedObj = (val) => { try { return (0, prostgles_types_1.isObject)(val) && !isPromiseFunc(val); } catch (e) { console.error(e); } return false; }; const getNamedObjResults = async (val) => { const data = {}; const keys = (0, prostgles_types_1.getKeys)(val); for await (const key of keys) { const prop = val[key]; try { data[key] = typeof prop === "function" ? await prop() : await prop; } catch (e) { console.error(e); } } return data; }; const [result, setResult] = useState(isNamedObj(f) ? {} : undefined); const getIsMounted = (0, useIsMounted_1.useIsMounted)(); (0, useAsyncEffectQueue_1.useAsyncEffectQueue)(async () => { let promiseResult; try { if (isNamedObj(f)) { promiseResult = await getNamedObjResults(f); } else { const funcRes = await f(); const isNObj = isNamedObj(funcRes); promiseResult = isNObj ? await getNamedObjResults(funcRes) : isPromiseFunc(funcRes) ? await funcRes() : funcRes; } } catch (e) { console.error(e); } if (!getIsMounted()) return; setResult(promiseResult); }, deps); return result; }; exports.usePromise = usePromise;