UNPKG

@wordpress/editor

Version:
47 lines (46 loc) 1.55 kB
// packages/editor/src/components/collaborators-overlay/use-debounced-recompute.ts import { useCallback, useEffect, useRef, useState } from "@wordpress/element"; function useDebouncedRecompute(delayMs) { const [recomputeToken, setRecomputeToken] = useState(0); const timeoutRef = useRef(null); const rerenderAfterDelay = useCallback(() => { if (timeoutRef.current) { clearTimeout(timeoutRef.current); } timeoutRef.current = setTimeout(() => { setRecomputeToken((t) => t + 1); }, delayMs); return () => { if (timeoutRef.current) { clearTimeout(timeoutRef.current); } }; }, [delayMs]); return [recomputeToken, rerenderAfterDelay]; } function useRequestAnimationFrameRecompute() { const [recomputeToken, setRecomputeToken] = useState(0); const requestAnimationFrameRef = useRef(null); useEffect(() => { return () => { if (requestAnimationFrameRef.current !== null) { cancelAnimationFrame(requestAnimationFrameRef.current); } }; }, []); const rerenderOnNextFrame = useCallback(() => { if (requestAnimationFrameRef.current !== null) { cancelAnimationFrame(requestAnimationFrameRef.current); } requestAnimationFrameRef.current = requestAnimationFrame(() => { requestAnimationFrameRef.current = null; setRecomputeToken((t) => t + 1); }); }, []); return [recomputeToken, rerenderOnNextFrame]; } export { useDebouncedRecompute, useRequestAnimationFrameRecompute }; //# sourceMappingURL=use-debounced-recompute.mjs.map