// Copyright 2018-present 650 Industries. All rights reserved. #import #import #import #import #import @interface EXModuleRegistryAdapter () @property (nonatomic, strong) EXModuleRegistryProvider *moduleRegistryProvider; @property (nonatomic, strong) EXViewManagerAdapterClassesRegistry *viewManagersClassesRegistry; @property (nonatomic, strong, nullable) Class swiftModulesProviderClass; @end @implementation EXModuleRegistryAdapter - (instancetype)initWithModuleRegistryProvider:(EXModuleRegistryProvider *)moduleRegistryProvider { if (self = [super init]) { _moduleRegistryProvider = moduleRegistryProvider; _viewManagersClassesRegistry = [[EXViewManagerAdapterClassesRegistry alloc] init]; } return self; } - (instancetype)initWithModuleRegistryProvider:(EXModuleRegistryProvider *)moduleRegistryProvider swiftModulesProviderClass:(nullable Class)swiftModulesProviderClass { if (self = [self initWithModuleRegistryProvider:moduleRegistryProvider]) { _swiftModulesProviderClass = swiftModulesProviderClass; } return self; } - (NSArray> *)extraModulesForBridge:(RCTBridge *)bridge { return [self extraModulesForModuleRegistry:[_moduleRegistryProvider moduleRegistry]]; } - (NSArray> *)extraModulesForModuleRegistry:(EXModuleRegistry *)moduleRegistry { NSMutableArray> *extraModules = [NSMutableArray array]; EXNativeModulesProxy *nativeModulesProxy = [[EXNativeModulesProxy alloc] initWithModuleRegistry:moduleRegistry swiftModulesProviderClass:_swiftModulesProviderClass]; [extraModules addObject:nativeModulesProxy]; for (EXViewManager *viewManager in [moduleRegistry getAllViewManagers]) { Class viewManagerAdapterClass = [_viewManagersClassesRegistry viewManagerAdapterClassForViewManager:viewManager]; [extraModules addObject:[[viewManagerAdapterClass alloc] initWithViewManager:viewManager]]; } // Silence React Native warning `Base module "%s" does not exist` // occurring when view manager class is subclassing another class // that is not RCTViewManager (in our case all the view manager adapters // subclass EXViewManagerAdapter, so RN expects to find EXViewManagerAdapter // exported. [extraModules addObject:[[EXViewManagerAdapter alloc] init]]; // It is possible that among internal modules there are some RCTBridgeModules -- // let's add them to extraModules here. for (id module in [moduleRegistry getAllInternalModules]) { if ([module conformsToProtocol:@protocol(RCTBridgeModule)]) { id reactBridgeModule = (id)module; [extraModules addObject:reactBridgeModule]; } } // Adding the way to access the module registry from RCTBridgeModules. [extraModules addObject:[[EXModuleRegistryHolderReactModule alloc] initWithModuleRegistry:moduleRegistry]]; // One could add some modules to the Module Registry after creating it. // Here is our last call for finalizing initialization. [moduleRegistry initialize]; return extraModules; } @end