UNPKG

@shined/reactive

Version:

⚛️ Proxy-driven state library for JavaScript application, Intuitive, Flexible and Written in TypeScript.

1 lines 7.42 kB
{"version":3,"sources":["/home/runner/work/reactive/reactive/packages/reactive/dist/standalone/create-single-loading/index.cjs","../../../src/standalone/create-single-loading/index.ts"],"names":["Object","defineProperty","exports","value","_chunkVDKMANM7cjs","require","_reactuse","createSingleLoading","options","resetOnError","initialValue","store","createWithHooks","call","loading","version","bind","func","args","currentVersion","result","error","mutate","get","set","useLoading","useSnapshot","s","useAsyncFn","asyncFunc","setLoading"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,OAAAC,cAAA,CAAAC,SAAA,cAAA;IAAAC,OAAA;AAAA;AAEA,IAAAC,oBAAAC,QAAA;AACAA,QAAA;AAEA,gDAAA;ACLA,IAAAC,YAAAD,QAAA;AA6EO,SAASE,oBAAoBC,OAAA;IAClC,4BAAsDA,QAA9CC,cAAAA,kDAAe,sDAA+BD,QAAzBE,cAAAA,kDAAe;IAE5C,IAAMC,QAAQP,kBAAAQ,eAAA,CAAAC,IAAA,CAAA,KAAA,GAAA;QAAkBC,SAASJ;IAAa;IAEtD,IAAIK,UAAU;IAEd,SAASC,KAAwBC,IAAA;QAC/B,OAAQ;6CAAUC;gBAAAA;;;oBAGVC,gBAGEC,QAOCC;;;;4BAZTV,MAAMW,MAAA,CAAOR,OAAA,GAAU;4BAEjBK,iBAAiB,EAAEJ;;;;;;;;;4BAGR;;gCAAME,WAAAA,KAAAA,GAAK,qBAAGC;;;4BAAvBE,SAAS;4BAEf,IAAID,mBAAmBJ,SAAS;gCAC9BJ,MAAMW,MAAA,CAAOR,OAAA,GAAU;4BACzB;4BAEA;;gCAAOM;;;4BACAC;4BACP,IAAIF,mBAAmBJ,SAAS;gCAC9B,IAAIN,cAAc;oCAChBE,MAAMW,MAAA,CAAOR,OAAA,GAAUJ;gCACzB;gCAEA,MAAMW;4BACR;;;;;;;;;;;;;;;YAIJ;;IACF;IAEA,SAASE;QACP,OAAOZ,MAAMW,MAAA,CAAOR,OAAA;IACtB;IAEA,SAASU,IAAIrB,KAAA;QACXQ,MAAMW,MAAA,CAAOR,OAAA,GAAUX;IACzB;IAEA,SAASsB;QACP,OAAOd,MAAMe,WAAA,CAAY,SAACC;mBAAMA,EAAEb,OAAO;;IAC3C;IAEA,SAASc,WAA8BC,SAAA;QACrC,IAAMf,UAAUW;QAEhB,OAAO,wCACFnB,UAAAsB,UAAA,CAAAf,IAAA,CAAA,KAAA,GAAAG,KAAsBa;YACzBf,SAAAA;YACAgB,YAAYN;;IAEhB;IAEA,OAAO;QACLI,YAAAA;QACAH,YAAAA;QACAD,KAAAA;QACAD,KAAAA;QACAP,MAAAA;IACF;AACF;ADlFAd,QAAAK,mBAAA,GAAAA","sourcesContent":["\"use strict\";Object.defineProperty(exports, \"__esModule\", {value: true});\n\nvar _chunkVDKMANM7cjs = require('../../chunk-VDKMANM7.cjs');\nrequire('../../chunk-7Y3UI2QQ.cjs');\n\n// src/standalone/create-single-loading/index.ts\nvar _reactuse = require('@shined/react-use');\nfunction createSingleLoading(options) {\n const { resetOnError = true, initialValue = false } = options;\n const store = _chunkVDKMANM7cjs.createWithHooks.call(void 0, { loading: initialValue });\n let version = 0;\n function bind(func) {\n return async (...args) => {\n store.mutate.loading = true;\n const currentVersion = ++version;\n try {\n const result = await func(...args);\n if (currentVersion === version) {\n store.mutate.loading = false;\n }\n return result;\n } catch (error) {\n if (currentVersion === version) {\n if (resetOnError) {\n store.mutate.loading = initialValue;\n }\n throw error;\n }\n } finally {\n }\n };\n }\n function get() {\n return store.mutate.loading;\n }\n function set(value) {\n store.mutate.loading = value;\n }\n function useLoading() {\n return store.useSnapshot((s) => s.loading);\n }\n function useAsyncFn(asyncFunc) {\n const loading = useLoading();\n return {\n ..._reactuse.useAsyncFn.call(void 0, bind(asyncFunc)),\n loading,\n setLoading: set\n };\n }\n return {\n useAsyncFn,\n useLoading,\n set,\n get,\n bind\n };\n}\n\n\nexports.createSingleLoading = createSingleLoading;\n","import { useAsyncFn as useAsyncFnOrigin } from '@shined/react-use'\nimport { createWithHooks } from '../../react/create-with-hooks.js'\n\nimport type { UseAsyncFnReturns } from '@shined/react-use'\nimport type { AnyFunc } from '../../utils/index.js'\n\nexport interface UseAsyncFnExtendReturns<T extends AnyFunc> extends UseAsyncFnReturns<T> {\n /**\n * Set the loading state\n *\n * @param {boolean} value - `boolean`, the loading value to set\n * @returns {void} `void`\n */\n setLoading: (value: boolean) => void\n}\n\nexport interface CreateSingleLoadingReturns {\n /**\n * A Hook in React to use bound async function with loading state\n *\n * @param {AnyFunc} asyncFn - `AnyFunc`, the async function to bind, see {@link AnyFunc}\n * @returns {UseAsyncFnExtendReturns} see {@link UseAsyncFnExtendReturns}\n */\n useAsyncFn: <T extends AnyFunc>(asyncFn: T) => UseAsyncFnExtendReturns<T>\n /**\n * A Hook in React to use loading state\n *\n * @returns {boolean} `boolean`, the loading state\n */\n useLoading(): boolean\n /**\n * Set the loading state via store in JS/TS\n *\n * @param {boolean} value - `boolean`, the value to set\n * @returns {void} `void`\n */\n set: (value: boolean) => void\n /**\n * Get the loading state via store in JS/TS\n *\n * @returns {boolean} `boolean`, the loading state\n */\n get(): boolean\n /**\n * Bind the loading state to the async function in JS/TS\n *\n * @param {AnyFunc} asyncFn - `AnyFunc`, the async function to bind, see {@link AnyFunc}\n * @returns {AnyFunc} `AnyFunc`, same as `asyncFn` param, see {@link AnyFunc}\n */\n bind: <T extends AnyFunc>(asyncFn: T) => T\n}\n\nexport interface CreateSingleLoadingOptions {\n /**\n * Whether set to false on error\n *\n * @defaultValue true\n */\n resetOnError?: boolean\n /**\n * Initial loading state\n *\n * @defaultValue false\n */\n initialValue?: boolean\n}\n\n/**\n * A utility that provide a way to manage single (or global) loading state via multiple Hooks or simple JS/TS functions, using [Reactive](https://sheinsight.github.io/reactive/) under the hood.\n *\n * You need to install `@shined/react-use` to use this utility.\n *\n * @param {CreateSingleLoadingOptions} options {@link CreateSingleLoadingOptions}\n * @returns {CreateSingleLoadingReturns} `CreateSingleLoadingReturns`, single loading instance, see {@link CreateSingleLoadingReturns}\n *\n * @see {@link https://sheinsight.github.io/react-use/ | React Use - Documentation}\n */\nexport function createSingleLoading(options: CreateSingleLoadingOptions): CreateSingleLoadingReturns {\n const { resetOnError = true, initialValue = false } = options\n\n const store = createWithHooks({ loading: initialValue })\n\n let version = 0\n\n function bind<T extends AnyFunc>(func: T): T {\n return (async (...args: Parameters<T>) => {\n store.mutate.loading = true\n\n const currentVersion = ++version\n\n try {\n const result = await func(...args)\n\n if (currentVersion === version) {\n store.mutate.loading = false\n }\n\n return result\n } catch (error) {\n if (currentVersion === version) {\n if (resetOnError) {\n store.mutate.loading = initialValue\n }\n\n throw error\n }\n } finally {\n // do nothing\n }\n }) as T\n }\n\n function get() {\n return store.mutate.loading\n }\n\n function set(value: boolean) {\n store.mutate.loading = value\n }\n\n function useLoading() {\n return store.useSnapshot((s) => s.loading)\n }\n\n function useAsyncFn<T extends AnyFunc>(asyncFunc: T) {\n const loading = useLoading()\n\n return {\n ...useAsyncFnOrigin(bind(asyncFunc)),\n loading,\n setLoading: set,\n }\n }\n\n return {\n useAsyncFn,\n useLoading,\n set,\n get,\n bind,\n }\n}\n"]}