-
Notifications
You must be signed in to change notification settings - Fork 0
/
useHover.ts
31 lines (30 loc) · 958 Bytes
/
useHover.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
import { cloneElement, useState } from "react";
import type { ReactElement } from "react";
/**
* Tracks the hover state of the DOM element via `mouseenter` and `mouseleave`.
*/
export function useHover(createElement: ReactElement | ((isHovered: boolean) => ReactElement))
{
const [isHovered, setIsHovered] = useState(false);
const element = typeof createElement === "function"
? createElement(isHovered)
: createElement;
const onMouseEnter = (event: any) =>
{
if (element.props.onMouseEnter)
{
element.props.onMouseEnter(event);
}
setIsHovered(true);
};
const onMouseLeave = (event: any) =>
{
if (element.props.onMouseLeave)
{
element.props.onMouseLeave(event);
}
setIsHovered(false);
};
const clonedElement = cloneElement(element, { onMouseEnter, onMouseLeave });
return [clonedElement, isHovered] as const;
}