Skip to content

Commit 55cf1e7

Browse files
yungstersfacebook-github-bot
authored andcommitted
RN: Unbreak Rules of React in RNTesterPlatformTestEventRecorder (#51441)
Summary: Pull Request resolved: #51441 Refactors `RNTesterPlatformTestEventRecorder` so that it does not use `useMemo` from an instance method. Instead, this diff changes the module to export a hook by the same name, `useRecorderTestEventHandlers`. Changelog: [Internal] Reviewed By: SamChou19815 Differential Revision: D74950333 fbshipit-source-id: 6cb222a6ec077abadbdc7008e822645aba3d07f6
1 parent 3371fb5 commit 55cf1e7

File tree

4 files changed

+50
-39
lines changed

4 files changed

+50
-39
lines changed

packages/rn-tester/js/examples/Experimental/PlatformTest/RNTesterPlatformTestEventRecorder.js

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ type EventRecord = {
2626
event: Object,
2727
};
2828

29-
class RNTesterPlatformTestEventRecorder {
29+
export default class RNTesterPlatformTestEventRecorder {
3030
allRecords: Array<EventRecord> = [];
3131
relevantEvents: Array<string> = [];
3232
rawOrder: number = 1;
@@ -101,41 +101,34 @@ class RNTesterPlatformTestEventRecorder {
101101
};
102102
}
103103

104-
useRecorderTestEventHandlers(
104+
createRecorderTestEventHandlers(
105105
targetNames: $ReadOnlyArray<string>,
106106
callback?: (event: Object, eventType: string, targetName: string) => void,
107107
): $ReadOnly<{[targetName: string]: ViewProps}> {
108-
// Yes this method exists as a class's prototype method but it will still only be used
109-
// in functional components
110-
// prettier-ignore
111-
// $FlowFixMe[react-rule-hook]
112-
return useMemo(() => { // eslint-disable-line react-hooks/rules-of-hooks
113-
const result: {[targetName: string]: ViewProps} = {};
114-
for (const targetName of targetNames) {
115-
const recordedEventHandler =
116-
this._generateRecordedEventHandlerWithCallback(
117-
targetName,
118-
(event, eventType) =>
119-
callback && callback(event, eventType, targetName),
120-
);
121-
// $FlowFixMe[incompatible-call]
122-
const eventListenerProps = this.relevantEvents.reduce(
123-
(acc: ViewProps, eventName) => {
124-
const eventPropName =
125-
'on' + eventName[0].toUpperCase() + eventName.slice(1);
126-
return {
127-
...acc,
128-
[eventPropName]: (e => {
129-
recordedEventHandler(e, eventName);
130-
}) as $FlowFixMe,
131-
};
132-
},
133-
{},
108+
const result: {[targetName: string]: ViewProps} = {};
109+
for (const targetName of targetNames) {
110+
const recordedEventHandler =
111+
this._generateRecordedEventHandlerWithCallback(
112+
targetName,
113+
(event, eventType) => callback?.(event, eventType, targetName),
134114
);
135-
result[targetName] = eventListenerProps;
136-
}
137-
return result;
138-
}, [callback, targetNames]);
115+
// $FlowFixMe[incompatible-call]
116+
const eventListenerProps = this.relevantEvents.reduce(
117+
(acc: ViewProps, eventName) => {
118+
const eventPropName =
119+
'on' + eventName[0].toUpperCase() + eventName.slice(1);
120+
return {
121+
...acc,
122+
[eventPropName]: (e => {
123+
recordedEventHandler(e, eventName);
124+
}) as $FlowFixMe,
125+
};
126+
},
127+
{},
128+
);
129+
result[targetName] = eventListenerProps;
130+
}
131+
return result;
139132
}
140133

141134
getRecords(): Array<EventRecord> {
@@ -176,4 +169,13 @@ class RNTesterPlatformTestEventRecorder {
176169
}
177170
}
178171

179-
export default RNTesterPlatformTestEventRecorder;
172+
export function useRecorderTestEventHandlers(
173+
eventRecorder: RNTesterPlatformTestEventRecorder,
174+
targetNames: $ReadOnlyArray<string>,
175+
callback?: (event: Object, eventType: string, targetName: string) => void,
176+
): $ReadOnly<{[targetName: string]: ViewProps}> {
177+
return useMemo(
178+
() => eventRecorder.createRecorderTestEventHandlers(targetNames, callback),
179+
[eventRecorder, targetNames, callback],
180+
);
181+
}

packages/rn-tester/js/examples/Experimental/W3CPointerEventPlatformTests/PointerEventPointerMoveAcross.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
import type {PlatformTestComponentBaseProps} from '../PlatformTest/RNTesterPlatformTestTypes';
1212

1313
import RNTesterPlatformTest from '../PlatformTest/RNTesterPlatformTest';
14-
import RNTesterPlatformTestEventRecorder from '../PlatformTest/RNTesterPlatformTestEventRecorder';
14+
import RNTesterPlatformTestEventRecorder, {
15+
useRecorderTestEventHandlers,
16+
} from '../PlatformTest/RNTesterPlatformTestEventRecorder';
1517
import * as React from 'react';
1618
import {useCallback, useState} from 'react';
1719
import {StyleSheet, View} from 'react-native';
@@ -126,7 +128,8 @@ function PointerEventPointerMoveAcrossTestCase(
126128
[eventRecorder, pointermove_across],
127129
);
128130

129-
const eventProps = eventRecorder.useRecorderTestEventHandlers(
131+
const eventProps = useRecorderTestEventHandlers(
132+
eventRecorder,
130133
targetNames,
131134
eventHandler,
132135
);

packages/rn-tester/js/examples/Experimental/W3CPointerEventPlatformTests/PointerEventPointerMoveBetween.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
import type {PlatformTestComponentBaseProps} from '../PlatformTest/RNTesterPlatformTestTypes';
1212

1313
import RNTesterPlatformTest from '../PlatformTest/RNTesterPlatformTest';
14-
import RNTesterPlatformTestEventRecorder from '../PlatformTest/RNTesterPlatformTestEventRecorder';
14+
import RNTesterPlatformTestEventRecorder, {
15+
useRecorderTestEventHandlers,
16+
} from '../PlatformTest/RNTesterPlatformTestEventRecorder';
1517
import * as React from 'react';
1618
import {useCallback, useState} from 'react';
1719
import {StyleSheet, View} from 'react-native';
@@ -102,7 +104,8 @@ function PointerEventPointerMoveBetweenTestCase(
102104
[eventRecorder, pointermove_between],
103105
);
104106

105-
const eventProps = eventRecorder.useRecorderTestEventHandlers(
107+
const eventProps = useRecorderTestEventHandlers(
108+
eventRecorder,
106109
targetNames,
107110
eventHandler,
108111
);

packages/rn-tester/js/examples/Experimental/W3CPointerEventPlatformTests/PointerEventPointerMoveEventOrder.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import type {PlatformTestComponentBaseProps} from '../PlatformTest/RNTesterPlatf
1212
import type {PointerEvent} from 'react-native';
1313

1414
import RNTesterPlatformTest from '../PlatformTest/RNTesterPlatformTest';
15-
import RNTesterPlatformTestEventRecorder from '../PlatformTest/RNTesterPlatformTestEventRecorder';
15+
import RNTesterPlatformTestEventRecorder, {
16+
useRecorderTestEventHandlers,
17+
} from '../PlatformTest/RNTesterPlatformTestEventRecorder';
1618
import * as React from 'react';
1719
import {useCallback, useState} from 'react';
1820
import {StyleSheet, View} from 'react-native';
@@ -111,7 +113,8 @@ function PointerEventPointerMoveEventOrderTestCase(
111113
[endMoved, eventRecorder, pointer_test, startMoved],
112114
);
113115

114-
const eventProps = eventRecorder.useRecorderTestEventHandlers(
116+
const eventProps = useRecorderTestEventHandlers(
117+
eventRecorder,
115118
['start', 'end'],
116119
eventHandler,
117120
);

0 commit comments

Comments
 (0)