MCPcopy Create free account
hub / github.com/atomicdata-dev/atomic-data-browser / useHover

Function useHover

data-browser/src/helpers/useHover.tsx:5–39  ·  view source on GitHub ↗
(disabled: boolean)

Source from the content-addressed store, hash-verified

3// hook returns tuple(array) with type [any, boolean]
4// T - could be any type of HTML element like: HTMLDivElement, HTMLParagraphElement and etc.
5export function useHover<T>(disabled: boolean): [MutableRefObject<T>, boolean] {
6 const [value, setValue] = useState<boolean>(false);
7
8 const ref = useRef<T | null>(null);
9 const { current } = ref;
10
11 const handleMouseOver = (): void => setValue(true);
12 const handleMouseOut = (): void => setValue(false);
13
14 useEffect(
15 () => {
16 // eslint-disable-next-line
17 const node: any = current;
18 // This could be expensive, and triggers re-renders for some reasons.
19 // That's why it's disabled as much as possible.
20 if (!disabled && node) {
21 node.addEventListener('mouseover', handleMouseOver);
22 node.addEventListener('mouseout', handleMouseOut);
23
24 return () => {
25 node.removeEventListener('mouseover', handleMouseOver);
26 node.removeEventListener('mouseout', handleMouseOut);
27 };
28 }
29 },
30 [current, disabled], // Recall only if ref changes
31 );
32
33 // don't hover on touch screen devices
34 if (window.matchMedia('(pointer: coarse)').matches) {
35 return [ref, false];
36 }
37
38 return [ref, value];
39}

Callers 1

SideBarFunction · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected