@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
47 lines (46 loc) • 1.55 kB
JavaScript
// 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