import { useEffect, useRef, useState } from 'react'; export type RafLoopReturns = [() => void, boolean, () => void]; export default function useRafLoop(callback: CallableFunction): RafLoopReturns { const raf = useRef(null); const [isActive, setIsActive] = useState(true); function loopStep() { callback(); raf.current = requestAnimationFrame(loopStep); } function loopStop() { setIsActive(false); } function loopStart() { setIsActive(true); } function clearCurrentLoop() { raf.current && cancelAnimationFrame(raf.current); } useEffect(() => clearCurrentLoop, []); useEffect(() => { clearCurrentLoop(); isActive && (raf.current = requestAnimationFrame(loopStep)); return clearCurrentLoop; }, [isActive, callback]); return [loopStop, isActive, loopStart]; }