1234567891011121314151617181920212223242526272829303132333435363738 |
- import { useEffect } from 'react';
- import useCommittedRef from './useCommittedRef';
-
- function useRafInterval(fn, ms, paused) {
- if (paused === void 0) {
- paused = false;
- }
-
- var handle;
- var start = new Date().getTime();
- var fnRef = useCommittedRef(fn); // this ref is necessary b/c useEffect will sometimes miss a paused toggle
- // orphaning a setTimeout chain in the aether, so relying on it's refresh logic is not reliable.
-
- var pausedRef = useCommittedRef(paused);
-
- function loop() {
- var current = new Date().getTime();
- var delta = current - start;
- if (pausedRef.current) return;
-
- if (delta >= ms && fnRef.current) {
- fnRef.current();
- start = new Date().getTime();
- }
-
- cancelAnimationFrame(handle);
- handle = requestAnimationFrame(loop);
- }
-
- useEffect(function () {
- handle = requestAnimationFrame(loop);
- return function () {
- return cancelAnimationFrame(handle);
- };
- }, []);
- }
-
- export default useRafInterval;
|