-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathindex.ts
39 lines (36 loc) · 934 Bytes
/
index.ts
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
import { useState } from "react";
export interface UseHoverOptions {
mouseEnterDelayMS?: number;
mouseLeaveDelayMS?: number;
}
export type HoverProps = Pick<
React.HTMLAttributes<HTMLElement>,
"onMouseEnter" | "onMouseLeave"
>;
export default function useHover({
mouseEnterDelayMS = 0,
mouseLeaveDelayMS = 0
}: UseHoverOptions = {}): [boolean, HoverProps] {
const [isHovering, setIsHovering] = useState(false);
let mouseEnterTimer: number | undefined;
let mouseOutTimer: number | undefined;
return [
isHovering,
{
onMouseEnter: () => {
clearTimeout(mouseOutTimer);
mouseEnterTimer = setTimeout(
() => setIsHovering(true),
mouseEnterDelayMS
);
},
onMouseLeave: () => {
clearTimeout(mouseEnterTimer);
mouseOutTimer = setTimeout(
() => setIsHovering(false),
mouseLeaveDelayMS
);
}
}
];
}