diff --git a/CHANGELOG.md b/CHANGELOG.md index b781ca4906..41c9d7145b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,10 @@ - Prevent Sentry's iOS `-force_load` flag from being dropped when another pod sets `OTHER_LDFLAGS[sdk=…]` ([#6801](https://github.com/getsentry/sentry-react-native/pull/6801)) - Fix Android build failing with `cannot find symbol ReplayIntegration` when `sentry-android-replay` is excluded ([#6803](https://github.com/getsentry/sentry-react-native/pull/6803)) - Preserve already-quoted React Native bundle script paths in the Expo iOS plugin ([#6796](https://github.com/getsentry/sentry-react-native/pull/6796)) +- Register the session replay mask components through the iOS codegen component provider ([#6810](https://github.com/getsentry/sentry-react-native/pull/6810)) + - `codegenConfig.ios.componentProvider` now maps `RNSentryReplayMask` and `RNSentryReplayUnmask` to their view classes. + - React Native resolves both components directly. It no longer falls back to the legacy interop layer for view managers, which an app can turn off with `RCT_REMOVE_LEGACY_COMPONENT_INTEROP`. + - Both views now set typed default props. They no longer crash on mount through the provider. ### Dependencies diff --git a/packages/core/ios/Replay/RNSentryReplayMask.mm b/packages/core/ios/Replay/RNSentryReplayMask.mm index 14453e26af..3dad47a7a5 100644 --- a/packages/core/ios/Replay/RNSentryReplayMask.mm +++ b/packages/core/ios/Replay/RNSentryReplayMask.mm @@ -6,6 +6,7 @@ # ifdef RCT_NEW_ARCH_ENABLED # import +# import # import // RCTFabricComponentsPlugins needed for RNSentryReplayMaskCls # import @@ -30,6 +31,17 @@ @interface RNSentryReplayMask () @implementation RNSentryReplayMask # ifdef RCT_NEW_ARCH_ENABLED +// Fabric requires typed default props, or mounting aborts in -updateProps:oldProps:. +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps + = std::make_shared(); + _props = defaultProps; + } + return self; +} + + (facebook::react::ComponentDescriptorProvider)componentDescriptorProvider { return facebook::react::concreteComponentDescriptorProvider< diff --git a/packages/core/ios/Replay/RNSentryReplayUnmask.mm b/packages/core/ios/Replay/RNSentryReplayUnmask.mm index f0ec5139d6..0fc0248157 100644 --- a/packages/core/ios/Replay/RNSentryReplayUnmask.mm +++ b/packages/core/ios/Replay/RNSentryReplayUnmask.mm @@ -6,6 +6,7 @@ # ifdef RCT_NEW_ARCH_ENABLED # import +# import # import // RCTFabricComponentsPlugins needed for RNSentryReplayUnmaskCls # import @@ -30,6 +31,17 @@ @interface RNSentryReplayUnmask () @implementation RNSentryReplayUnmask # ifdef RCT_NEW_ARCH_ENABLED +// Fabric requires typed default props, or mounting aborts in -updateProps:oldProps:. +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps + = std::make_shared(); + _props = defaultProps; + } + return self; +} + + (facebook::react::ComponentDescriptorProvider)componentDescriptorProvider { return facebook::react::concreteComponentDescriptorProvider< diff --git a/packages/core/package.json b/packages/core/package.json index 887e381708..6788febd87 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -144,6 +144,12 @@ "jsSrcsDir": "src", "android": { "javaPackageName": "io.sentry.react" + }, + "ios": { + "componentProvider": { + "RNSentryReplayMask": "RNSentryReplayMask", + "RNSentryReplayUnmask": "RNSentryReplayUnmask" + } } }, "swiftpmConfig": {