1// Copyright © 2018 650 Industries. All rights reserved.
2
3#import "EXScopedModuleRegistry.h"
4
5#import "EXScopedModuleRegistryAdapter.h"
6#import "EXSensorsManagerBinding.h"
7#import "EXConstantsBinding.h"
8#import "EXScopedFileSystemModule.h"
9#import "EXUnversioned.h"
10#import "EXScopedFilePermissionModule.h"
11#import "EXScopedFontLoader.h"
12#import "EXScopedSecureStore.h"
13#import "EXScopedAmplitude.h"
14#import "EXScopedPermissions.h"
15#import "EXScopedSegment.h"
16#import "EXScopedLocalAuthentication.h"
17#import "EXScopedBranch.h"
18#import "EXScopedErrorRecoveryModule.h"
19#import "EXScopedFacebook.h"
20#import "EXScopedFirebaseCore.h"
21#import "EXUpdatesBinding.h"
22
23#import "EXScopedReactNativeAdapter.h"
24#import "EXExpoUserNotificationCenterProxy.h"
25
26#import "EXScopedNotificationsEmitter.h"
27#import "EXScopedNotificationsHandlerModule.h"
28#import "EXScopedNotificationBuilder.h"
29#import "EXScopedNotificationSchedulerModule.h"
30#import "EXScopedNotificationPresentationModule.h"
31#import "EXScopedNotificationCategoriesModule.h"
32#import "EXScopedServerRegistrationModule.h"
33
34#if __has_include(<EXTaskManager/EXTaskManager.h>)
35#import <EXTaskManager/EXTaskManager.h>
36#endif
37
38@implementation EXScopedModuleRegistryAdapter
39
40- (EXModuleRegistry *)moduleRegistryForParams:(NSDictionary *)params
41                  forExperienceStableLegacyId:(NSString *)experienceStableLegacyId
42                                     scopeKey:(NSString *)scopeKey
43                                     manifest:(EXManifestsManifest *)manifest
44                           withKernelServices:(NSDictionary *)kernelServices
45{
46  EXModuleRegistry *moduleRegistry = [self.moduleRegistryProvider moduleRegistry];
47
48#if __has_include(<EXUpdates/EXUpdatesService.h>)
49  EXUpdatesBinding *updatesBinding = [[EXUpdatesBinding alloc] initWithScopeKey:scopeKey
50                                                                     updatesKernelService:kernelServices[EX_UNVERSIONED(@"EXUpdatesManager")]
51                                                                    databaseKernelService:kernelServices[EX_UNVERSIONED(@"EXUpdatesDatabaseManager")]];
52  [moduleRegistry registerInternalModule:updatesBinding];
53#endif
54
55#if __has_include(<EXConstants/EXConstantsService.h>)
56  EXConstantsBinding *constantsBinding = [[EXConstantsBinding alloc] initWithParams:params];
57  [moduleRegistry registerInternalModule:constantsBinding];
58#endif
59
60#if __has_include(<EXFacebook/EXFacebook.h>)
61  // only override in Expo Go
62  if ([params[@"constants"][@"appOwnership"] isEqualToString:@"expo"]) {
63    EXScopedFacebook *scopedFacebook = [[EXScopedFacebook alloc] initWithScopeKey:scopeKey manifest:manifest];
64    [moduleRegistry registerExportedModule:scopedFacebook];
65  }
66#endif
67
68#if __has_include(<EXFileSystem/EXFileSystem.h>)
69  EXScopedFileSystemModule *fileSystemModule;
70  if (params[@"fileSystemDirectories"]) {
71    NSString *documentDirectory = params[@"fileSystemDirectories"][@"documentDirectory"];
72    NSString *cachesDirectory = params[@"fileSystemDirectories"][@"cachesDirectory"];
73    fileSystemModule = [[EXScopedFileSystemModule alloc] initWithDocumentDirectory:documentDirectory
74                                                                   cachesDirectory:cachesDirectory
75                                                                   bundleDirectory:nil];
76  } else {
77    fileSystemModule = [EXScopedFileSystemModule new];
78  }
79  [moduleRegistry registerExportedModule:fileSystemModule];
80  [moduleRegistry registerInternalModule:fileSystemModule];
81#endif
82
83#if __has_include(<EXFont/EXFontLoader.h>)
84  EXScopedFontLoader *fontModule = [[EXScopedFontLoader alloc] init];
85  [moduleRegistry registerExportedModule:fontModule];
86#endif
87
88#if __has_include(<EXSensors/EXSensorsManager.h>)
89  EXSensorsManagerBinding *sensorsManagerBinding = [[EXSensorsManagerBinding alloc] initWithScopeKey:scopeKey andKernelService:kernelServices[EX_UNVERSIONED(@"EXSensorManager")]];
90  [moduleRegistry registerInternalModule:sensorsManagerBinding];
91#endif
92
93  EXScopedReactNativeAdapter *reactNativeAdapter = [[EXScopedReactNativeAdapter alloc] init];
94  [moduleRegistry registerInternalModule:reactNativeAdapter];
95
96  EXExpoUserNotificationCenterProxy *userNotificationCenter = [[EXExpoUserNotificationCenterProxy alloc] initWithUserNotificationCenter:kernelServices[EX_UNVERSIONED(@"EXUserNotificationCenter")]];
97  [moduleRegistry registerInternalModule:userNotificationCenter];
98
99#if __has_include(<EXFileSystem/EXFilePermissionModule.h>)
100  EXScopedFilePermissionModule *filePermissionModule = [[EXScopedFilePermissionModule alloc] init];
101  [moduleRegistry registerInternalModule:filePermissionModule];
102#endif
103
104#if __has_include(<EXSecureStore/EXSecureStore.h>)
105  EXScopedSecureStore *secureStoreModule = [[EXScopedSecureStore alloc] initWithScopeKey:scopeKey andConstantsBinding:constantsBinding];
106  [moduleRegistry registerExportedModule:secureStoreModule];
107#endif
108
109#if __has_include(<EXAmplitude/EXAmplitude.h>)
110  EXScopedAmplitude *amplitudeModule = [[EXScopedAmplitude alloc] initWithScopeKey:scopeKey];
111  [moduleRegistry registerExportedModule:amplitudeModule];
112#endif
113
114#if __has_include(<ExpoModulesCore/EXPermissionsService.h>)
115  EXScopedPermissions *permissionsModule = [[EXScopedPermissions alloc] initWithScopeKey:scopeKey andConstantsBinding:constantsBinding];
116  [moduleRegistry registerExportedModule:permissionsModule];
117  [moduleRegistry registerInternalModule:permissionsModule];
118#endif
119
120#if __has_include(<EXSegment/EXSegment.h>)
121  EXScopedSegment *segmentModule = [[EXScopedSegment alloc] init];
122  [moduleRegistry registerExportedModule:segmentModule];
123#endif
124
125#if __has_include(<EXBranch/RNBranch.h>)
126  EXScopedBranch *branchModule = [[EXScopedBranch alloc] initWithScopeKey:scopeKey];
127  [moduleRegistry registerInternalModule:branchModule];
128#endif
129
130#if __has_include(<EXLocalAuthentication/EXLocalAuthentication.h>)
131  EXScopedLocalAuthentication *localAuthenticationModule = [[EXScopedLocalAuthentication alloc] init];
132  [moduleRegistry registerExportedModule:localAuthenticationModule];
133#endif
134
135#if __has_include(<EXTaskManager/EXTaskManager.h>)
136  // TODO: Make scoped task manager when adding support for bare React Native
137  EXTaskManager *taskManagerModule = [[EXTaskManager alloc] initWithScopeKey:scopeKey];
138  [moduleRegistry registerInternalModule:taskManagerModule];
139  [moduleRegistry registerExportedModule:taskManagerModule];
140#endif
141
142#if __has_include(<EXErrorRecovery/EXErrorRecoveryModule.h>)
143  EXScopedErrorRecoveryModule *errorRecovery = [[EXScopedErrorRecoveryModule alloc] initWithScopeKey:scopeKey];
144  [moduleRegistry registerExportedModule:errorRecovery];
145#endif
146
147#if __has_include(<EXFirebaseCore/EXFirebaseCore.h>)
148  EXScopedFirebaseCore *firebaseCoreModule = [[EXScopedFirebaseCore alloc] initWithScopeKey:scopeKey manifest:manifest constantsBinding:constantsBinding];
149  [moduleRegistry registerExportedModule:firebaseCoreModule];
150  [moduleRegistry registerInternalModule:firebaseCoreModule];
151#endif
152
153#if __has_include(<EXNotifications/EXNotificationsEmitter.h>)
154  // only override in Expo Go
155  if ([params[@"constants"][@"appOwnership"] isEqualToString:@"expo"]) {
156    EXScopedNotificationsEmitter *notificationsEmmitter = [[EXScopedNotificationsEmitter alloc] initWithScopeKey:scopeKey];
157    [moduleRegistry registerExportedModule:notificationsEmmitter];
158  }
159#endif
160
161#if __has_include(<EXNotifications/EXNotificationsHandlerModule.h>)
162  // only override in Expo Go
163  if ([params[@"constants"][@"appOwnership"] isEqualToString:@"expo"]) {
164    EXScopedNotificationsHandlerModule *notificationsHandler = [[EXScopedNotificationsHandlerModule alloc] initWithScopeKey:scopeKey];
165    [moduleRegistry registerExportedModule:notificationsHandler];
166  }
167#endif
168
169#if __has_include(<EXNotifications/EXNotificationsHandlerModule.h>)
170  EXScopedNotificationBuilder *notificationsBuilder = [[EXScopedNotificationBuilder alloc] initWithScopeKey:scopeKey
171                                                                                                  andConstantsBinding:constantsBinding];
172  [moduleRegistry registerInternalModule:notificationsBuilder];
173#endif
174
175#if __has_include(<EXNotifications/EXNotificationSchedulerModule.h>)
176  // only override in Expo Go
177  if ([params[@"constants"][@"appOwnership"] isEqualToString:@"expo"]) {
178    EXScopedNotificationSchedulerModule *schedulerModule = [[EXScopedNotificationSchedulerModule alloc] initWithScopeKey:scopeKey];
179    [moduleRegistry registerExportedModule:schedulerModule];
180  }
181#endif
182
183#if __has_include(<EXNotifications/EXNotificationPresentationModule.h>)
184  // only override in Expo Go
185  if ([params[@"constants"][@"appOwnership"] isEqualToString:@"expo"]) {
186    EXScopedNotificationPresentationModule *notificationPresentationModule = [[EXScopedNotificationPresentationModule alloc] initWithScopeKey:scopeKey];
187    [moduleRegistry registerExportedModule:notificationPresentationModule];
188  }
189#endif
190
191#if __has_include(<EXNotifications/EXNotificationCategoriesModule.h>)
192  // only override in Expo Go
193  if ([params[@"constants"][@"appOwnership"] isEqualToString:@"expo"]) {
194    EXScopedNotificationCategoriesModule *scopedCategoriesModule = [[EXScopedNotificationCategoriesModule alloc] initWithScopeKey:scopeKey];
195    [moduleRegistry registerExportedModule:scopedCategoriesModule];
196  }
197  [EXScopedNotificationCategoriesModule maybeMigrateLegacyCategoryIdentifiersForProjectWithExperienceStableLegacyId:experienceStableLegacyId
198                                                                                                 scopeKey:scopeKey
199                                                                                                         isInExpoGo:[params[@"constants"][@"appOwnership"] isEqualToString:@"expo"]];
200#endif
201
202#if __has_include(<EXNotifications/EXServerRegistrationModule.h>)
203  EXScopedServerRegistrationModule *serverRegistrationModule = [[EXScopedServerRegistrationModule alloc] initWithScopeKey:scopeKey];
204  [moduleRegistry registerExportedModule:serverRegistrationModule];
205#endif
206
207  return moduleRegistry;
208}
209
210@end
211