File tree Expand file tree Collapse file tree 2 files changed +41
-4
lines changed
packages/@react-aria/interactions Expand file tree Collapse file tree 2 files changed +41
-4
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff line change @@ -22,7 +22,7 @@ import {useHover} from '../';
2222
2323function 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
2828function 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 ) ;
You can’t perform that action at this time.
0 commit comments