UNPKG

fenextjs-hook

Version:
140 lines 4.33 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useRequestLite = exports.useRequestFunction = exports.useRequest = void 0; const react_1 = require("react"); /** * A hook that sends an HTTP request. * @template Q Query parameter type. * @template R Response type. * @template E Error type. * @template T Request result type. * @param query Query parameter. * @param request HTTP request function. * @param autoRequest Whether to send the request automatically on mount. * @returns An object containing the request result, loading status, error, and request function. */ const useRequest = ({ query, request, autoRequest = false, defaultError = undefined, defaultResult = undefined, defaultResultValue = undefined, }) => { const [error, setError] = (0, react_1.useState)(defaultError); const [result, setResult] = (0, react_1.useState)(defaultResult); const [resultValue, setResultValue] = (0, react_1.useState)(defaultResultValue); const [loader, setLoader] = (0, react_1.useState)(false); const onRequest = (0, react_1.useCallback)(async () => { setLoader(true); try { setError(undefined); const respond = await request(query); setResultValue(respond.result); setResult(respond); } catch (error) { setError(error); } setLoader(false); }, [query]); (0, react_1.useEffect)(() => { if (autoRequest) { onRequest(); } }, [query]); return { result, resultValue, loader, error, onRequest, }; }; exports.useRequest = useRequest; const useRequestFunction = ({ f, parseError = (e) => e, defaultError = undefined, defaultResult = undefined, }) => { const [loader, setLoader] = (0, react_1.useState)(false); const [error, setError] = (0, react_1.useState)(defaultError); const [result, setResult] = (0, react_1.useState)(defaultResult); const onRequestAction = async (props, options) => { setLoader(true); setError(undefined); setResult(undefined); try { const r = await f(props); if (r.error) { throw r.error; } setResult(r.result); return r; } catch (err) { const error = parseError?.(err) ?? err; setError(error); options?.onError?.(error); return error; } finally { setLoader(false); } }; const onRequest = async (props) => { return await onRequestAction(props); }; const onRequestWithThrow = async (props) => { return await onRequestAction(props, { onError: (error) => { throw error; }, }); }; const onClear = () => { setLoader(false); setError(undefined); setResult(undefined); }; return { loader, error, result, onRequest, onRequestWithThrow, onClear, }; }; exports.useRequestFunction = useRequestFunction; const useRequestLite = ({ f, onError, onResult, parseError, defaultError = undefined, defaultResult = undefined, }) => { const [loader, setLoader] = (0, react_1.useState)(false); const [error, setError] = (0, react_1.useState)(defaultError); const [result, setResult] = (0, react_1.useState)(defaultResult); const onRequest = async (props) => { setLoader(true); setError(undefined); setResult(undefined); try { const r = await f(props); setResult(r); onResult?.(r); return r; } catch (error) { let err = error; if (parseError) { err = parseError(error); } setError(err); onError?.(err); return err; } finally { setLoader(false); } }; const onClear = () => { setLoader(false); setError(undefined); setResult(undefined); }; return { loader, error, result, onRequest, onClear, }; }; exports.useRequestLite = useRequestLite; //# sourceMappingURL=index.js.map