Skip to content

Instantly share code, notes, and snippets.

@nstepien
Created August 27, 2020 10:47
Show Gist options
  • Save nstepien/52e4a8fbb7b6b8e33e76c1866abf9e65 to your computer and use it in GitHub Desktop.
Save nstepien/52e4a8fbb7b6b8e33e76c1866abf9e65 to your computer and use it in GitHub Desktop.
useIdle
const idleRequests: Array<() => void> = [];
let idleCallbackRequested = false;
function idleCallback() {
idleCallbackRequested = false;
const reqs = idleRequests.splice(0, 200);
for (const req of reqs) {
req();
}
if (idleRequests.length !== 0) {
requestBatchedIdleCallback();
}
}
function requestBatchedIdleCallback() {
if (idleCallbackRequested) return;
idleCallbackRequested = true;
// @ts-expect-error
requestIdleCallback(idleCallback, { timeout: 250 });
}
function useIdle() {
const [ready, setReady] = useState(false);
useLayoutEffect(() => {
function request() {
setReady(true);
}
idleRequests.push(request);
requestBatchedIdleCallback();
return () => {
const idx = idleRequests.indexOf(request);
if (idx !== -1) {
idleRequests.splice(idx, 1);
}
};
}, []);
return ready;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment