Skip to content

Commit 8ca8fc1

Browse files
committed
feat: implement behavior chage
1 parent c996559 commit 8ca8fc1

File tree

1 file changed

+30
-12
lines changed

1 file changed

+30
-12
lines changed

src/fireEvent.js

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,48 @@ const findEventHandler = (
66
element: ReactTestInstance,
77
eventName: string,
88
callsite?: any,
9-
nearestHostDescendent?: ReactTestInstance
9+
nearestHostDescendent?: ReactTestInstance,
10+
hasDescendandHandler?: boolean
1011
) => {
12+
const handler = getEventHandler(element, eventName);
13+
const hasHandler = handler != null || hasDescendandHandler;
14+
1115
const isHostComponent = typeof element.type === 'string';
1216
const hostElement = isHostComponent ? element : nearestHostDescendent;
1317
const isEventEnabled =
1418
hostElement?.props.onStartShouldSetResponder?.() !== false;
19+
if (handler && isEventEnabled) return handler;
1520

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+
};
1739

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') {
1943
return element.props[eventHandlerName];
20-
} else if (typeof element.props[eventName] === 'function' && isEventEnabled) {
21-
return element.props[eventName];
2244
}
2345

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];
3048
}
3149

32-
return findEventHandler(element.parent, eventName, callsite, hostElement);
50+
return undefined;
3351
};
3452

3553
const invokeEvent = (

0 commit comments

Comments
 (0)