{"version":3,"sources":["../../src/create-single-loading/index.ts"],"sourcesContent":["import { useAsyncFn as useAsyncFnOrigin } from '../use-async-fn'\nimport { isFunction } from '../utils/basic'\n\nimport type { create } from '@shined/reactive'\nimport type { UseAsyncFnReturns } from '../use-async-fn'\nimport type { AnyFunc } from '../utils/basic'\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   * `Create` function of Reactive\n   */\n  create: typeof create\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  initialState?: 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/reactive` to use this utility.\n *\n * @param {CreateSingleLoadingOptions} options {@link CreateSingleLoadingOptions}\n * @returns {CreateSingleLoadingReturns} `CreateSingleLoadingReturns`, single loading instance, see {@link CreateSingleLoadingReturns}\n *\n * @deprecated will be removed in the future, maybe moved to `@shined/reactive`\n *\n * @see {@link https://sheinsight.github.io/reactive/ | Reactive - Documentation}\n */\nexport function createSingleLoading(options: CreateSingleLoadingOptions): CreateSingleLoadingReturns {\n  const { resetOnError = true, create, initialState = false } = options\n\n  if (!isFunction(create)) {\n    throw new Error('Please provide the `create` function from `@shined/reactive`')\n  }\n\n  const store = create({ loading: initialState })\n\n  function bind<T extends AnyFunc>(func: T): T {\n    return (async (...args: Parameters<T>) => {\n      store.mutate.loading = true\n\n      try {\n        const result = await func(...args)\n        store.mutate.loading = false\n        return result\n      } catch (error) {\n        if (resetOnError) {\n          store.mutate.loading = initialState\n        }\n\n        throw error\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"],"names":["createSingleLoading","options","resetOnError","create","initialState","isFunction","Error","store","loading","bind","func","args","result","error","mutate","get","set","value","useLoading","useSnapshot","s","useAsyncFn","asyncFunc","useAsyncFnOrigin","setLoading"],"mappings":";;;;+BAoFgBA;;;eAAAA;;;0BApF+B;qBACpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmFpB,SAASA,oBAAoBC,OAAmC;IACrE,4BAA8DA,QAAtDC,cAAAA,kDAAe,8BAAMC,SAAiCF,QAAjCE,gCAAiCF,QAAzBG,cAAAA,kDAAe;IAEpD,IAAI,CAACC,IAAAA,iBAAU,EAACF,SAAS;QACvB,MAAM,IAAIG,MAAM;IAClB;IAEA,IAAMC,QAAQJ,OAAO;QAAEK,SAASJ;IAAa;IAE7C,SAASK,KAAwBC,IAAO;QACtC,OAAQ;6CAAUC;gBAAAA;;;oBAIRC,QAGCC;;;;4BANTN,MAAMO,MAAM,CAACN,OAAO,GAAG;;;;;;;;;4BAGN;;gCAAME,WAAAA,KAAAA,GAAK,qBAAGC;;;4BAAvBC,SAAS;4BACfL,MAAMO,MAAM,CAACN,OAAO,GAAG;4BACvB;;gCAAOI;;;4BACAC;4BACP,IAAIX,cAAc;gCAChBK,MAAMO,MAAM,CAACN,OAAO,GAAGJ;4BACzB;4BAEA,MAAMS;;;;;;;YAEV;;IACF;IAEA,SAASE;QACP,OAAOR,MAAMO,MAAM,CAACN,OAAO;IAC7B;IAEA,SAASQ,IAAIC,KAAc;QACzBV,MAAMO,MAAM,CAACN,OAAO,GAAGS;IACzB;IAEA,SAASC;QACP,OAAOX,MAAMY,WAAW,CAAC,SAACC;mBAAMA,EAAEZ,OAAO;;IAC3C;IAEA,SAASa,WAA8BC,SAAY;QACjD,IAAMd,UAAUU;QAEhB,OAAO,wCACFK,IAAAA,sBAAgB,EAACd,KAAKa;YACzBd,SAAAA;YACAgB,YAAYR;;IAEhB;IAEA,OAAO;QACLK,YAAAA;QACAH,YAAAA;QACAF,KAAAA;QACAD,KAAAA;QACAN,MAAAA;IACF;AACF"}