Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 107x 107x 25x 25x 25x 25x 11x 3x 25x 11x 7x 7x 7x 7x 55x 11x 55x 25x | // credit: https://github.com/mantinedev/mantine/blob/master/packages/@mantine/hooks/src/use-idle/use-idle.ts
import { useEffect, useRef, useState } from "react";
const DEFAULT_EVENTS: (keyof DocumentEventMap)[] = [
"keypress",
"mousemove",
"touchmove",
"click",
"scroll",
];
const DEFAULT_OPTIONS = {
events: DEFAULT_EVENTS,
initialState: true,
};
export function useIdle(
timeout: number,
options?: Partial<{
events: (keyof DocumentEventMap)[];
initialState: boolean;
}>,
) {
const { events, initialState } = { ...DEFAULT_OPTIONS, ...options };
const [idle, setIdle] = useState<boolean>(initialState);
const timer = useRef<number>();
// start tracking idleness on useIdle mount
useEffect(() => {
timer.current = window.setTimeout(() => {
setIdle(true);
}, timeout);
}, [timeout, events]);
useEffect(() => {
const handleEvents = () => {
setIdle(false);
Eif (timer.current) {
window.clearTimeout(timer.current);
}
timer.current = window.setTimeout(() => {
setIdle(true);
}, timeout);
};
events.forEach((event) => document.addEventListener(event, handleEvents));
return () => {
events.forEach((event) => document.removeEventListener(event, handleEvents));
};
}, [timeout]); // eslint-disable-line react-hooks/exhaustive-deps
return idle;
}
|