@@ -10,7 +10,9 @@ import type { ReactTestInstance } from 'react-test-renderer';
1010import act from './act' ;
1111import { getEventHandler } from './event-handler' ;
1212import { isElementMounted , isHostElement } from './helpers/component-tree' ;
13+ import { formatElement } from './helpers/format-element' ;
1314import { isHostScrollView , isHostTextInput } from './helpers/host-component-names' ;
15+ import { logger } from './helpers/logger' ;
1416import { isPointerEventEnabled } from './helpers/pointer-events' ;
1517import { isEditableTextInput } from './helpers/text-input' ;
1618import { nativeState } from './native-state' ;
@@ -74,23 +76,41 @@ export function isEventEnabled(
7476 return touchStart === undefined && touchMove === undefined ;
7577}
7678
79+ type FindEventHandlerState = {
80+ nearestTouchResponder ?: ReactTestInstance ;
81+ disabledElements : ReactTestInstance [ ] ;
82+ targetElement : ReactTestInstance ;
83+ } ;
84+
7785function findEventHandler (
7886 element : ReactTestInstance ,
7987 eventName : string ,
80- nearestTouchResponder ?: ReactTestInstance ,
88+ state : FindEventHandlerState = {
89+ disabledElements : [ ] ,
90+ targetElement : element ,
91+ } ,
8192) : EventHandler | null {
82- const touchResponder = isTouchResponder ( element ) ? element : nearestTouchResponder ;
93+ const touchResponder = isTouchResponder ( element ) ? element : state . nearestTouchResponder ;
8394
8495 const handler = getEventHandler ( element , eventName , { loose : true } ) ;
85- if ( handler && isEventEnabled ( element , eventName , touchResponder ) ) {
86- return handler ;
96+ if ( handler ) {
97+ const isEnabled = isEventEnabled ( element , eventName , touchResponder ) ;
98+ if ( isEnabled ) {
99+ return handler ;
100+ } else {
101+ state . disabledElements . push ( element ) ;
102+ }
87103 }
88104
89105 if ( element . parent === null ) {
106+ logger . warn ( formatEnabledEventHandlerNotFound ( eventName , state ) ) ;
90107 return null ;
91108 }
92109
93- return findEventHandler ( element . parent , eventName , touchResponder ) ;
110+ return findEventHandler ( element . parent , eventName , {
111+ ...state ,
112+ nearestTouchResponder : touchResponder ,
113+ } ) ;
94114}
95115
96116// String union type of keys of T that start with on, stripped of 'on'
@@ -211,3 +231,23 @@ function tryGetContentOffset(event: unknown): Point | null {
211231
212232 return null ;
213233}
234+
235+ function formatEnabledEventHandlerNotFound ( eventName : string , state : FindEventHandlerState ) {
236+ if ( state . disabledElements . length === 0 ) {
237+ return `Fire Event: no event handler for "${ eventName } " event found on ${ formatElement (
238+ state . targetElement ,
239+ {
240+ compact : true ,
241+ } ,
242+ ) } or any of its ancestors.`;
243+ }
244+
245+ return `Fire Event: no enabled event handler for "${ eventName } " event found. Found disabled event handler(s) on:\n${ state . disabledElements
246+ . map (
247+ ( e ) =>
248+ ` - ${ formatElement ( e , { compact : true } ) } ${
249+ typeof e . type === 'string' ? '' : ' (composite element)'
250+ } `,
251+ )
252+ . join ( '\n' ) } `;
253+ }
0 commit comments