{"version":3,"sources":["../../src/use-interval-fn/index.ts"],"sourcesContent":["import { useEffect, useRef } from 'react'\nimport { useLatest } from '../use-latest'\nimport { usePausable } from '../use-pausable'\nimport { useRafLoop } from '../use-raf-loop'\nimport { isString } from '../utils/basic'\nimport { unwrapGettable } from '../utils/unwrap'\n\nimport type { Pausable } from '../use-pausable'\nimport type { UseRafLoopOptions } from '../use-raf-loop'\nimport type { AnyFunc, Gettable, SetIntervalReturn } from '../utils/basic'\n\nexport interface UseIntervalFnOptions extends Omit<UseRafLoopOptions, 'fpsLimit'> {}\n\nexport type UseIntervalFnInterval = Gettable<number> | 'requestAnimationFrame'\n\n/**\n * A React Hook that create a function that will be called every `interval` milliseconds.\n *\n * @param callback The function to call.\n * @param interval The interval in milliseconds. If `0`, the interval is disabled.\n * @param options The options.\n */\nexport function useIntervalFn(\n  callback: AnyFunc,\n  interval: UseIntervalFnInterval = 0,\n  options: UseIntervalFnOptions = {},\n): Pausable {\n  const { immediate = true, immediateCallback = false } = options\n\n  const timer = useRef<SetIntervalReturn | null>(null)\n  const latest = useLatest({ callback })\n\n  const isRaf = interval === 'requestAnimationFrame'\n  const intervalValue = unwrapGettable(interval)\n\n  function clearTime() {\n    if (timer.current !== null) {\n      clearInterval(timer.current)\n      timer.current = null\n    }\n  }\n\n  const intervalPausable = usePausable(false, clearTime, () => {\n    clearTime()\n\n    // `0` means disabled\n    if (isString(intervalValue) || intervalValue <= 0) return\n\n    immediateCallback && callback()\n    timer.current = setInterval(() => latest.current.callback(), intervalValue)\n  })\n\n  useEffect(() => {\n    if (isRaf) return\n    immediate && intervalPausable.resume()\n    return intervalPausable.pause\n  }, [immediate, isRaf])\n\n  const rafControl = useRafLoop(() => latest.current.callback(), {\n    immediate: isRaf ? immediate : false,\n    immediateCallback: isRaf ? immediateCallback : false,\n  })\n\n  return isRaf ? rafControl : intervalPausable\n}\n"],"names":["useIntervalFn","callback","interval","options","immediate","immediateCallback","timer","useRef","latest","useLatest","isRaf","intervalValue","unwrapGettable","clearTime","current","clearInterval","intervalPausable","usePausable","isString","setInterval","useEffect","resume","pause","rafControl","useRafLoop"],"mappings":";;;;+BAsBgBA;;;eAAAA;;;qBAtBkB;yBACR;2BACE;0BACD;qBACF;sBACM;AAiBxB,SAASA,cACdC,QAAiB;QACjBC,WAAAA,iEAAkC,GAClCC,UAAAA,iEAAgC,CAAC;IAEjC,yBAAwDA,QAAhDC,WAAAA,4CAAY,wDAAoCD,QAA9BE,mBAAAA,4DAAoB;IAE9C,IAAMC,QAAQC,IAAAA,aAAM,EAA2B;IAC/C,IAAMC,SAASC,IAAAA,oBAAS,EAAC;QAAER,UAAAA;IAAS;IAEpC,IAAMS,QAAQR,aAAa;IAC3B,IAAMS,gBAAgBC,IAAAA,sBAAc,EAACV;IAErC,SAASW;QACP,IAAIP,MAAMQ,OAAO,KAAK,MAAM;YAC1BC,cAAcT,MAAMQ,OAAO;YAC3BR,MAAMQ,OAAO,GAAG;QAClB;IACF;IAEA,IAAME,mBAAmBC,IAAAA,wBAAW,EAAC,OAAOJ,WAAW;QACrDA;QAEA,qBAAqB;QACrB,IAAIK,IAAAA,eAAQ,EAACP,kBAAkBA,iBAAiB,GAAG;QAEnDN,qBAAqBJ;QACrBK,MAAMQ,OAAO,GAAGK,YAAY;mBAAMX,OAAOM,OAAO,CAACb,QAAQ;WAAIU;IAC/D;IAEAS,IAAAA,gBAAS,EAAC;QACR,IAAIV,OAAO;QACXN,aAAaY,iBAAiBK,MAAM;QACpC,OAAOL,iBAAiBM,KAAK;IAC/B,GAAG;QAAClB;QAAWM;KAAM;IAErB,IAAMa,aAAaC,IAAAA,sBAAU,EAAC;eAAMhB,OAAOM,OAAO,CAACb,QAAQ;OAAI;QAC7DG,WAAWM,QAAQN,YAAY;QAC/BC,mBAAmBK,QAAQL,oBAAoB;IACjD;IAEA,OAAOK,QAAQa,aAAaP;AAC9B"}