{"version":3,"sources":["../../src/use-loading-slow-fn/index.ts"],"sourcesContent":["import { useRef } from 'react'\nimport { useAsyncFn } from '../use-async-fn'\nimport { useCreation } from '../use-creation'\nimport { useLatest } from '../use-latest'\nimport { useTrackedRefState } from '../use-tracked-ref-state'\nimport { useVersionedAction } from '../use-versioned-action'\n\nimport type { UseAsyncFnOptions, UseAsyncFnReturns } from '../use-async-fn'\nimport type { AnyFunc } from '../utils/basic'\n\nexport interface UseLoadingSlowFnOptions<T extends AnyFunc, D = Awaited<ReturnType<T>>, E = any>\n  extends UseAsyncFnOptions<T, D, E> {\n  /**\n   * The timeout duration in milliseconds to determine if the loading is slow.\n   *\n   * @defaultValue 0 ms\n   */\n  loadingTimeout?: number\n  /**\n   * A callback to be called when the loading is slow.\n   *\n   * @defaultValue undefined\n   */\n  onLoadingSlow?: () => void\n}\n\nexport interface UseLoadingSlowFnReturns<T extends AnyFunc, D = Awaited<ReturnType<T>>, E = any>\n  extends UseAsyncFnReturns<T, D, E> {\n  /**\n   * Whether the loading is slow.\n   */\n  loadingSlow: boolean\n}\n\n/**\n * A hook to run an async function and determine if the loading is slow.\n *\n * @since 1.4.0\n */\nexport function useLoadingSlowFn<T extends AnyFunc, D = Awaited<ReturnType<T>>, E = any>(\n  fn: T,\n  options: UseLoadingSlowFnOptions<T, D, E> = {},\n): UseLoadingSlowFnReturns<T, D, E> {\n  const { loadingTimeout = 0, onLoadingSlow, ...useAsyncFnOptions } = options\n\n  const latest = useLatest({ fn, onLoadingSlow, loadingTimeout })\n  const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n\n  const [refState, actions] = useTrackedRefState({ loadingSlow: false })\n  const [incVersion, runVersionedAction] = useVersionedAction()\n\n  const asyncFnReturns = useAsyncFn<T, D, E>(\n    (async (...args) => {\n      actions.updateRefState('loadingSlow', false)\n\n      const version = incVersion()\n\n      if (latest.current.loadingTimeout) {\n        timerRef.current = setTimeout(() => {\n          runVersionedAction(version, () => {\n            timerRef.current = undefined\n            actions.updateRefState('loadingSlow', true)\n            latest.current.onLoadingSlow?.()\n          })\n        }, latest.current.loadingTimeout)\n      }\n\n      const result = await latest.current.fn(...args)\n\n      runVersionedAction(version, () => {\n        if (timerRef.current) {\n          clearTimeout(timerRef.current)\n        }\n\n        actions.updateRefState('loadingSlow', false)\n      })\n\n      return result\n    }) as T,\n    {\n      ...useAsyncFnOptions,\n      onCancel(...args) {\n        incVersion()\n        actions.updateRefState('loadingSlow', false)\n        useAsyncFnOptions.onCancel?.(...args)\n      },\n    },\n  )\n\n  const result = useCreation(() => {\n    const result = asyncFnReturns as UseLoadingSlowFnReturns<T, D, E>\n\n    Object.defineProperty(result, 'loadingSlow', {\n      enumerable: true,\n      get() {\n        return refState.loadingSlow\n      },\n    })\n\n    return result\n  })\n\n  return result\n}\n"],"names":["useLoadingSlowFn","fn","options","loadingTimeout","onLoadingSlow","useAsyncFnOptions","latest","useLatest","timerRef","useRef","undefined","useTrackedRefState","loadingSlow","refState","actions","useVersionedAction","incVersion","runVersionedAction","asyncFnReturns","useAsyncFn","args","version","result","updateRefState","current","setTimeout","clearTimeout","onCancel","useCreation","Object","defineProperty","enumerable","get"],"mappings":";;;;+BAuCgBA;;;eAAAA;;;qBAvCO;0BACI;2BACC;yBACF;kCACS;kCACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkC5B,SAASA,iBACdC,EAAK;QACLC,UAAAA,iEAA4C,CAAC;IAE7C,8BAAoEA,QAA5DC,gBAAAA,sDAAiB,6BAAGC,gBAAwCF,QAAxCE,eAAkBC,+CAAsBH;;;;IAEpE,IAAMI,SAASC,IAAAA,oBAAS,EAAC;QAAEN,IAAAA;QAAIG,eAAAA;QAAeD,gBAAAA;IAAe;IAC7D,IAAMK,WAAWC,IAAAA,aAAM,EAA4CC;IAEnE,IAA4BC,uCAAAA,IAAAA,sCAAkB,EAAC;QAAEC,aAAa;IAAM,QAA7DC,WAAqBF,wBAAXG,UAAWH;IAC5B,IAAyCI,uCAAAA,IAAAA,sCAAkB,SAApDC,aAAkCD,wBAAtBE,qBAAsBF;IAEzC,IAAMG,iBAAiBC,IAAAA,sBAAU,EAC9B;yCAAUC;YAAAA;;;gBAeYd,iBAZfe,SAYAC;;;;wBAdNR,QAAQS,cAAc,CAAC,eAAe;wBAEhCF,UAAUL;wBAEhB,IAAIV,OAAOkB,OAAO,CAACrB,cAAc,EAAE;4BACjCK,SAASgB,OAAO,GAAGC,WAAW;gCAC5BR,mBAAmBI,SAAS;wCAG1Bf,+BAAAA;oCAFAE,SAASgB,OAAO,GAAGd;oCACnBI,QAAQS,cAAc,CAAC,eAAe;qCACtCjB,gCAAAA,CAAAA,kBAAAA,OAAOkB,OAAO,EAACpB,aAAa,cAA5BE,oDAAAA,mCAAAA;gCACF;4BACF,GAAGA,OAAOkB,OAAO,CAACrB,cAAc;wBAClC;wBAEe;;4BAAMG,CAAAA,kBAAAA,OAAOkB,OAAO,EAACvB,EAAE,OAAjBK,iBAAkB,qBAAGc;;;wBAApCE,SAAS;wBAEfL,mBAAmBI,SAAS;4BAC1B,IAAIb,SAASgB,OAAO,EAAE;gCACpBE,aAAalB,SAASgB,OAAO;4BAC/B;4BAEAV,QAAQS,cAAc,CAAC,eAAe;wBACxC;wBAEA;;4BAAOD;;;;QACT;OACA,wCACKjB;QACHsB,UAAAA,SAAAA;YAAS,IAAA,IAAA,OAAA,UAAA,QAAA,AAAGP,OAAH,UAAA,OAAA,OAAA,GAAA,OAAA,MAAA;gBAAGA,KAAH,QAAA,SAAA,CAAA,KAAO;;gBAGdf;gBAAAA;YAFAW;YACAF,QAAQS,cAAc,CAAC,eAAe;aACtClB,+BAAAA,kBAAkBsB,QAAQ,cAA1BtB,mDAAAA,CAAAA,8BAAAA,yCAAAA,6BAAAA;gBAAAA;aAAqC,CAArCA,OAA6B,qBAAGe;QAClC;;IAIJ,IAAME,SAASM,IAAAA,wBAAW,EAAC;QACzB,IAAMN,SAASJ;QAEfW,OAAOC,cAAc,CAACR,QAAQ,eAAe;YAC3CS,YAAY;YACZC,KAAAA,SAAAA;gBACE,OAAOnB,SAASD,WAAW;YAC7B;QACF;QAEA,OAAOU;IACT;IAEA,OAAOA;AACT"}