@@ -5,13 +5,9 @@ import { getHostParent, isHostElement } from './helpers/component-tree';
5
5
import { filterNodeByType } from './helpers/filterNodeByType' ;
6
6
import { getHostComponentNames } from './helpers/host-component-names' ;
7
7
8
- type EventHandler = ( ...args : any ) => unknown ;
9
-
10
- const isTextInput = ( element ?: ReactTestInstance ) => {
11
- if ( ! element ) {
12
- return false ;
13
- }
8
+ type EventHandler = ( ...args : unknown [ ] ) => unknown ;
14
9
10
+ function isTextInput ( element : ReactTestInstance ) {
15
11
// We have to test if the element type is either the `TextInput` component
16
12
// (for composite component) or the string "TextInput" (for host component)
17
13
// All queries return host components but since fireEvent bubbles up
@@ -20,18 +16,22 @@ const isTextInput = (element?: ReactTestInstance) => {
20
16
filterNodeByType ( element , TextInput ) ||
21
17
filterNodeByType ( element , getHostComponentNames ( ) . textInput )
22
18
) ;
23
- } ;
19
+ }
24
20
25
- const isTouchResponder = ( element ?: ReactTestInstance ) => {
26
- if ( ! isHostElement ( element ) ) return false ;
21
+ function isTouchResponder ( element : ReactTestInstance ) {
22
+ if ( ! isHostElement ( element ) ) {
23
+ return false ;
24
+ }
27
25
28
- return ! ! element ?. props . onStartShouldSetResponder || isTextInput ( element ) ;
29
- } ;
26
+ return (
27
+ Boolean ( element . props . onStartShouldSetResponder ) || isTextInput ( element )
28
+ ) ;
29
+ }
30
30
31
- const isPointerEventEnabled = (
31
+ function isPointerEventEnabled (
32
32
element : ReactTestInstance ,
33
33
isParent ?: boolean
34
- ) : boolean => {
34
+ ) : boolean {
35
35
const pointerEvents = element . props . pointerEvents ;
36
36
if ( pointerEvents === 'none' ) {
37
37
return false ;
@@ -47,54 +47,60 @@ const isPointerEventEnabled = (
47
47
}
48
48
49
49
return isPointerEventEnabled ( parent , true ) ;
50
- } ;
50
+ }
51
+
52
+ // Due to accepting both `press` and `onPress` for event names, we need to
53
+ // cover both forms.
54
+ const touchEventNames = [ 'press' , 'onPress' ] ;
51
55
52
- const isTouchEvent = ( eventName ? : string ) => {
53
- return eventName === 'press' ;
54
- } ;
56
+ function isTouchEvent ( eventName : string ) {
57
+ return touchEventNames . includes ( eventName ) ;
58
+ }
55
59
56
- const isEventEnabled = (
60
+ function isEventEnabled (
57
61
element : ReactTestInstance ,
58
- touchResponder ?: ReactTestInstance ,
59
- eventName ?: string
60
- ) => {
61
- if ( isTextInput ( element ) ) return element ?. props . editable !== false ;
62
- if ( ! isPointerEventEnabled ( element ) && isTouchEvent ( eventName ) ) return false ;
62
+ eventName : string ,
63
+ nearestTouchResponder ?: ReactTestInstance
64
+ ) {
65
+ if ( isTextInput ( element ) ) {
66
+ return element . props . editable !== false ;
67
+ }
63
68
64
- const touchStart = touchResponder ?. props . onStartShouldSetResponder ?.( ) ;
65
- const touchMove = touchResponder ?. props . onMoveShouldSetResponder ?.( ) ;
69
+ if ( isTouchEvent ( eventName ) && ! isPointerEventEnabled ( element ) ) {
70
+ return false ;
71
+ }
66
72
67
- if ( touchStart || touchMove ) return true ;
73
+ const touchStart = nearestTouchResponder ?. props . onStartShouldSetResponder ?.( ) ;
74
+ const touchMove = nearestTouchResponder ?. props . onMoveShouldSetResponder ?.( ) ;
75
+ if ( touchStart || touchMove ) {
76
+ return true ;
77
+ }
68
78
69
79
return touchStart === undefined && touchMove === undefined ;
70
- } ;
80
+ }
71
81
72
- const findEventHandler = (
82
+ function findEventHandler (
73
83
element : ReactTestInstance ,
74
84
eventName : string ,
75
- callsite ?: any ,
76
85
nearestTouchResponder ?: ReactTestInstance
77
- ) : EventHandler | null => {
86
+ ) : EventHandler | null {
78
87
const touchResponder = isTouchResponder ( element )
79
88
? element
80
89
: nearestTouchResponder ;
81
90
82
91
const handler = getEventHandler ( element , eventName ) ;
83
- if ( handler && isEventEnabled ( element , touchResponder , eventName ) )
92
+ if ( handler && isEventEnabled ( element , eventName , touchResponder ) )
84
93
return handler ;
85
94
86
95
if ( element . parent === null || element . parent . parent === null ) {
87
96
return null ;
88
97
}
89
98
90
- return findEventHandler ( element . parent , eventName , callsite , touchResponder ) ;
91
- } ;
99
+ return findEventHandler ( element . parent , eventName , touchResponder ) ;
100
+ }
92
101
93
- const getEventHandler = (
94
- element : ReactTestInstance ,
95
- eventName : string
96
- ) : EventHandler | undefined => {
97
- const eventHandlerName = toEventHandlerName ( eventName ) ;
102
+ function getEventHandler ( element : ReactTestInstance , eventName : string ) {
103
+ const eventHandlerName = getEventHandlerName ( eventName ) ;
98
104
if ( typeof element . props [ eventHandlerName ] === 'function' ) {
99
105
return element . props [ eventHandlerName ] ;
100
106
}
@@ -104,49 +110,37 @@ const getEventHandler = (
104
110
}
105
111
106
112
return undefined ;
107
- } ;
113
+ }
114
+
115
+ function getEventHandlerName ( eventName : string ) {
116
+ return `on${ eventName . charAt ( 0 ) . toUpperCase ( ) } ${ eventName . slice ( 1 ) } ` ;
117
+ }
108
118
109
- const invokeEvent = (
119
+ function fireEvent (
110
120
element : ReactTestInstance ,
111
121
eventName : string ,
112
- callsite ?: any ,
113
- ...data : Array < any >
114
- ) => {
115
- const handler = findEventHandler ( element , eventName , callsite ) ;
116
-
122
+ ...data : unknown [ ]
123
+ ) {
124
+ const handler = findEventHandler ( element , eventName ) ;
117
125
if ( ! handler ) {
118
126
return ;
119
127
}
120
128
121
129
let returnValue ;
122
-
123
130
act ( ( ) => {
124
131
returnValue = handler ( ...data ) ;
125
132
} ) ;
126
133
127
134
return returnValue ;
128
- } ;
129
-
130
- const toEventHandlerName = ( eventName : string ) =>
131
- `on${ eventName . charAt ( 0 ) . toUpperCase ( ) } ${ eventName . slice ( 1 ) } ` ;
135
+ }
132
136
133
- const pressHandler = ( element : ReactTestInstance , ...data : Array < any > ) : void =>
134
- invokeEvent ( element , 'press' , pressHandler , ...data ) ;
135
- const changeTextHandler = (
136
- element : ReactTestInstance ,
137
- ...data : Array < any >
138
- ) : void => invokeEvent ( element , 'changeText' , changeTextHandler , ...data ) ;
139
- const scrollHandler = ( element : ReactTestInstance , ...data : Array < any > ) : void =>
140
- invokeEvent ( element , 'scroll' , scrollHandler , ...data ) ;
137
+ fireEvent . press = ( element : ReactTestInstance , ...data : unknown [ ] ) =>
138
+ fireEvent ( element , 'press' , ...data ) ;
141
139
142
- const fireEvent = (
143
- element : ReactTestInstance ,
144
- eventName : string ,
145
- ...data : Array < any >
146
- ) : void => invokeEvent ( element , eventName , fireEvent , ...data ) ;
140
+ fireEvent . changeText = ( element : ReactTestInstance , ...data : unknown [ ] ) =>
141
+ fireEvent ( element , 'changeText' , ...data ) ;
147
142
148
- fireEvent . press = pressHandler ;
149
- fireEvent . changeText = changeTextHandler ;
150
- fireEvent . scroll = scrollHandler ;
143
+ fireEvent . scroll = ( element : ReactTestInstance , ...data : unknown [ ] ) =>
144
+ fireEvent ( element , 'scroll' , ...data ) ;
151
145
152
146
export default fireEvent ;
0 commit comments