Skip to content

Commit d7c83fd

Browse files
committed
migrate fire event
1 parent c82b906 commit d7c83fd

File tree

4 files changed

+29
-14
lines changed

4 files changed

+29
-14
lines changed

src/__tests__/__snapshots__/render-debug.test.tsx.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ exports[`debug changing component: bananaFresh button message should now be "fre
6363
<Text
6464
testID="bananaFresh"
6565
>
66-
not fresh
66+
fresh
6767
</Text>
6868
<TextInput
6969
placeholder="Add custom freshness"

src/fire-event.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type {
55
TextProps,
66
ViewProps,
77
} from 'react-native';
8-
import type { HostElement } from 'universal-test-renderer';
8+
import type { Fiber, HostElement } from 'universal-test-renderer';
99

1010
import act from './act';
1111
import { EventHandler, getEventHandlerFromProps } from './event-handler';
@@ -79,7 +79,9 @@ function findEventHandler(
7979
): EventHandler | null {
8080
const touchResponder = isTouchResponder(element) ? element : nearestTouchResponder;
8181

82-
const handler = getEventHandlerFromProps(element.props, eventName, { loose: true });
82+
const handler =
83+
getEventHandlerFromProps(element.props, eventName, { loose: true }) ??
84+
findEventHandlerFromFiber(element.unstable_fiber, eventName);
8385
if (handler && isEventEnabled(element, eventName, touchResponder)) {
8486
return handler;
8587
}
@@ -91,6 +93,25 @@ function findEventHandler(
9193
return findEventHandler(element.parent, eventName, touchResponder);
9294
}
9395

96+
function findEventHandlerFromFiber(fiber: Fiber | null, eventName: string): EventHandler | null {
97+
// Container fibers have memoizedProps set to null
98+
if (!fiber?.memoizedProps) {
99+
return null;
100+
}
101+
102+
const handler = getEventHandlerFromProps(fiber.memoizedProps, eventName, { loose: true });
103+
if (handler) {
104+
return handler;
105+
}
106+
107+
// No parent fiber or we reached another host element
108+
if (fiber.return === null || typeof fiber.return.type === 'string') {
109+
return null;
110+
}
111+
112+
return findEventHandlerFromFiber(fiber.return, eventName);
113+
}
114+
94115
// String union type of keys of T that start with on, stripped of 'on'
95116
type EventNameExtractor<T> = keyof {
96117
[K in keyof T as K extends `on${infer Rest}` ? Uncapitalize<Rest> : never]: T[K];

src/helpers/component-tree.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import type { HostElement } from 'universal-test-renderer';
1+
import type { HostElement, HostNode } from 'universal-test-renderer';
22

33
import { screen } from '../screen';
44

55
/**
66
* Checks if the given element is a host element.
77
* @param element The element to check.
88
*/
9-
export function isHostElement(element?: HostElement | null): element is HostElement {
10-
return typeof element?.type === 'string';
9+
export function isHostElement(element?: HostNode | null): element is HostElement {
10+
return typeof element !== 'string' && typeof element?.type === 'string';
1111
}
1212

1313
export function isElementMounted(element: HostElement) {

src/user-event/press/press.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@ export interface PressOptions {
2121

2222
export async function press(this: UserEventInstance, element: HostElement): Promise<void> {
2323
if (!isHostElement(element)) {
24-
throw new ErrorWithStack(
25-
`press() works only with host elements. Passed element has type "${element.type}".`,
26-
press,
27-
);
24+
throw new ErrorWithStack(`press() works only with host elements.`, press);
2825
}
2926

3027
await basePress(this.config, element, {
@@ -38,10 +35,7 @@ export async function longPress(
3835
options?: PressOptions,
3936
): Promise<void> {
4037
if (!isHostElement(element)) {
41-
throw new ErrorWithStack(
42-
`longPress() works only with host elements. Passed element has type "${element.type}".`,
43-
longPress,
44-
);
38+
throw new ErrorWithStack(`longPress() works only with host elements.`, longPress);
4539
}
4640

4741
await basePress(this.config, element, {

0 commit comments

Comments
 (0)