Skip to content

Commit d6b4706

Browse files
fix: useHover always returns currentTarget (#2428)
* fix: useHover always returns currentTarget fix #2355 * add a test and use the standard target name * fix lint Co-authored-by: Rob Snow <[email protected]>
1 parent dd9c58d commit d6b4706

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

packages/@react-aria/interactions/src/useHover.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ export function useHover(props: HoverProps): HoverResult {
109109
}
110110

111111
state.isHovered = true;
112-
let target = event.target;
112+
let target = event.currentTarget;
113113
state.target = target;
114114

115115
if (onHoverStart) {
@@ -136,7 +136,7 @@ export function useHover(props: HoverProps): HoverResult {
136136
}
137137

138138
state.isHovered = false;
139-
let target = event.target;
139+
let target = event.currentTarget;
140140
if (onHoverEnd) {
141141
onHoverEnd({
142142
type: 'hoverend',
@@ -194,7 +194,7 @@ export function useHover(props: HoverProps): HoverResult {
194194
// Call the triggerHoverEnd as soon as isDisabled changes to true
195195
// Safe to call triggerHoverEnd, it will early return if we aren't currently hovering
196196
if (isDisabled) {
197-
triggerHoverEnd({target: state.target}, state.pointerType);
197+
triggerHoverEnd({currentTarget: state.target}, state.pointerType);
198198
}
199199
}, [isDisabled]);
200200

packages/@react-aria/interactions/test/useHover.test.js

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {useHover} from '../';
2222

2323
function Example(props) {
2424
let {hoverProps, isHovered} = useHover(props);
25-
return <div {...hoverProps}>test{isHovered && '-hovered'}</div>;
25+
return <div {...hoverProps}>test{isHovered && '-hovered'}<div data-testid="inner-target" /></div>;
2626
}
2727

2828
function pointerEvent(type, opts) {
@@ -98,6 +98,43 @@ describe('useHover', function () {
9898
]);
9999
});
100100

101+
it('hover event target should be the same element we attached listeners to even if we hover over inner elements', function () {
102+
let events = [];
103+
let addEvent = (e) => events.push(e);
104+
let res = render(
105+
<Example
106+
onHoverStart={addEvent}
107+
onHoverEnd={addEvent}
108+
onHoverChange={isHovering => addEvent({type: 'hoverchange', isHovering})} />
109+
);
110+
111+
let el = res.getByText('test');
112+
let inner = res.getByTestId('inner-target');
113+
fireEvent(inner, pointerEvent('pointerover', {pointerType: 'mouse'}));
114+
fireEvent(inner, pointerEvent('pointerout', {pointerType: 'mouse'}));
115+
116+
expect(events).toEqual([
117+
{
118+
type: 'hoverstart',
119+
target: el,
120+
pointerType: 'mouse'
121+
},
122+
{
123+
type: 'hoverchange',
124+
isHovering: true
125+
},
126+
{
127+
type: 'hoverend',
128+
target: el,
129+
pointerType: 'mouse'
130+
},
131+
{
132+
type: 'hoverchange',
133+
isHovering: false
134+
}
135+
]);
136+
});
137+
101138
it('should not fire hover events when pointerType is touch', function () {
102139
let events = [];
103140
let addEvent = (e) => events.push(e);

0 commit comments

Comments
 (0)