1ea3f1d02STomasz Sapeta// Copyright 2018-present 650 Industries. All rights reserved.
2ea3f1d02STomasz Sapeta
3ea3f1d02STomasz Sapeta#import <ExpoModulesCore/EXNativeModulesProxy.h>
4ea3f1d02STomasz Sapeta#import <ExpoModulesCore/EXModuleRegistryAdapter.h>
5eb2c86e3SCharlie Cruzan#import <ExpoModulesCore/EXModuleRegistryProvider.h>
6ea3f1d02STomasz Sapeta#import <ExpoModulesCore/EXModuleRegistryHolderReactModule.h>
7eb2c86e3SCharlie Cruzan#import <ExpoModulesCore/EXReactNativeEventEmitter.h>
8ea3f1d02STomasz Sapeta
9ea3f1d02STomasz Sapeta@interface EXModuleRegistryAdapter ()
10ea3f1d02STomasz Sapeta
11ea3f1d02STomasz Sapeta@property (nonatomic, strong) EXModuleRegistryProvider *moduleRegistryProvider;
12ea3f1d02STomasz Sapeta
13ea3f1d02STomasz Sapeta@end
14ea3f1d02STomasz Sapeta
15ea3f1d02STomasz Sapeta@implementation EXModuleRegistryAdapter
16ea3f1d02STomasz Sapeta
17*8b02c6d0STomasz Sapeta- (nonnull instancetype)initWithModuleRegistryProvider:(EXModuleRegistryProvider *)moduleRegistryProvider
18ea3f1d02STomasz Sapeta{
19ea3f1d02STomasz Sapeta  if (self = [super init]) {
20ea3f1d02STomasz Sapeta    _moduleRegistryProvider = moduleRegistryProvider;
21ea3f1d02STomasz Sapeta  }
22ea3f1d02STomasz Sapeta  return self;
23ea3f1d02STomasz Sapeta}
24ea3f1d02STomasz Sapeta
25ea3f1d02STomasz Sapeta- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge
26ea3f1d02STomasz Sapeta{
27ea3f1d02STomasz Sapeta  return [self extraModulesForModuleRegistry:[_moduleRegistryProvider moduleRegistry]];
28ea3f1d02STomasz Sapeta}
29ea3f1d02STomasz Sapeta
30ea3f1d02STomasz Sapeta- (NSArray<id<RCTBridgeModule>> *)extraModulesForModuleRegistry:(EXModuleRegistry *)moduleRegistry
31ea3f1d02STomasz Sapeta{
32ea3f1d02STomasz Sapeta  NSMutableArray<id<RCTBridgeModule>> *extraModules = [NSMutableArray array];
33ea3f1d02STomasz Sapeta
344dda5226STomasz Sapeta  EXNativeModulesProxy *nativeModulesProxy = [[EXNativeModulesProxy alloc] initWithModuleRegistry:moduleRegistry];
35ea3f1d02STomasz Sapeta  [extraModules addObject:nativeModulesProxy];
36ea3f1d02STomasz Sapeta
374dda5226STomasz Sapeta  // Event emitter is not automatically registered — we add it to the module registry here.
384dda5226STomasz Sapeta  // It will be added to the bridge later in this method, as it conforms to `RCTBridgeModule`.
394dda5226STomasz Sapeta  EXReactNativeEventEmitter *eventEmitter = [EXReactNativeEventEmitter new];
404dda5226STomasz Sapeta  [moduleRegistry registerInternalModule:eventEmitter];
414dda5226STomasz Sapeta
42ea3f1d02STomasz Sapeta  // It is possible that among internal modules there are some RCTBridgeModules --
43ea3f1d02STomasz Sapeta  // let's add them to extraModules here.
44ea3f1d02STomasz Sapeta  for (id<EXInternalModule> module in [moduleRegistry getAllInternalModules]) {
45ea3f1d02STomasz Sapeta    if ([module conformsToProtocol:@protocol(RCTBridgeModule)]) {
46ea3f1d02STomasz Sapeta      id<RCTBridgeModule> reactBridgeModule = (id<RCTBridgeModule>)module;
47ea3f1d02STomasz Sapeta      [extraModules addObject:reactBridgeModule];
48ea3f1d02STomasz Sapeta    }
49ea3f1d02STomasz Sapeta  }
50ea3f1d02STomasz Sapeta
51ea3f1d02STomasz Sapeta  // Adding the way to access the module registry from RCTBridgeModules.
52ea3f1d02STomasz Sapeta  [extraModules addObject:[[EXModuleRegistryHolderReactModule alloc] initWithModuleRegistry:moduleRegistry]];
53ea3f1d02STomasz Sapeta
54ea3f1d02STomasz Sapeta  // One could add some modules to the Module Registry after creating it.
55ea3f1d02STomasz Sapeta  // Here is our last call for finalizing initialization.
56ea3f1d02STomasz Sapeta  [moduleRegistry initialize];
57ea3f1d02STomasz Sapeta  return extraModules;
58ea3f1d02STomasz Sapeta}
59ea3f1d02STomasz Sapeta
60ea3f1d02STomasz Sapeta@end
61