Skip to content

Commit 278211a

Browse files
dmytrorykunfacebook-github-bot
authored andcommitted
Use paperTopLevelNameDeprecated in generated EventEmitters if defined (#42812)
Summary: There is a way of defining events where you specify additional string type parameter in the EventHandler in the spec. This additional type parameter is an overridden top level event name, that can be completely unrelated to the event handler name. More context here D16042065. Let's say we have ``` onLegacyStyleEvent?: ?BubblingEventHandler<LegacyStyleEvent, 'alternativeLegacyName'> ``` This will produce the following entry in the view config: ``` topAlternativeLegacyName: { phasedRegistrationNames: { captured: 'onLegacyStyleEventCapture', bubbled: 'onLegacyStyleEvent' } } ``` This means that React expects `topAlternativeLegacyName`. But the generated EventEmitter looks like this: ``` void RNTMyNativeViewEventEmitter::onLegacyStyleEvent(OnLegacyStyleEvent $event) const { dispatchEvent("legacyStyleEvent", [$event=std::move($event)](jsi::Runtime &runtime) { auto $payload = jsi::Object(runtime); $payload.setProperty(runtime, "string", $event.string); return $payload; }); } ``` The native component will emit `legacyStyleEvent` (`topLegacyStyleEvent` after normalization) that React will not be able to handle. This issue only happens on iOS because Android doesn't use EventEmitter currently. To address this issue we'll use `paperTopLevelNameDeprecated` for the generated EventEmitters if it is defined. Changelog: [iOS][Fixed] - Fixed support for event name override in component specs. Reviewed By: cortinico Differential Revision: D53310654
1 parent c3d7bd0 commit 278211a

File tree

3 files changed

+10
-9
lines changed

3 files changed

+10
-9
lines changed

packages/react-native-codegen/e2e/__tests__/components/__snapshots__/GenerateEventEmitterCpp-test.js.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ Object {
190190
namespace facebook::react {
191191
192192
void EventPropsNativeComponentViewEventEmitter::onChange(OnChange $event) const {
193-
dispatchEvent(\\"change\\", [$event=std::move($event)](jsi::Runtime &runtime) {
193+
dispatchEvent(\\"paperDirectName\\", [$event=std::move($event)](jsi::Runtime &runtime) {
194194
auto $payload = jsi::Object(runtime);
195195
$payload.setProperty(runtime, \\"value\\", $event.value);
196196
$payload.setProperty(runtime, \\"source\\", $event.source);
@@ -211,7 +211,7 @@ void EventPropsNativeComponentViewEventEmitter::onEventDirect(OnEventDirect $eve
211211
212212
213213
void EventPropsNativeComponentViewEventEmitter::onEventDirectWithPaperName(OnEventDirectWithPaperName $event) const {
214-
dispatchEvent(\\"eventDirectWithPaperName\\", [$event=std::move($event)](jsi::Runtime &runtime) {
214+
dispatchEvent(\\"paperDirectName\\", [$event=std::move($event)](jsi::Runtime &runtime) {
215215
auto $payload = jsi::Object(runtime);
216216
$payload.setProperty(runtime, \\"value\\", $event.value);
217217
return $payload;
@@ -220,7 +220,7 @@ void EventPropsNativeComponentViewEventEmitter::onEventDirectWithPaperName(OnEve
220220
221221
222222
void EventPropsNativeComponentViewEventEmitter::onOrientationChange(OnOrientationChange $event) const {
223-
dispatchEvent(\\"orientationChange\\", [$event=std::move($event)](jsi::Runtime &runtime) {
223+
dispatchEvent(\\"paperBubblingName\\", [$event=std::move($event)](jsi::Runtime &runtime) {
224224
auto $payload = jsi::Object(runtime);
225225
$payload.setProperty(runtime, \\"orientation\\", toString($event.orientation));
226226
return $payload;
@@ -238,7 +238,7 @@ void EventPropsNativeComponentViewEventEmitter::onEnd(OnEnd $event) const {
238238
239239
240240
void EventPropsNativeComponentViewEventEmitter::onEventBubblingWithPaperName(OnEventBubblingWithPaperName $event) const {
241-
dispatchEvent(\\"eventBubblingWithPaperName\\", [](jsi::Runtime &runtime) {
241+
dispatchEvent(\\"paperBubblingName\\", [](jsi::Runtime &runtime) {
242242
auto $payload = jsi::Object(runtime);
243243
244244
return $payload;

packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -369,9 +369,10 @@ function generateEvent(
369369
// In order to migrate to this new system we have to support the current
370370
// naming scheme. We should delete this once we are able to control this name
371371
// throughout the system.
372-
const dispatchEventName = `${event.name[2].toLowerCase()}${event.name.slice(
373-
3,
374-
)}`;
372+
const dispatchEventName =
373+
event.paperTopLevelNameDeprecated != null
374+
? event.paperTopLevelNameDeprecated
375+
: `${event.name[2].toLowerCase()}${event.name.slice(3)}`;
375376

376377
if (event.typeAnnotation.argument) {
377378
const implementation = `

packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterCpp-test.js.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ Map {
361361
namespace facebook::react {
362362
363363
void InterfaceOnlyComponentEventEmitter::onChange(OnChange $event) const {
364-
dispatchEvent(\\"change\\", [$event=std::move($event)](jsi::Runtime &runtime) {
364+
dispatchEvent(\\"paperChange\\", [$event=std::move($event)](jsi::Runtime &runtime) {
365365
auto $payload = jsi::Object(runtime);
366366
$payload.setProperty(runtime, \\"value\\", $event.value);
367367
return $payload;
@@ -370,7 +370,7 @@ void InterfaceOnlyComponentEventEmitter::onChange(OnChange $event) const {
370370
371371
372372
void InterfaceOnlyComponentEventEmitter::onDirectChange(OnDirectChange $event) const {
373-
dispatchEvent(\\"directChange\\", [$event=std::move($event)](jsi::Runtime &runtime) {
373+
dispatchEvent(\\"paperDirectChange\\", [$event=std::move($event)](jsi::Runtime &runtime) {
374374
auto $payload = jsi::Object(runtime);
375375
$payload.setProperty(runtime, \\"value\\", $event.value);
376376
return $payload;

0 commit comments

Comments
 (0)