Skip to content

Instantly share code, notes, and snippets.

@GalindoSVQ
Created January 11, 2024 06:39
Show Gist options
  • Select an option

  • Save GalindoSVQ/9513d0f65e78dd7bf9ddb56c46d7b98f to your computer and use it in GitHub Desktop.

Select an option

Save GalindoSVQ/9513d0f65e78dd7bf9ddb56c46d7b98f to your computer and use it in GitHub Desktop.
import * as React from "react";
function throttle(cb, ms) {
let lastTime = 0;
return () => {
const now = Date.now();
if (now - lastTime >= ms) {
cb();
lastTime = now;
}
};
}
export default function useIdle(ms = 1000 * 20) {
const [idle, setIdle] = React.useState(false);
React.useEffect(() => {
let timeoutId;
const handleTimeout = () => {
setIdle(true);
};
const handleEvent = throttle(() => {
setIdle(false);
window.clearTimeout(timeoutId);
timeoutId = window.setTimeout(handleTimeout, ms);
}, 500);
const handleVisibilityChange = () => {
if (!document.hidden) {
handleEvent();
}
};
timeoutId = window.setTimeout(handleTimeout, ms);
window.addEventListener("mousemove", handleEvent);
window.addEventListener("mousedown", handleEvent);
window.addEventListener("resize", handleEvent);
window.addEventListener("keydown", handleEvent);
window.addEventListener("touchstart", handleEvent);
window.addEventListener("wheel", handleEvent);
document.addEventListener("visibilitychange", handleVisibilityChange);
return () => {
window.removeEventListener("mousemove", handleEvent);
window.removeEventListener("mousedown", handleEvent);
window.removeEventListener("resize", handleEvent);
window.removeEventListener("keydown", handleEvent);
window.removeEventListener("touchstart", handleEvent);
window.removeEventListener("wheel", handleEvent);
document.removeEventListener("visibilitychange", handleVisibilityChange);
window.clearTimeout(timeoutId);
};
}, [ms]);
return idle;
}
@GalindoSVQ
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment