Skip to content

Instantly share code, notes, and snippets.

@KristofferEriksson
Created January 25, 2024 10:26
Show Gist options
  • Star 22 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save KristofferEriksson/9f7c3bd928953c3853f7807b3565ec99 to your computer and use it in GitHub Desktop.
Save KristofferEriksson/9f7c3bd928953c3853f7807b3565ec99 to your computer and use it in GitHub Desktop.
React Hook to detect user inactivity based on specified events like mouse movements, touch events or key presses
import { useEffect, useState } from "react";
const defaultEvents = [
"mousemove",
"mousedown",
"touchstart",
"keydown",
"wheel",
"resize",
];
interface UseIdleOptions {
timeout?: number;
events?: string[];
}
const useIdle = ({
timeout = 5000,
events = defaultEvents,
}: UseIdleOptions = {}) => {
const [isIdle, setIsIdle] = useState<boolean>(false);
useEffect(() => {
let timer: ReturnType<typeof setTimeout>;
const resetTimer = () => {
clearTimeout(timer);
setIsIdle(false);
timer = setTimeout(() => setIsIdle(true), timeout);
};
// Initialize the timer
resetTimer();
// Event handler to reset the timer on user activity
events.forEach((event) => window.addEventListener(event, resetTimer));
// Cleanup function
return () => {
clearTimeout(timer);
events.forEach((event) => window.removeEventListener(event, resetTimer));
};
}, [timeout, events]);
return isIdle;
};
export default useIdle;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment