From 3d97bac5f2dfbcf14858cdd470bb10d05b535fc9 Mon Sep 17 00:00:00 2001 From: Nick Lefever Date: Wed, 25 Jun 2025 04:33:12 -0700 Subject: [PATCH] Add codegen for EdgeInset type diffing (#52239) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/52239 Add `toDynamic` conversion function for `EdgeInset` which allowed for removing the custom conversion implemented for the `ViewProps`. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D77234069 fbshipit-source-id: 3aecad8a6d78468f0056167fa1523ccdfb68f369 --- .../src/generators/components/GeneratePropsCpp.js | 4 ++++ .../__snapshots__/GeneratePropsCpp-test.js.snap | 3 +++ .../components/view/HostPlatformViewProps.cpp | 9 --------- .../react/renderer/core/graphicsConversions.h | 11 +++++++++++ 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js index 7d3781aa072..2c8db07a576 100644 --- a/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js +++ b/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js @@ -118,6 +118,10 @@ function generatePropsDiffString( result["${prop.name}"] = toDynamic(${prop.name}); }`; case 'EdgeInsetsPrimitive': + return ` + if (${prop.name} != oldProps->${prop.name}) { + result["${prop.name}"] = toDynamic(${prop.name}); + }`; case 'DimensionPrimitive': // TODO: Implement diffProps for complex types return ''; diff --git a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap index 329e860f568..d55c8bc7279 100644 --- a/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/components/__tests__/__snapshots__/GeneratePropsCpp-test.js.snap @@ -900,6 +900,9 @@ folly::dynamic InsetsPropNativeComponentProps::getDiffProps( } folly::dynamic result = HostPlatformViewProps::getDiffProps(prevProps); + if (contentInset != oldProps->contentInset) { + result[\\"contentInset\\"] = toDynamic(contentInset); + } return result; } #endif diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp index fe5d271f1cc..da9d0904fff 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp @@ -530,15 +530,6 @@ static folly::dynamic toDynamic(const std::vector& filter) { return filterResult; } -static folly::dynamic toDynamic(const EdgeInsets& edgeInsets) { - folly::dynamic edgeInsetsResult = folly::dynamic::object(); - edgeInsetsResult["left"] = edgeInsets.left; - edgeInsetsResult["top"] = edgeInsets.top; - edgeInsetsResult["right"] = edgeInsets.right; - edgeInsetsResult["bottom"] = edgeInsets.bottom; - return edgeInsetsResult; -} - ComponentName HostPlatformViewProps::getDiffPropsImplementationTarget() const { return "View"; } diff --git a/packages/react-native/ReactCommon/react/renderer/core/graphicsConversions.h b/packages/react-native/ReactCommon/react/renderer/core/graphicsConversions.h index 66c2e87405a..2eb9c940201 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/graphicsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/core/graphicsConversions.h @@ -178,6 +178,17 @@ inline void fromRawValue( } } +#ifdef RN_SERIALIZABLE_STATE +inline folly::dynamic toDynamic(const EdgeInsets& edgeInsets) { + folly::dynamic edgeInsetsResult = folly::dynamic::object(); + edgeInsetsResult["left"] = edgeInsets.left; + edgeInsetsResult["top"] = edgeInsets.top; + edgeInsetsResult["right"] = edgeInsets.right; + edgeInsetsResult["bottom"] = edgeInsets.bottom; + return edgeInsetsResult; +} +#endif + inline void fromRawValue( const PropsParserContext& context, const RawValue& value,