1// Copyright 2018-present 650 Industries. All rights reserved. 2 3#import <ExpoModulesCore/EXNativeModulesProxy.h> 4#import <ExpoModulesCore/EXViewManagerAdapter.h> 5#import <ExpoModulesCore/EXModuleRegistryAdapter.h> 6#import <ExpoModulesCore/EXViewManagerAdapterClassesRegistry.h> 7#import <ExpoModulesCore/EXModuleRegistryHolderReactModule.h> 8 9@interface EXModuleRegistryAdapter () 10 11@property (nonatomic, strong) EXModuleRegistryProvider *moduleRegistryProvider; 12@property (nonatomic, strong) EXViewManagerAdapterClassesRegistry *viewManagersClassesRegistry; 13 14@end 15 16@implementation EXModuleRegistryAdapter 17 18- (instancetype)initWithModuleRegistryProvider:(EXModuleRegistryProvider *)moduleRegistryProvider 19{ 20 if (self = [super init]) { 21 _moduleRegistryProvider = moduleRegistryProvider; 22 _viewManagersClassesRegistry = [[EXViewManagerAdapterClassesRegistry alloc] init]; 23 } 24 return self; 25} 26 27- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge 28{ 29 return [self extraModulesForModuleRegistry:[_moduleRegistryProvider moduleRegistry]]; 30} 31 32- (NSArray<id<RCTBridgeModule>> *)extraModulesForModuleRegistry:(EXModuleRegistry *)moduleRegistry 33{ 34 NSMutableArray<id<RCTBridgeModule>> *extraModules = [NSMutableArray array]; 35 36 EXNativeModulesProxy *nativeModulesProxy = [[EXNativeModulesProxy alloc] initWithModuleRegistry:moduleRegistry]; 37 38 [extraModules addObject:nativeModulesProxy]; 39 40 for (EXViewManager *viewManager in [moduleRegistry getAllViewManagers]) { 41 Class viewManagerAdapterClass = [_viewManagersClassesRegistry viewManagerAdapterClassForViewManager:viewManager]; 42 [extraModules addObject:[[viewManagerAdapterClass alloc] initWithViewManager:viewManager]]; 43 } 44 45 // Silence React Native warning `Base module "%s" does not exist` 46 // occurring when view manager class is subclassing another class 47 // that is not RCTViewManager (in our case all the view manager adapters 48 // subclass EXViewManagerAdapter, so RN expects to find EXViewManagerAdapter 49 // exported. 50 [extraModules addObject:[[EXViewManagerAdapter alloc] init]]; 51 52 // It is possible that among internal modules there are some RCTBridgeModules -- 53 // let's add them to extraModules here. 54 for (id<EXInternalModule> module in [moduleRegistry getAllInternalModules]) { 55 if ([module conformsToProtocol:@protocol(RCTBridgeModule)]) { 56 id<RCTBridgeModule> reactBridgeModule = (id<RCTBridgeModule>)module; 57 [extraModules addObject:reactBridgeModule]; 58 } 59 } 60 61 // Adding the way to access the module registry from RCTBridgeModules. 62 [extraModules addObject:[[EXModuleRegistryHolderReactModule alloc] initWithModuleRegistry:moduleRegistry]]; 63 64 // One could add some modules to the Module Registry after creating it. 65 // Here is our last call for finalizing initialization. 66 [moduleRegistry initialize]; 67 return extraModules; 68} 69 70@end 71