@@ -6,30 +6,48 @@ const findEventHandler = (
6
6
element : ReactTestInstance ,
7
7
eventName : string ,
8
8
callsite ? : any ,
9
- nearestHostDescendent ? : ReactTestInstance
9
+ nearestHostDescendent ? : ReactTestInstance ,
10
+ hasDescendandHandler ? : boolean
10
11
) => {
12
+ const handler = getEventHandler ( element , eventName ) ;
13
+ const hasHandler = handler != null || hasDescendandHandler ;
14
+
11
15
const isHostComponent = typeof element . type === 'string' ;
12
16
const hostElement = isHostComponent ? element : nearestHostDescendent ;
13
17
const isEventEnabled =
14
18
hostElement ?. props . onStartShouldSetResponder ?. ( ) !== false ;
19
+ if ( handler && isEventEnabled ) return handler ;
15
20
16
- const eventHandlerName = toEventHandlerName ( eventName ) ;
21
+ // Do not bubble event to the root element
22
+ if ( element . parent === null || element . parent . parent === null ) {
23
+ if ( hasHandler ) return null ;
24
+ else
25
+ throw new ErrorWithStack (
26
+ `No handler function found for event: "${ eventName } "` ,
27
+ callsite || invokeEvent
28
+ ) ;
29
+ }
30
+
31
+ return findEventHandler (
32
+ element . parent ,
33
+ eventName ,
34
+ callsite ,
35
+ hostElement ,
36
+ hasHandler
37
+ ) ;
38
+ } ;
17
39
18
- if ( typeof element . props [ eventHandlerName ] === 'function' && isEventEnabled ) {
40
+ const getEventHandler = ( element : ReactTestInstance , eventName : string ) => {
41
+ const eventHandlerName = toEventHandlerName ( eventName ) ;
42
+ if ( typeof element . props [ eventHandlerName ] === 'function' ) {
19
43
return element . props [ eventHandlerName ] ;
20
- } else if ( typeof element . props [ eventName ] === 'function' && isEventEnabled ) {
21
- return element . props [ eventName ] ;
22
44
}
23
45
24
- // Do not bubble event to the root element
25
- if ( element . parent === null || element . parent . parent === null ) {
26
- throw new ErrorWithStack (
27
- `No handler function found for event: "${ eventName } "` ,
28
- callsite || invokeEvent
29
- ) ;
46
+ if ( typeof element . props [ eventName ] === 'function' ) {
47
+ return element . props [ eventName ] ;
30
48
}
31
49
32
- return findEventHandler ( element . parent , eventName , callsite , hostElement ) ;
50
+ return undefined ;
33
51
} ;
34
52
35
53
const invokeEvent = (
0 commit comments