diff --git a/React/Fabric/Mounting/ComponentViews/Modal/RCTModalHostViewComponentView.mm b/React/Fabric/Mounting/ComponentViews/Modal/RCTModalHostViewComponentView.mm index cb6f3039a59..7fcbd62147f 100644 --- a/React/Fabric/Mounting/ComponentViews/Modal/RCTModalHostViewComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/Modal/RCTModalHostViewComponentView.mm @@ -85,10 +85,12 @@ static UIModalPresentationStyle presentationConfiguration(ModalHostViewProps con } } -static ModalHostViewOnOrientationChangeStruct onOrientationChangeStruct(CGRect rect) +static ModalHostViewEventEmitter::OnOrientationChange onOrientationChangeStruct(CGRect rect) { - auto orientation = rect.size.width < rect.size.height ? ModalHostViewOnOrientationChangeOrientationStruct::Portrait - : ModalHostViewOnOrientationChangeOrientationStruct::Landscape; + ; + auto orientation = rect.size.width < rect.size.height + ? ModalHostViewEventEmitter::OnOrientationChangeOrientation::Portrait + : ModalHostViewEventEmitter::OnOrientationChangeOrientation::Landscape; return {orientation}; } @@ -136,7 +138,7 @@ static ModalHostViewOnOrientationChangeStruct onOrientationChangeStruct(CGRect r assert(std::dynamic_pointer_cast(self->_eventEmitter)); auto eventEmitter = std::static_pointer_cast(self->_eventEmitter); - eventEmitter->onShow(ModalHostViewOnShowStruct{}); + eventEmitter->onShow(ModalHostViewEventEmitter::OnShow{}); }]; } diff --git a/React/Fabric/Mounting/ComponentViews/Slider/RCTSliderComponentView.mm b/React/Fabric/Mounting/ComponentViews/Slider/RCTSliderComponentView.mm index fddefa4d99c..bff3b255198 100644 --- a/React/Fabric/Mounting/ComponentViews/Slider/RCTSliderComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/Slider/RCTSliderComponentView.mm @@ -309,11 +309,11 @@ using namespace facebook::react; if (continuous && _previousValue != value) { std::dynamic_pointer_cast(_eventEmitter) - ->onValueChange(SliderOnValueChangeStruct{.value = static_cast(value)}); + ->onValueChange(SliderEventEmitter::OnValueChange{.value = static_cast(value)}); } if (!continuous) { std::dynamic_pointer_cast(_eventEmitter) - ->onSlidingComplete(SliderOnSlidingCompleteStruct{.value = static_cast(value)}); + ->onSlidingComplete(SliderEventEmitter::OnSlidingComplete{.value = static_cast(value)}); } _previousValue = value; diff --git a/React/Fabric/Mounting/ComponentViews/Switch/RCTSwitchComponentView.mm b/React/Fabric/Mounting/ComponentViews/Switch/RCTSwitchComponentView.mm index 4e384bca67f..4528488f52d 100644 --- a/React/Fabric/Mounting/ComponentViews/Switch/RCTSwitchComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/Switch/RCTSwitchComponentView.mm @@ -99,7 +99,7 @@ using namespace facebook::react; } std::dynamic_pointer_cast(_eventEmitter) - ->onChange(SwitchOnChangeStruct{.value = static_cast(sender.on)}); + ->onChange(SwitchEventEmitter::OnChange{.value = static_cast(sender.on)}); } #pragma mark - Native Commands diff --git a/packages/react-native-codegen/src/generators/components/CppHelpers.js b/packages/react-native-codegen/src/generators/components/CppHelpers.js index 6b92c5df968..80854623221 100644 --- a/packages/react-native-codegen/src/generators/components/CppHelpers.js +++ b/packages/react-native-codegen/src/generators/components/CppHelpers.js @@ -98,6 +98,11 @@ function getImports(properties: $ReadOnlyArray): Set { return imports; } +function generateEventStructName(parts: $ReadOnlyArray = []): string { + const additional = parts.map(toSafeCppString).join(''); + return `${additional}`; +} + function generateStructName( componentName: string, parts: $ReadOnlyArray = [], @@ -206,4 +211,5 @@ module.exports = { toSafeCppString, toIntEnumValueName, generateStructName, + generateEventStructName, }; diff --git a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js index 76f029bc7be..8577df4309e 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js +++ b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterCpp.js @@ -10,7 +10,7 @@ 'use strict'; -const {generateStructName} = require('./CppHelpers.js'); +const {generateEventStructName} = require('./CppHelpers.js'); import type { ComponentShape, @@ -151,10 +151,7 @@ function generateEvent(componentName: string, event): string { .replace(/::_CLASSNAME_::/g, componentName) .replace(/::_EVENT_NAME_::/g, event.name) .replace(/::_DISPATCH_EVENT_NAME_::/g, dispatchEventName) - .replace( - '::_STRUCT_NAME_::', - generateStructName(componentName, [event.name]), - ) + .replace('::_STRUCT_NAME_::', generateEventStructName([event.name])) .replace('::_IMPLEMENTATION_::', implementation); } diff --git a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js index 104d4e9726f..a1d6956f855 100644 --- a/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js +++ b/packages/react-native-codegen/src/generators/components/GenerateEventEmitterH.js @@ -15,7 +15,7 @@ const nullthrows = require('nullthrows'); const { getCppTypeForAnnotation, toSafeCppString, - generateStructName, + generateEventStructName, } = require('./CppHelpers.js'); import type { @@ -55,31 +55,45 @@ namespace react { `; const componentTemplate = ` -::_STRUCTS_:: - class ::_CLASSNAME_::EventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; + ::_STRUCTS_:: + ::_EVENTS_:: }; `.trim(); const structTemplate = ` -struct ::_STRUCT_NAME_:: { - ::_FIELDS_:: -}; + struct ::_STRUCT_NAME_:: { + ::_FIELDS_:: + }; `.trim(); const enumTemplate = `enum class ::_ENUM_NAME_:: { ::_VALUES_:: }; -inline char const *toString(const ::_ENUM_NAME_:: value) { +static char const *toString(const ::_ENUM_NAME_:: value) { switch (value) { ::_TO_CASES_:: } -}`.trim(); +} +`.trim(); + +function indent(nice: string, spaces: number) { + return nice + .split('\n') + .map((line, index) => { + if (line.length === 0 || index === 0) { + return line; + } + const emptySpaces = new Array(spaces + 1).join(' '); + return emptySpaces + line; + }) + .join('\n'); +} function getNativeTypeFromAnnotation( componentName: string, @@ -96,22 +110,16 @@ function getNativeTypeFromAnnotation( case 'FloatTypeAnnotation': return getCppTypeForAnnotation(type); case 'StringEnumTypeAnnotation': - return generateStructName( - componentName, - nameParts.concat([eventProperty.name]), - ); + return generateEventStructName(nameParts.concat([eventProperty.name])); case 'ObjectTypeAnnotation': - return generateStructName( - componentName, - nameParts.concat([eventProperty.name]), - ); + return generateEventStructName(nameParts.concat([eventProperty.name])); default: (type: empty); throw new Error(`Received invalid event property type ${type}`); } } -function generateEnum(structs, componentName, options, nameParts) { - const structName = generateStructName(componentName, nameParts); +function generateEnum(structs, options, nameParts) { + const structName = generateEventStructName(nameParts); const fields = options .map((option, index) => `${toSafeCppString(option.name)}`) .join(',\n '); @@ -141,7 +149,7 @@ function generateStruct( properties: $ReadOnlyArray, ): void { const structNameParts = nameParts; - const structName = generateStructName(componentName, structNameParts); + const structName = generateEventStructName(structNameParts); const fields = properties .map(property => { @@ -171,12 +179,7 @@ function generateStruct( ); return; case 'StringEnumTypeAnnotation': - generateEnum( - structs, - componentName, - property.options, - nameParts.concat([name]), - ); + generateEnum(structs, property.options, nameParts.concat([name])); return; default: (property: empty); @@ -213,7 +216,7 @@ function generateStructs(componentName: string, component): string { function generateEvent(componentName: string, event: EventTypeShape): string { if (event.typeAnnotation.argument) { - const structName = generateStructName(componentName, [event.name]); + const structName = generateEventStructName([event.name]); return `void ${event.name}(${structName} value) const;`; } @@ -261,7 +264,7 @@ module.exports = { .replace(/::_CLASSNAME_::/g, componentName) .replace( '::_STRUCTS_::', - generateStructs(componentName, component), + indent(generateStructs(componentName, component), 2), ) .replace( '::_EVENTS_::', diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterCpp-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterCpp-test.js.snap index 9fa0d8359c3..a13aedb1303 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterCpp-test.js.snap @@ -176,7 +176,7 @@ Map { namespace facebook { namespace react { -void EventsNestedObjectNativeComponentEventEmitter::onChange(EventsNestedObjectNativeComponentOnChangeStruct event) const { +void EventsNestedObjectNativeComponentEventEmitter::onChange(OnChange event) const { dispatchEvent(\\"change\\", [event=std::move(event)](jsi::Runtime &runtime) { auto payload = jsi::Object(runtime); { @@ -217,7 +217,7 @@ Map { namespace facebook { namespace react { -void EventsNativeComponentEventEmitter::onChange(EventsNativeComponentOnChangeStruct event) const { +void EventsNativeComponentEventEmitter::onChange(OnChange event) const { dispatchEvent(\\"change\\", [event=std::move(event)](jsi::Runtime &runtime) { auto payload = jsi::Object(runtime); payload.setProperty(runtime, \\"value\\", event.value); @@ -227,14 +227,14 @@ payload.setProperty(runtime, \\"scale\\", event.scale); return payload; }); } -void EventsNativeComponentEventEmitter::onEventDirect(EventsNativeComponentOnEventDirectStruct event) const { +void EventsNativeComponentEventEmitter::onEventDirect(OnEventDirect event) const { dispatchEvent(\\"eventDirect\\", [event=std::move(event)](jsi::Runtime &runtime) { auto payload = jsi::Object(runtime); payload.setProperty(runtime, \\"value\\", event.value); return payload; }); } -void EventsNativeComponentEventEmitter::onOrientationChange(EventsNativeComponentOnOrientationChangeStruct event) const { +void EventsNativeComponentEventEmitter::onOrientationChange(OnOrientationChange event) const { dispatchEvent(\\"orientationChange\\", [event=std::move(event)](jsi::Runtime &runtime) { auto payload = jsi::Object(runtime); payload.setProperty(runtime, \\"orientation\\", toString(event.orientation)); @@ -266,14 +266,14 @@ Map { namespace facebook { namespace react { -void InterfaceOnlyComponentEventEmitter::onChange(InterfaceOnlyComponentOnChangeStruct event) const { +void InterfaceOnlyComponentEventEmitter::onChange(OnChange event) const { dispatchEvent(\\"change\\", [event=std::move(event)](jsi::Runtime &runtime) { auto payload = jsi::Object(runtime); payload.setProperty(runtime, \\"value\\", event.value); return payload; }); } -void InterfaceOnlyComponentEventEmitter::onDire tChange(InterfaceOnlyComponentOnDire tChangeStruct event) const { +void InterfaceOnlyComponentEventEmitter::onDire tChange(OnDire tChange event) const { dispatchEvent(\\"dire tChange\\", [event=std::move(event)](jsi::Runtime &runtime) { auto payload = jsi::Object(runtime); payload.setProperty(runtime, \\"value\\", event.value); @@ -440,7 +440,7 @@ Map { namespace facebook { namespace react { -void InterfaceOnlyComponentEventEmitter::onChange(InterfaceOnlyComponentOnChangeStruct event) const { +void InterfaceOnlyComponentEventEmitter::onChange(OnChange event) const { dispatchEvent(\\"change\\", [event=std::move(event)](jsi::Runtime &runtime) { auto payload = jsi::Object(runtime); payload.setProperty(runtime, \\"value\\", event.value); diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterH-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterH-test.js.snap index 24434f94dec..6b007623805 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterH-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GenerateEventEmitterH-test.js.snap @@ -184,25 +184,25 @@ Map { namespace facebook { namespace react { -struct EventsNestedObjectNativeComponentOnChangeLocationSourceStruct { - std::string url; -}; - -struct EventsNestedObjectNativeComponentOnChangeLocationStruct { - EventsNestedObjectNativeComponentOnChangeLocationSourceStruct source; - int x; - int y; -}; - -struct EventsNestedObjectNativeComponentOnChangeStruct { - EventsNestedObjectNativeComponentOnChangeLocationStruct location; -}; - class EventsNestedObjectNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; - void onChange(EventsNestedObjectNativeComponentOnChangeStruct value) const; + struct OnChangeLocationSource { + std::string url; + }; + + struct OnChangeLocation { + OnChangeLocationSource source; + int x; + int y; + }; + + struct OnChange { + OnChangeLocation location; + }; + + void onChange(OnChange value) const; }; } // namespace react @@ -227,42 +227,42 @@ Map { namespace facebook { namespace react { -struct EventsNativeComponentOnChangeStruct { - bool value; - std::string source; - int progress; - Float scale; -}; - -struct EventsNativeComponentOnEventDirectStruct { - bool value; -}; - -enum class EventsNativeComponentOnOrientationChangeOrientationStruct { - Landscape, - Portrait -}; - -inline char const *toString(const EventsNativeComponentOnOrientationChangeOrientationStruct value) { - switch (value) { - case EventsNativeComponentOnOrientationChangeOrientationStruct::Landscape: return \\"landscape\\"; - case EventsNativeComponentOnOrientationChangeOrientationStruct::Portrait: return \\"portrait\\"; - } -} - -struct EventsNativeComponentOnOrientationChangeStruct { - EventsNativeComponentOnOrientationChangeOrientationStruct orientation; -}; - class EventsNativeComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; - void onChange(EventsNativeComponentOnChangeStruct value) const; + struct OnChange { + bool value; + std::string source; + int progress; + Float scale; + }; - void onEventDirect(EventsNativeComponentOnEventDirectStruct value) const; + struct OnEventDirect { + bool value; + }; - void onOrientationChange(EventsNativeComponentOnOrientationChangeStruct value) const; + enum class OnOrientationChangeOrientation { + Landscape, + Portrait + }; + + static char const *toString(const OnOrientationChangeOrientation value) { + switch (value) { + case OnOrientationChangeOrientation::Landscape: return \\"landscape\\"; + case OnOrientationChangeOrientation::Portrait: return \\"portrait\\"; + } + } + + struct OnOrientationChange { + OnOrientationChangeOrientation orientation; + }; + + void onChange(OnChange value) const; + + void onEventDirect(OnEventDirect value) const; + + void onOrientationChange(OnOrientationChange value) const; void onEnd() const; }; @@ -289,21 +289,21 @@ Map { namespace facebook { namespace react { -struct InterfaceOnlyComponentOnChangeStruct { - bool value; -}; - -struct InterfaceOnlyComponentOnDire tChangeStruct { - bool value; -}; - class InterfaceOnlyComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; - void onChange(InterfaceOnlyComponentOnChangeStruct value) const; + struct OnChange { + bool value; + }; - void onDire tChange(InterfaceOnlyComponentOnDire tChangeStruct value) const; + struct OnDire tChange { + bool value; + }; + + void onChange(OnChange value) const; + + void onDire tChange(OnDire tChange value) const; }; } // namespace react @@ -472,15 +472,15 @@ Map { namespace facebook { namespace react { -struct InterfaceOnlyComponentOnChangeStruct { - bool value; -}; - class InterfaceOnlyComponentEventEmitter : public ViewEventEmitter { public: using ViewEventEmitter::ViewEventEmitter; - void onChange(InterfaceOnlyComponentOnChangeStruct value) const; + struct OnChange { + bool value; + }; + + void onChange(OnChange value) const; }; } // namespace react