MCPcopy Create free account
hub / github.com/adobe/react-spectrum / useHover

Function useHover

packages/react-aria/src/interactions/useHover.ts:92–243  ·  view source on GitHub ↗
(props: HoverProps)

Source from the content-addressed store, hash-verified

90 * across browsers and platforms, and ignores emulated mouse events on touch devices.
91 */
92export function useHover(props: HoverProps): HoverResult {
93 let {onHoverStart, onHoverChange, onHoverEnd, isDisabled} = props;
94
95 let [isHovered, setHovered] = useState(false);
96 let state = useRef({
97 isHovered: false,
98 ignoreEmulatedMouseEvents: false,
99 pointerType: '',
100 target: null
101 }).current;
102
103 useEffect(setupGlobalTouchEvents, []);
104 let {addGlobalListener, removeAllGlobalListeners} = useGlobalListeners();
105
106 let {hoverProps, triggerHoverEnd} = useMemo(() => {
107 let triggerHoverStart = (event, pointerType) => {
108 state.pointerType = pointerType;
109 if (
110 isDisabled ||
111 pointerType === 'touch' ||
112 state.isHovered ||
113 !nodeContains(event.currentTarget, getEventTarget(event) as Element)
114 ) {
115 return;
116 }
117
118 state.isHovered = true;
119 let target = event.currentTarget;
120 state.target = target;
121
122 // When an element that is hovered over is removed, no pointerleave event is fired by the browser,
123 // even though the originally hovered target may have shrunk in size so it is no longer hovered.
124 // However, a pointerover event will be fired on the new target the mouse is over.
125 // In Chrome this happens immediately. In Safari and Firefox, it happens upon moving the mouse one pixel.
126 addGlobalListener(
127 getOwnerDocument(getEventTarget(event) as Element),
128 'pointerover',
129 e => {
130 if (
131 state.isHovered &&
132 state.target &&
133 !nodeContains(state.target, getEventTarget(e) as Element)
134 ) {
135 // oxlint-disable-next-line react/react-compiler
136 triggerHoverEnd(e, e.pointerType);
137 }
138 },
139 {capture: true}
140 );
141
142 if (onHoverStart) {
143 onHoverStart({
144 type: 'hoverstart',
145 target,
146 pointerType
147 });
148 }
149

Callers 15

ExampleFunction · 0.90
TestFunction · 0.90
PortalExampleFunction · 0.90
usePreviewTriggerFunction · 0.90
useTooltipTriggerFunction · 0.90
useTooltipFunction · 0.90
useMenuItemFunction · 0.90
useOptionFunction · 0.90
useToastRegionFunction · 0.90
ButtonFunction · 0.90
Toast.tsxFile · 0.90
Button.tsxFile · 0.90

Calls 5

useGlobalListenersFunction · 0.90
nodeContainsFunction · 0.90
getEventTargetFunction · 0.90
triggerHoverStartFunction · 0.85
triggerHoverEndFunction · 0.85

Tested by 3

ExampleFunction · 0.72
TestFunction · 0.72
PortalExampleFunction · 0.72