{"version":3,"sources":["../../src/use-pausable/index.ts"],"sourcesContent":["import { useCreation } from '../use-creation'\nimport { useGetterRef } from '../use-getter-ref'\nimport { useLatest } from '../use-latest'\nimport { useRender } from '../use-render'\nimport { useStableFn } from '../use-stable-fn'\n\nexport interface Pausable<PauseArgs extends unknown[] = [], ResumeArgs extends unknown[] = []> {\n  /**\n   * Whether the instance is active, it just a Ref Getter\n   */\n  isActive(): boolean\n  /**\n   * Pause the instances\n   *\n   * @params update - Whether to trigger a re-render\n   */\n  pause: (...args: [update?: boolean, ...PauseArgs]) => void\n  /**\n   * Resume the instance, restart the instances if it's active\n   *\n   * @params update - Whether to trigger a re-render\n   */\n  resume: (...args: [update?: boolean, ...ResumeArgs]) => void\n}\n\n/**\n * A React Hook that helps to create a [Pausable](https://sheinsight.github.io/react-use/docs/features/pausable) instance.\n */\nexport function usePausable<\n  PauseCP extends any[],\n  ResumeCP extends any[],\n  PauseC extends (ref: React.MutableRefObject<boolean>, ...args: [...PauseCP]) => any,\n  ResumeC extends (ref: React.MutableRefObject<boolean>, ...args: [...ResumeCP]) => any,\n>(initialValue?: boolean, pauseCallback?: PauseC, resumeCallback?: ResumeC): Pausable<PauseCP, ResumeCP> {\n  const render = useRender()\n  const latest = useLatest({ resumeCallback, pausableCallback: pauseCallback })\n  const [isActiveRef, isActive] = useGetterRef(initialValue ?? false)\n\n  const pause = useStableFn((update?: boolean, ...args: [...PauseCP]) => {\n    isActiveRef.current = false\n\n    const res = latest.current.pausableCallback?.(isActiveRef, ...args)\n\n    if (!update) {\n      return\n    }\n\n    if (res instanceof Promise) {\n      res.finally(render)\n    } else {\n      render()\n    }\n  })\n\n  const resume = useStableFn((update?: boolean, ...args: [...ResumeCP]) => {\n    isActiveRef.current = true\n\n    const res = latest.current.resumeCallback?.(isActiveRef, ...args)\n\n    if (!update) {\n      return\n    }\n\n    if (res instanceof Promise) {\n      res.finally(render)\n    } else {\n      render()\n    }\n  })\n\n  return useCreation(() => ({ isActive, pause, resume }))\n}\n"],"names":["usePausable","initialValue","pauseCallback","resumeCallback","render","useRender","latest","useLatest","pausableCallback","useGetterRef","isActiveRef","isActive","pause","useStableFn","update","args","current","res","Promise","finally","resume","useCreation"],"mappings":";;;;+BA4BgBA;;;eAAAA;;;2BA5BY;4BACC;yBACH;yBACA;2BACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBrB,SAASA,YAKdC,YAAsB,EAAEC,aAAsB,EAAEC,cAAwB;IACxE,IAAMC,SAASC,IAAAA,oBAAS;IACxB,IAAMC,SAASC,IAAAA,oBAAS,EAAC;QAAEJ,gBAAAA;QAAgBK,kBAAkBN;IAAc;IAC3E,IAAgCO,iCAAAA,IAAAA,0BAAY,EAACR,yBAAAA,0BAAAA,eAAgB,YAAtDS,cAAyBD,kBAAZE,WAAYF;IAEhC,IAAMG,QAAQC,IAAAA,wBAAW,EAAC,SAACC;yCAAqBC;YAAAA;;YAGlCT;YAAAA,mCAAAA;QAFZI,YAAYM,OAAO,GAAG;QAEtB,IAAMC,OAAMX,oCAAAA,CAAAA,kBAAAA,OAAOU,OAAO,EAACR,gBAAgB,cAA/BF,wDAAAA,CAAAA,mCAAAA,8CAAAA,kCAAAA;YAAAA;YAAkCI;SAAqB,CAAvDJ,OAA+C,qBAAGS;QAE9D,IAAI,CAACD,QAAQ;YACX;QACF;QAEA,IAAIG,AAAG,YAAHA,KAAeC,UAAS;YAC1BD,IAAIE,OAAO,CAACf;QACd,OAAO;YACLA;QACF;IACF;IAEA,IAAMgB,SAASP,IAAAA,wBAAW,EAAC,SAACC;yCAAqBC;YAAAA;;YAGnCT;YAAAA,iCAAAA;QAFZI,YAAYM,OAAO,GAAG;QAEtB,IAAMC,OAAMX,kCAAAA,CAAAA,kBAAAA,OAAOU,OAAO,EAACb,cAAc,cAA7BG,sDAAAA,CAAAA,iCAAAA,4CAAAA,gCAAAA;YAAAA;YAAgCI;SAAqB,CAArDJ,OAA6C,qBAAGS;QAE5D,IAAI,CAACD,QAAQ;YACX;QACF;QAEA,IAAIG,AAAG,YAAHA,KAAeC,UAAS;YAC1BD,IAAIE,OAAO,CAACf;QACd,OAAO;YACLA;QACF;IACF;IAEA,OAAOiB,IAAAA,wBAAW,EAAC;eAAO;YAAEV,UAAAA;YAAUC,OAAAA;YAAOQ,QAAAA;QAAO;;AACtD"}