Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
Expand All @@ -12,7 +11,7 @@ @implementation RCTLegacyInteropComponents

+ (NSArray<NSString *> *)legacyInteropComponents
{
return @[ @"RNTMyLegacyNativeView" ];
return @[ @"RNTMyLegacyNativeView", @"RNTMyNativeView" ];
}

@end
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#import <React/RCTAssert.h>
#import <React/RCTConversions.h>
#import <React/RCTLog.h>

#import <butter/map.h>
#import <butter/set.h>
Expand Down Expand Up @@ -105,10 +106,16 @@ - (BOOL)registerComponentIfPossible:(std::string const &)name
return YES;
}

// Paper name: we prepare this variables to warn the user
// when the component is registered in both Fabric and in the
// interop layer, so they can remove that
NSString *componentNameString = RCTNSStringFromString(name);
BOOL isRegisteredInInteropLayer = [RCTLegacyViewManagerInteropComponentView isSupported:componentNameString];

// Fallback 1: Call provider function for component view class.
Class<RCTComponentViewProtocol> klass = RCTComponentViewClassWithName(name.c_str());
if (klass) {
[self registerComponentViewClass:klass];
[self registerComponentViewClass:klass andWarnIfNeeded:isRegisteredInInteropLayer];
return YES;
}

Expand All @@ -119,14 +126,13 @@ - (BOOL)registerComponentIfPossible:(std::string const &)name
NSString *objcName = [NSString stringWithCString:name.c_str() encoding:NSUTF8StringEncoding];
klass = self.thirdPartyFabricComponentsProvider.thirdPartyFabricComponents[objcName];
if (klass) {
[self registerComponentViewClass:klass];
[self registerComponentViewClass:klass andWarnIfNeeded:isRegisteredInInteropLayer];
return YES;
}
}

// Fallback 3: Try to use Paper Interop.
NSString *componentNameString = RCTNSStringFromString(name);
if ([RCTLegacyViewManagerInteropComponentView isSupported:componentNameString]) {
if (isRegisteredInInteropLayer) {
RCTLogNewArchitectureValidation(
RCTNotAllowedInBridgeless,
self,
Expand Down Expand Up @@ -215,4 +221,17 @@ - (RCTComponentViewDescriptor)createComponentViewWithComponentHandle:(facebook::
return _providerRegistry.createComponentDescriptorRegistry(parameters);
}

#pragma mark - Private

- (void)registerComponentViewClass:(Class<RCTComponentViewProtocol>)componentViewClass
andWarnIfNeeded:(BOOL)isRegisteredInInteropLayer
{
[self registerComponentViewClass:componentViewClass];
if (isRegisteredInInteropLayer) {
RCTLogWarn(
@"Component with class %@ has been registered in both the New Architecture Renderer and in the Interop Layer.\nPlease remove it from the Interop Layer",
componentViewClass);
}
}

@end
5 changes: 4 additions & 1 deletion packages/rn-tester/react-native.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,10 @@ module.exports = {
project: {
ios: {
sourceDir: '.',
unstable_reactLegacyComponentNames: ['RNTMyLegacyNativeView'],
unstable_reactLegacyComponentNames: [
'RNTMyLegacyNativeView',
'RNTMyNativeView',
],
},
android: {
sourceDir: '../../',
Expand Down