diff --git a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm index 9b8e78b2dd6572..745154f5208607 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm +++ b/packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm @@ -19,7 +19,7 @@ namespace facebook { namespace react { -static std::string moduleNameFromComponentName(const std::string &componentName) +static std::string moduleNameFromComponentNameNoRCTPrefix(const std::string &componentName) { // TODO: remove FB specific code (T56174424) if (componentName == "StickerInputView") { @@ -46,12 +46,32 @@ return componentName + "Manager"; } - return "RCT" + componentName + "Manager"; + return componentName + "Manager"; } inline NSString *RCTNSStringFromString(const std::string &string) { - return [NSString stringWithCString:string.c_str() encoding:NSUTF8StringEncoding]; + return [NSString stringWithUTF8String:string.c_str()]; +} + +static Class getViewManagerFromComponentName(const std::string &componentName) +{ + auto viewManagerName = moduleNameFromComponentNameNoRCTPrefix(componentName); + + // 1. Try to get the manager with the RCT prefix. + auto rctViewManagerName = "RCT" + viewManagerName; + Class viewManagerClass = NSClassFromString(RCTNSStringFromString(rctViewManagerName)); + if (viewManagerClass) { + return viewManagerClass; + } + + // 2. Try to get the manager without the prefix. + viewManagerClass = NSClassFromString(RCTNSStringFromString(viewManagerName)); + if (viewManagerClass) { + return viewManagerClass; + } + + return nil; } static std::shared_ptr const constructCoordinator( @@ -59,9 +79,8 @@ ComponentDescriptor::Flavor const &flavor) { auto componentName = *std::static_pointer_cast(flavor); - auto moduleName = moduleNameFromComponentName(componentName); - Class module = NSClassFromString(RCTNSStringFromString(moduleName)); - assert(module); + Class viewManagerClass = getViewManagerFromComponentName(componentName); + assert(viewManagerClass); auto optionalBridge = contextContainer->find>("Bridge"); RCTBridge *bridge; if (optionalBridge) { @@ -80,7 +99,7 @@ bridgeModuleDecorator = unwrapManagedObject(optionalModuleDecorator.value()); } - RCTComponentData *componentData = [[RCTComponentData alloc] initWithManagerClass:module + RCTComponentData *componentData = [[RCTComponentData alloc] initWithManagerClass:viewManagerClass bridge:bridge eventDispatcher:eventDispatcher]; return wrapManagedObject([[RCTLegacyViewManagerInteropCoordinator alloc]