{"version":3,"file":"useAnimationFrame.mjs","names":[],"sources":["../../../../src/utils/hooks/useAnimationFrame.ts"],"sourcesContent":["import { useIsomorphicLayoutEffect } from '@siberiacancode/reactuse';\nimport { useEffect, useRef } from 'react';\n\nimport { cancelAnimationFrame, requestAnimationFrame } from '../helpers';\n\n/**\n * Helps request and cancel animation frame\n *\n * @param {Function} callback - frame request callback\n * @param {boolean} active - should animation frame be requested\n * @return {object} request/cancel animation frame handlers\n */\nexport const useAnimationFrame = (callback: (time: number) => void, active?: boolean) => {\n  const animationFrameRequestRef = useRef<number>(undefined);\n  const previousTimestampRef = useRef<number>(undefined);\n  const savedHandlerRef = useRef(callback);\n\n  useIsomorphicLayoutEffect(() => {\n    savedHandlerRef.current = callback;\n  }, [callback]);\n\n  const onFrameRequest = (timestamp?: DOMHighResTimeStamp) => {\n    if (timestamp) {\n      previousTimestampRef.current = timestamp;\n      if (previousTimestampRef.current === undefined) return;\n      savedHandlerRef.current(timestamp - previousTimestampRef.current);\n    }\n\n    animationFrameRequestRef.current = requestAnimationFrame(onFrameRequest);\n  };\n\n  const onFrameCancel = () => {\n    if (!animationFrameRequestRef.current) return;\n    cancelAnimationFrame(animationFrameRequestRef.current);\n  };\n\n  useEffect(() => {\n    if (active) {\n      animationFrameRequestRef.current = requestAnimationFrame(onFrameRequest);\n      return;\n    }\n\n    onFrameCancel();\n    return () => onFrameCancel();\n  }, [active]);\n\n  return {\n    request: onFrameRequest,\n    cancel: onFrameCancel\n  };\n};\n"],"mappings":";;;;AAYA,IAAa,KAAqB,GAAkC,MAAqB;CACvF,IAAM,IAA2B,EAAe,KAAA,CAAS,GACnD,IAAuB,EAAe,KAAA,CAAS,GAC/C,IAAkB,EAAO,CAAQ;CAEvC,QAAgC;EAC9B,EAAgB,UAAU;CAC5B,GAAG,CAAC,CAAQ,CAAC;CAEb,IAAM,KAAkB,MAAoC;EAC1D,IAAI,GAAW;GAEb,IADA,EAAqB,UAAU,GAC3B,EAAqB,YAAY,KAAA,GAAW;GAChD,EAAgB,QAAQ,IAAY,EAAqB,OAAO;EAClE;EAEA,EAAyB,UAAU,EAAsB,CAAc;CACzE,GAEM,UAAsB;EACrB,EAAyB,WAC9B,EAAqB,EAAyB,OAAO;CACvD;CAYA,OAVA,QAAgB;EACd,IAAI,GAAQ;GACV,EAAyB,UAAU,EAAsB,CAAc;GACvE;EACF;EAGA,OADA,EAAc,SACD,EAAc;CAC7B,GAAG,CAAC,CAAM,CAAC,GAEJ;EACL,SAAS;EACT,QAAQ;CACV;AACF"}