|
18 | 18 |
|
19 | 19 | namespace facebook::react {
|
20 | 20 |
|
21 |
| -static std::string moduleNameFromComponentName(const std::string &componentName) |
| 21 | +static std::string moduleNameFromComponentNameNoRCTPrefix(const std::string &componentName) |
22 | 22 | {
|
23 | 23 | // TODO: remove FB specific code (T56174424)
|
24 | 24 | if (componentName == "StickerInputView") {
|
|
45 | 45 | return componentName + "Manager";
|
46 | 46 | }
|
47 | 47 |
|
48 |
| - return "RCT" + componentName + "Manager"; |
| 48 | + return componentName + "Manager"; |
49 | 49 | }
|
50 | 50 |
|
51 | 51 | inline NSString *RCTNSStringFromString(const std::string &string)
|
52 | 52 | {
|
53 |
| - return [NSString stringWithCString:string.c_str() encoding:NSUTF8StringEncoding]; |
| 53 | + return [NSString stringWithUTF8String:string.c_str()]; |
| 54 | +} |
| 55 | + |
| 56 | +static Class getViewManagerFromComponentName(const std::string &componentName) |
| 57 | +{ |
| 58 | + auto viewManagerName = moduleNameFromComponentNameNoRCTPrefix(componentName); |
| 59 | + |
| 60 | + // 1. Try to get the manager with the RCT prefix. |
| 61 | + auto rctViewManagerName = "RCT" + viewManagerName; |
| 62 | + Class viewManagerClass = NSClassFromString(RCTNSStringFromString(rctViewManagerName)); |
| 63 | + if (viewManagerClass) { |
| 64 | + return viewManagerClass; |
| 65 | + } |
| 66 | + |
| 67 | + // 2. Try to get the manager without the prefix. |
| 68 | + viewManagerClass = NSClassFromString(RCTNSStringFromString(viewManagerName)); |
| 69 | + if (viewManagerClass) { |
| 70 | + return viewManagerClass; |
| 71 | + } |
| 72 | + |
| 73 | + return nil; |
54 | 74 | }
|
55 | 75 |
|
56 | 76 | static std::shared_ptr<void> const constructCoordinator(
|
57 | 77 | ContextContainer::Shared const &contextContainer,
|
58 | 78 | ComponentDescriptor::Flavor const &flavor)
|
59 | 79 | {
|
60 |
| - auto &componentName = *static_cast<std::string const *>(flavor.get()); |
61 |
| - auto moduleName = moduleNameFromComponentName(componentName); |
62 |
| - Class module = NSClassFromString(RCTNSStringFromString(moduleName)); |
63 |
| - assert(module); |
| 80 | + auto componentName = *std::static_pointer_cast<std::string const>(flavor); |
| 81 | + Class viewManagerClass = getViewManagerFromComponentName(componentName); |
| 82 | + assert(viewManagerClass); |
64 | 83 | auto optionalBridge = contextContainer->find<std::shared_ptr<void>>("Bridge");
|
65 | 84 | RCTBridge *bridge;
|
66 | 85 | if (optionalBridge) {
|
|
79 | 98 | bridgeModuleDecorator = unwrapManagedObject(optionalModuleDecorator.value());
|
80 | 99 | }
|
81 | 100 |
|
82 |
| - RCTComponentData *componentData = [[RCTComponentData alloc] initWithManagerClass:module |
| 101 | + RCTComponentData *componentData = [[RCTComponentData alloc] initWithManagerClass:viewManagerClass |
83 | 102 | bridge:bridge
|
84 | 103 | eventDispatcher:eventDispatcher];
|
85 | 104 | return wrapManagedObject([[RCTLegacyViewManagerInteropCoordinator alloc]
|
|
0 commit comments