prostgles-client
Version:
Reactive client for Postgres
69 lines (68 loc) • 2.2 kB
JavaScript
;
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;