@@ -8,14 +8,13 @@ import type {
88import type { HostElement } from 'universal-test-renderer' ;
99
1010import act from './act' ;
11- import { getEventHandler } from './event-handler' ;
11+ import { getEventHandler , getFiberEventHandler } from './event-handler' ;
1212import { isElementMounted } from './helpers/component-tree' ;
1313import { isHostScrollView , isHostTextInput } from './helpers/host-component-names' ;
1414import { isPointerEventEnabled } from './helpers/pointer-events' ;
1515import { isEditableTextInput } from './helpers/text-input' ;
1616import { nativeState } from './native-state' ;
1717import type { Point , StringWithAutocomplete } from './types' ;
18- import { EventBuilder } from './user-event/event-builder' ;
1918
2019type EventHandler = ( ...args : unknown [ ] ) => unknown ;
2120
@@ -86,19 +85,40 @@ function findEventHandler(
8685) : EventHandler | null {
8786 const touchResponder = isTouchResponder ( element ) ? element : nearestTouchResponder ;
8887
89- const handler = getEventHandler ( element , eventName , { loose : true } ) ;
88+ const handler =
89+ getEventHandler ( element , eventName , { loose : true } ) ??
90+ findEventHandlerFromFiber ( element . unstable_fiber , eventName ) ;
9091 if ( handler && isEventEnabled ( element , eventName , touchResponder ) ) {
9192 return handler ;
9293 }
9394
94- // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
95- if ( element . parent === null || element . parent . parent === null ) {
95+ if ( element . parent === null ) {
9696 return null ;
9797 }
9898
9999 return findEventHandler ( element . parent , eventName , touchResponder ) ;
100100}
101101
102+ type Fiber = HostElement [ 'unstable_fiber' ] ;
103+
104+ function findEventHandlerFromFiber ( fiber : Fiber , eventName : string ) : EventHandler | null {
105+ if ( fiber === null ) {
106+ return null ;
107+ }
108+
109+ const handler = getFiberEventHandler ( fiber , eventName , { loose : true } ) ;
110+ if ( handler ) {
111+ return handler ;
112+ }
113+
114+ // No parent fiber or we reached another host element
115+ if ( fiber . return === null || typeof fiber . return . type === 'string' ) {
116+ return null ;
117+ }
118+
119+ return findEventHandlerFromFiber ( fiber . return , eventName ) ;
120+ }
121+
102122// String union type of keys of T that start with on, stripped of 'on'
103123type EventNameExtractor < T > = keyof {
104124 [ K in keyof T as K extends `on${infer Rest } ` ? Uncapitalize < Rest > : never ] : T [ K ] ;
@@ -132,37 +152,9 @@ function fireEvent(element: HostElement, eventName: EventName, ...data: unknown[
132152 return returnValue ;
133153}
134154
135- fireEvent . press = ( element : HostElement , ...data : unknown [ ] ) => {
136- const nativeData =
137- data . length === 1 &&
138- typeof data [ 0 ] === 'object' &&
139- data [ 0 ] !== null &&
140- 'nativeEvent' in data [ 0 ] &&
141- typeof data [ 0 ] . nativeEvent === 'object'
142- ? data [ 0 ] . nativeEvent
143- : null ;
144-
145- const responderGrantEvent = EventBuilder . Common . responderGrant ( ) ;
146- if ( nativeData ) {
147- responderGrantEvent . nativeEvent = {
148- ...responderGrantEvent . nativeEvent ,
149- ...nativeData ,
150- } ;
151- }
152- fireEvent ( element , 'responderGrant' , responderGrantEvent ) ;
153-
155+ fireEvent . press = ( element : HostElement , ...data : unknown [ ] ) =>
154156 fireEvent ( element , 'press' , ...data ) ;
155157
156- const responderReleaseEvent = EventBuilder . Common . responderRelease ( ) ;
157- if ( nativeData ) {
158- responderReleaseEvent . nativeEvent = {
159- ...responderReleaseEvent . nativeEvent ,
160- ...nativeData ,
161- } ;
162- }
163- fireEvent ( element , 'responderRelease' , responderReleaseEvent ) ;
164- } ;
165-
166158fireEvent . changeText = ( element : HostElement , ...data : unknown [ ] ) =>
167159 fireEvent ( element , 'changeText' , ...data ) ;
168160
0 commit comments