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