1import { useMemo, useState } from "react";
2import { Gesture, PointerType } from "react-native-gesture-handler";
3
4/** Uses native hover recognition without React Native's optional pointer-event flags. */
5export function useHoverGesture(disabled = false) {
6 const [hovered, setHovered] = useState(false);
7 const hoverGesture = useMemo(
8 () =>
9 Gesture.Hover()
10 .manualActivation(true)
11 .enabled(!disabled)
12 // Observe hover without competing with row taps, scrolling, or swipe actions.
13 .cancelsTouchesInView(false)
14 .runOnJS(true)
15 .onBegin((event) => {
16 setHovered(
17 event.pointerType === PointerType.MOUSE || event.pointerType === PointerType.STYLUS,
18 );
19 })
20 .onFinalize(() => {
21 setHovered(false);
22 }),
23 [disabled],
24 );
25 return { hovered: !disabled && hovered, hoverGesture };
26}