diff --git a/ios/RNFirebase/RNFirebase.m b/ios/RNFirebase/RNFirebase.m index b9c99c9e..6f05d927 100644 --- a/ios/RNFirebase/RNFirebase.m +++ b/ios/RNFirebase/RNFirebase.m @@ -1,4 +1,5 @@ #import "RNFirebase.h" +#import "RNFirebaseUtil.h" #import @implementation RNFirebase @@ -21,14 +22,14 @@ RCT_EXPORT_MODULE(RNFirebase); * @return */ RCT_EXPORT_METHOD(initializeApp: - (NSString *) appName + (NSString *) appDisplayName options: (NSDictionary *) options callback: (RCTResponseSenderBlock) callback) { dispatch_sync(dispatch_get_main_queue(), ^{ - FIRApp *existingApp = [FIRApp appNamed:appName]; + FIRApp *existingApp = [RNFirebaseUtil getApp:appDisplayName]; if (!existingApp) { FIROptions *firOptions = [[FIROptions alloc] initWithGoogleAppID:[options valueForKey:@"appId"] GCMSenderID:[options valueForKey:@"messagingSenderId"]]; @@ -43,6 +44,7 @@ RCT_EXPORT_METHOD(initializeApp: firOptions.deepLinkURLScheme = [options valueForKey:@"deepLinkURLScheme"]; firOptions.bundleID = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"]; + NSString *appName = [RNFirebaseUtil getAppName:appDisplayName]; [FIRApp configureWithName:appName options:firOptions]; } @@ -55,13 +57,13 @@ RCT_EXPORT_METHOD(initializeApp: * @return */ RCT_EXPORT_METHOD(deleteApp: - (NSString *) appName + (NSString *) appDisplayName resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *existingApp = [FIRApp appNamed:appName]; + FIRApp *existingApp = [RNFirebaseUtil getApp:appDisplayName]; if (!existingApp) { return resolve([NSNull null]); @@ -90,7 +92,7 @@ RCT_EXPORT_METHOD(deleteApp: NSMutableDictionary *appOptions = [NSMutableDictionary new]; FIRApp *firApp = firApps[key]; FIROptions *firOptions = [firApp options]; - appOptions[@"name"] = firApp.name; + appOptions[@"name"] = [RNFirebaseUtil getAppDisplayName:firApp.name]; appOptions[@"apiKey"] = firOptions.APIKey; appOptions[@"appId"] = firOptions.googleAppID; appOptions[@"databaseURL"] = firOptions.databaseURL; diff --git a/ios/RNFirebase/RNFirebaseUtil.h b/ios/RNFirebase/RNFirebaseUtil.h index ab0ef52d..8191c387 100644 --- a/ios/RNFirebase/RNFirebaseUtil.h +++ b/ios/RNFirebase/RNFirebaseUtil.h @@ -3,11 +3,15 @@ #import #import +#import @interface RNFirebaseUtil : NSObject ++ (FIRApp *)getApp:(NSString *)appDisplayName; ++ (NSString *)getAppName:(NSString *)appDisplayName; ++ (NSString *)getAppDisplayName:(NSString *)appName; + (void)sendJSEvent:(RCTEventEmitter *)emitter name:(NSString *)name body:(NSDictionary *)body; -+ (void)sendJSEventWithAppName:(RCTEventEmitter *)emitter appName:(NSString *)appName name:(NSString *)name body:(NSDictionary *)body; ++ (void)sendJSEventWithAppName:(RCTEventEmitter *)emitter app:(FIRApp *)app name:(NSString *)name body:(NSDictionary *)body; @end diff --git a/ios/RNFirebase/RNFirebaseUtil.m b/ios/RNFirebase/RNFirebaseUtil.m index 898e31cb..c97bb636 100644 --- a/ios/RNFirebase/RNFirebaseUtil.m +++ b/ios/RNFirebase/RNFirebaseUtil.m @@ -2,6 +2,28 @@ @implementation RNFirebaseUtil +static NSString *const DEFAULT_APP_DISPLAY_NAME = @"[DEFAULT]"; +static NSString *const DEFAULT_APP_NAME = @"__FIRAPP_DEFAULT"; + ++ (FIRApp *)getApp:(NSString *)appDisplayName { + NSString *appName = [RNFirebaseUtil getAppName:appDisplayName]; + return [FIRApp appNamed:appName]; +} + ++ (NSString *)getAppName:(NSString *)appDisplayName { + if ([appDisplayName isEqualToString:DEFAULT_APP_DISPLAY_NAME]) { + return DEFAULT_APP_NAME; + } + return appDisplayName; +} + ++ (NSString *)getAppDisplayName:(NSString *)appName { + if ([appName isEqualToString:DEFAULT_APP_NAME]) { + return DEFAULT_APP_DISPLAY_NAME; + } + return appName; +} + + (void)sendJSEvent:(RCTEventEmitter *)emitter name:(NSString *)name body:(NSDictionary *)body { @try { // TODO: Temporary fix for https://github.com/invertase/react-native-firebase/issues/233 @@ -14,10 +36,10 @@ } } -+ (void)sendJSEventWithAppName:(RCTEventEmitter *)emitter appName:(NSString *)appName name:(NSString *)name body:(NSDictionary *)body { ++ (void)sendJSEventWithAppName:(RCTEventEmitter *)emitter app:(FIRApp *)app name:(NSString *)name body:(NSDictionary *)body { // Add the appName to the body NSMutableDictionary *newBody = [body mutableCopy]; - newBody[@"appName"] = appName; + newBody[@"appName"] = [RNFirebaseUtil getAppDisplayName:app.name]; [RNFirebaseUtil sendJSEvent:emitter name:name body:newBody]; } diff --git a/ios/RNFirebase/auth/RNFirebaseAuth.m b/ios/RNFirebase/auth/RNFirebaseAuth.m index 191d6330..576e8c3b 100644 --- a/ios/RNFirebase/auth/RNFirebaseAuth.m +++ b/ios/RNFirebase/auth/RNFirebaseAuth.m @@ -23,19 +23,19 @@ RCT_EXPORT_MODULE(); */ RCT_EXPORT_METHOD(addAuthStateListener: - (NSString *) appName) { + (NSString *) appDisplayName) { + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; - if (![_authStateHandlers valueForKey:appName]) { - FIRApp *firApp = [FIRApp appNamed:appName]; + if (![_authStateHandlers valueForKey:firApp.name]) { FIRAuthStateDidChangeListenerHandle newListenerHandle = [[FIRAuth authWithApp:firApp] addAuthStateDidChangeListener:^(FIRAuth *_Nonnull auth, FIRUser *_Nullable user) { if (user != nil) { - [RNFirebaseUtil sendJSEventWithAppName:self appName:appName name:AUTH_CHANGED_EVENT body:@{@"authenticated": @(true), @"user": [self firebaseUserToDict:user]}]; + [RNFirebaseUtil sendJSEventWithAppName:self app:firApp name:AUTH_CHANGED_EVENT body:@{@"authenticated": @(true), @"user": [self firebaseUserToDict:user]}]; } else { - [RNFirebaseUtil sendJSEventWithAppName:self appName:appName name:AUTH_CHANGED_EVENT body:@{@"authenticated": @(false)}]; + [RNFirebaseUtil sendJSEventWithAppName:self app:firApp name:AUTH_CHANGED_EVENT body:@{@"authenticated": @(false)}]; } }]; - _authStateHandlers[appName] = [NSValue valueWithNonretainedObject:newListenerHandle]; + _authStateHandlers[firApp.name] = [NSValue valueWithNonretainedObject:newListenerHandle]; } } @@ -44,12 +44,12 @@ RCT_EXPORT_METHOD(addAuthStateListener: */ RCT_EXPORT_METHOD(removeAuthStateListener: - (NSString *) appName) { + (NSString *) appDisplayName) { + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; - if ([_authStateHandlers valueForKey:appName]) { - FIRApp *firApp = [FIRApp appNamed:appName]; - [[FIRAuth authWithApp:firApp] removeAuthStateDidChangeListener:[_authStateHandlers valueForKey:appName]]; - [_authStateHandlers removeObjectForKey:appName]; + if ([_authStateHandlers valueForKey:firApp.name]) { + [[FIRAuth authWithApp:firApp] removeAuthStateDidChangeListener:[_authStateHandlers valueForKey:firApp.name]]; + [_authStateHandlers removeObjectForKey:firApp.name]; } } @@ -58,19 +58,19 @@ RCT_EXPORT_METHOD(removeAuthStateListener: */ RCT_EXPORT_METHOD(addIdTokenListener: - (NSString *) appName) { + (NSString *) appDisplayName) { + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; - if (![_idTokenHandlers valueForKey:appName]) { - FIRApp *firApp = [FIRApp appNamed:appName]; + if (![_idTokenHandlers valueForKey:firApp.name]) { FIRIDTokenDidChangeListenerHandle newListenerHandle = [[FIRAuth authWithApp:firApp] addIDTokenDidChangeListener:^(FIRAuth * _Nonnull auth, FIRUser * _Nullable user) { if (user != nil) { - [RNFirebaseUtil sendJSEventWithAppName:self appName:appName name:AUTH_ID_TOKEN_CHANGED_EVENT body:@{@"authenticated": @(true), @"user": [self firebaseUserToDict:user]}]; + [RNFirebaseUtil sendJSEventWithAppName:self app:firApp name:AUTH_ID_TOKEN_CHANGED_EVENT body:@{@"authenticated": @(true), @"user": [self firebaseUserToDict:user]}]; } else { - [RNFirebaseUtil sendJSEventWithAppName:self appName:appName name:AUTH_ID_TOKEN_CHANGED_EVENT body:@{@"authenticated": @(false)}]; + [RNFirebaseUtil sendJSEventWithAppName:self app:firApp name:AUTH_ID_TOKEN_CHANGED_EVENT body:@{@"authenticated": @(false)}]; } }]; - _idTokenHandlers[appName] = [NSValue valueWithNonretainedObject:newListenerHandle]; + _idTokenHandlers[firApp.name] = [NSValue valueWithNonretainedObject:newListenerHandle]; } } @@ -79,11 +79,12 @@ RCT_EXPORT_METHOD(addIdTokenListener: */ RCT_EXPORT_METHOD(removeIdTokenListener: - (NSString *) appName) { - if ([_idTokenHandlers valueForKey:appName]) { - FIRApp *firApp = [FIRApp appNamed:appName]; - [[FIRAuth authWithApp:firApp] removeIDTokenDidChangeListener:[_idTokenHandlers valueForKey:appName]]; - [_idTokenHandlers removeObjectForKey:appName]; + (NSString *) appDisplayName) { + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; + + if ([_idTokenHandlers valueForKey:firApp.name]) { + [[FIRAuth authWithApp:firApp] removeIDTokenDidChangeListener:[_idTokenHandlers valueForKey:firApp.name]]; + [_idTokenHandlers removeObjectForKey:firApp.name]; } } @@ -97,12 +98,12 @@ RCT_EXPORT_METHOD(removeIdTokenListener: @return */ RCT_EXPORT_METHOD(signOut: - (NSString *) appName + (NSString *) appDisplayName resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; FIRUser *user = [FIRAuth authWithApp:firApp].currentUser; @@ -125,12 +126,12 @@ RCT_EXPORT_METHOD(signOut: @return */ RCT_EXPORT_METHOD(signInAnonymously: - (NSString *) appName + (NSString *) appDisplayName resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; [[FIRAuth authWithApp:firApp] signInAnonymouslyWithCompletion:^(FIRUser *user, NSError *error) { if (error) { @@ -152,7 +153,7 @@ RCT_EXPORT_METHOD(signInAnonymously: @return return */ RCT_EXPORT_METHOD(signInWithEmailAndPassword: - (NSString *) appName + (NSString *) appDisplayName email: (NSString *) email pass: @@ -161,7 +162,7 @@ RCT_EXPORT_METHOD(signInWithEmailAndPassword: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; [[FIRAuth authWithApp:firApp] signInWithEmail:email password:password completion:^(FIRUser *user, NSError *error) { if (error) { @@ -182,7 +183,7 @@ RCT_EXPORT_METHOD(signInWithEmailAndPassword: @return return */ RCT_EXPORT_METHOD(createUserWithEmailAndPassword: - (NSString *) appName + (NSString *) appDisplayName email: (NSString *) email pass: @@ -191,7 +192,7 @@ RCT_EXPORT_METHOD(createUserWithEmailAndPassword: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; [[FIRAuth authWithApp:firApp] createUserWithEmail:email password:password completion:^(FIRUser *user, NSError *error) { if (error) { @@ -210,12 +211,12 @@ RCT_EXPORT_METHOD(createUserWithEmailAndPassword: @return return */ RCT_EXPORT_METHOD(delete: - (NSString *) appName + (NSString *) appDisplayName resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; FIRUser *user = [FIRAuth authWithApp:firApp].currentUser; if (user) { @@ -239,12 +240,12 @@ RCT_EXPORT_METHOD(delete: @return return */ RCT_EXPORT_METHOD(reload: - (NSString *) appName + (NSString *) appDisplayName resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; FIRUser *user = [FIRAuth authWithApp:firApp].currentUser; @@ -262,11 +263,11 @@ RCT_EXPORT_METHOD(reload: @param RCTPromiseRejectBlock reject @return return */ -RCT_EXPORT_METHOD(sendEmailVerification:(NSString *) appName +RCT_EXPORT_METHOD(sendEmailVerification:(NSString *) appDisplayName actionCodeSettings:(NSDictionary *) actionCodeSettings resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; FIRUser *user = [FIRAuth authWithApp:firApp].currentUser; if (user) { @@ -298,14 +299,14 @@ RCT_EXPORT_METHOD(sendEmailVerification:(NSString *) appName @return return */ RCT_EXPORT_METHOD(updateEmail: - (NSString *) appName + (NSString *) appDisplayName email: (NSString *) email resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; FIRUser *user = [FIRAuth authWithApp:firApp].currentUser; if (user) { @@ -330,14 +331,14 @@ RCT_EXPORT_METHOD(updateEmail: @return return */ RCT_EXPORT_METHOD(updatePassword: - (NSString *) appName + (NSString *) appDisplayName password: (NSString *) password resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; FIRUser *user = [FIRAuth authWithApp:firApp].currentUser; @@ -364,14 +365,14 @@ RCT_EXPORT_METHOD(updatePassword: @return return */ RCT_EXPORT_METHOD(updateProfile: - (NSString *) appName + (NSString *) appDisplayName props: (NSDictionary *) props resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; FIRUser *user = [FIRAuth authWithApp:firApp].currentUser; @@ -412,14 +413,14 @@ RCT_EXPORT_METHOD(updateProfile: @return */ RCT_EXPORT_METHOD(getToken: - (NSString *) appName + (NSString *) appDisplayName forceRefresh: (BOOL) forceRefresh resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; FIRUser *user = [FIRAuth authWithApp:firApp].currentUser; @@ -447,7 +448,7 @@ RCT_EXPORT_METHOD(getToken: @return */ RCT_EXPORT_METHOD(signInWithCredential: - (NSString *) appName + (NSString *) appDisplayName provider: (NSString *) provider token: @@ -458,7 +459,7 @@ RCT_EXPORT_METHOD(signInWithCredential: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; FIRAuthCredential *credential = [self getCredentialForProvider:provider token:authToken secret:authSecret]; @@ -485,7 +486,7 @@ RCT_EXPORT_METHOD(signInWithCredential: @return */ RCT_EXPORT_METHOD(confirmPasswordReset: - (NSString *) appName + (NSString *) appDisplayName code: (NSString *) code newPassword: @@ -494,8 +495,8 @@ RCT_EXPORT_METHOD(confirmPasswordReset: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; - + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; + [[FIRAuth authWithApp:firApp] confirmPasswordResetWithCode:code newPassword:newPassword completion:^(NSError *_Nullable error) { if (error) { [self promiseRejectAuthException:reject error:error]; @@ -515,15 +516,15 @@ RCT_EXPORT_METHOD(confirmPasswordReset: * @return */ RCT_EXPORT_METHOD(applyActionCode: - (NSString *) appName + (NSString *) appDisplayName code: (NSString *) code resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; - + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; + [[FIRAuth authWithApp:firApp] applyActionCode:code completion:^(NSError *_Nullable error) { if (error) { [self promiseRejectAuthException:reject error:error]; @@ -542,15 +543,15 @@ RCT_EXPORT_METHOD(applyActionCode: * @return */ RCT_EXPORT_METHOD(checkActionCode: - (NSString *) appName + (NSString *) appDisplayName code: (NSString *) code resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; - + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; + [[FIRAuth authWithApp:firApp] checkActionCode:code completion:^(FIRActionCodeInfo *_Nullable info, NSError *_Nullable error) { if (error) { [self promiseRejectAuthException:reject error:error]; @@ -586,12 +587,12 @@ RCT_EXPORT_METHOD(checkActionCode: @param RCTPromiseRejectBlock reject @return */ -RCT_EXPORT_METHOD(sendPasswordResetEmail:(NSString *) appName +RCT_EXPORT_METHOD(sendPasswordResetEmail:(NSString *) appDisplayName email:(NSString *) email actionCodeSettings:(NSDictionary *) actionCodeSettings resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; id handler = ^(NSError *_Nullable error) { if (error) { @@ -600,7 +601,7 @@ RCT_EXPORT_METHOD(sendPasswordResetEmail:(NSString *) appName [self promiseNoUser:resolve rejecter:reject isError:NO]; } }; - + if (actionCodeSettings) { FIRActionCodeSettings *settings = [self buildActionCodeSettings:actionCodeSettings]; [[FIRAuth authWithApp:firApp] sendPasswordResetWithEmail:email actionCodeSettings:settings completion:handler]; @@ -617,12 +618,12 @@ RCT_EXPORT_METHOD(sendPasswordResetEmail:(NSString *) appName @return */ RCT_EXPORT_METHOD(getCurrentUser: - (NSString *) appName + (NSString *) appDisplayName resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; FIRUser *user = [FIRAuth authWithApp:firApp].currentUser; [self promiseWithUser:resolve rejecter:reject user:user]; @@ -637,14 +638,14 @@ RCT_EXPORT_METHOD(getCurrentUser: @return */ RCT_EXPORT_METHOD(signInWithCustomToken: - (NSString *) appName + (NSString *) appDisplayName customToken: (NSString *) customToken resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; [[FIRAuth authWithApp:firApp] signInWithCustomToken:customToken completion:^(FIRUser *user, NSError *error) { if (error) { @@ -663,11 +664,11 @@ RCT_EXPORT_METHOD(signInWithCustomToken: @param RCTPromiseRejectBlock reject @return */ -RCT_EXPORT_METHOD(signInWithPhoneNumber:(NSString *) appName +RCT_EXPORT_METHOD(signInWithPhoneNumber:(NSString *) appDisplayName phoneNumber:(NSString *) phoneNumber resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; [[FIRPhoneAuthProvider providerWithAuth:[FIRAuth authWithApp:firApp]] verifyPhoneNumber:phoneNumber UIDelegate:nil completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) { if (error) { @@ -684,17 +685,17 @@ RCT_EXPORT_METHOD(signInWithPhoneNumber:(NSString *) appName /** verifyPhoneNumber - + @param string phoneNumber @param RCTPromiseResolveBlock resolve @param RCTPromiseRejectBlock reject @return */ -RCT_EXPORT_METHOD(verifyPhoneNumber:(NSString *) appName +RCT_EXPORT_METHOD(verifyPhoneNumber:(NSString *) appDisplayName phoneNumber:(NSString *) phoneNumber requestKey:(NSString *) requestKey) { - FIRApp *firApp = [FIRApp appNamed:appName]; - + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; + [[FIRPhoneAuthProvider providerWithAuth:[FIRAuth authWithApp:firApp]] verifyPhoneNumber:phoneNumber UIDelegate:nil completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) { if (error) { NSDictionary * jsError = [self getJSError:(error)]; @@ -703,7 +704,7 @@ RCT_EXPORT_METHOD(verifyPhoneNumber:(NSString *) appName @"requestKey":requestKey, @"state": @{@"error": jsError}, }; - [RNFirebaseUtil sendJSEventWithAppName:self appName:appName name:PHONE_AUTH_STATE_CHANGED_EVENT body:body]; + [RNFirebaseUtil sendJSEventWithAppName:self app:firApp name:PHONE_AUTH_STATE_CHANGED_EVENT body:body]; } else { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:verificationID forKey:@"authVerificationID"]; @@ -712,16 +713,16 @@ RCT_EXPORT_METHOD(verifyPhoneNumber:(NSString *) appName @"requestKey":requestKey, @"state": @{@"verificationId": verificationID}, }; - [RNFirebaseUtil sendJSEventWithAppName:self appName:appName name:PHONE_AUTH_STATE_CHANGED_EVENT body:body]; + [RNFirebaseUtil sendJSEventWithAppName:self app:firApp name:PHONE_AUTH_STATE_CHANGED_EVENT body:body]; } }]; } -RCT_EXPORT_METHOD(_confirmVerificationCode:(NSString *) appName +RCT_EXPORT_METHOD(_confirmVerificationCode:(NSString *) appDisplayName verificationCode:(NSString *) verificationCode resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *verificationId = [defaults stringForKey:@"authVerificationID"]; FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationId verificationCode:verificationCode]; @@ -746,7 +747,7 @@ RCT_EXPORT_METHOD(_confirmVerificationCode:(NSString *) appName @return */ RCT_EXPORT_METHOD(link: - (NSString *) appName + (NSString *) appDisplayName provider: (NSString *) provider authToken: @@ -757,7 +758,7 @@ RCT_EXPORT_METHOD(link: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; FIRAuthCredential *credential = [self getCredentialForProvider:provider token:authToken secret:authSecret]; @@ -791,14 +792,14 @@ RCT_EXPORT_METHOD(link: @return */ RCT_EXPORT_METHOD(unlink: - (NSString *) appName + (NSString *) appDisplayName providerId: (NSString *) providerId resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; FIRUser *user = [FIRAuth authWithApp:firApp].currentUser; if (user) { @@ -825,7 +826,7 @@ RCT_EXPORT_METHOD(unlink: @return */ RCT_EXPORT_METHOD(reauthenticate: - (NSString *) appName + (NSString *) appDisplayName provider: (NSString *) provider authToken: @@ -836,7 +837,7 @@ RCT_EXPORT_METHOD(reauthenticate: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; FIRAuthCredential *credential = [self getCredentialForProvider:provider token:authToken secret:authSecret]; @@ -869,14 +870,14 @@ RCT_EXPORT_METHOD(reauthenticate: @return */ RCT_EXPORT_METHOD(fetchProvidersForEmail: - (NSString *) appName + (NSString *) appDisplayName email: (NSString *) email resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject) { - FIRApp *firApp = [FIRApp appNamed:appName]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; [[FIRAuth authWithApp:firApp] fetchProvidersForEmail:email completion:^(NSArray *_Nullable providers, NSError *_Nullable error) { if (error) { @@ -962,14 +963,14 @@ RCT_EXPORT_METHOD(fetchProvidersForEmail: /** Reject a promise with an auth exception - + @param error NSError */ - (NSDictionary *)getJSError:(NSError *)error { NSString *code = @"auth/unknown"; NSString *message = [error localizedDescription]; NSString *nativeErrorMessage = [error localizedDescription]; - + switch (error.code) { case FIRAuthErrorCodeInvalidCustomToken: code = @"auth/invalid-custom-token"; @@ -1043,7 +1044,7 @@ RCT_EXPORT_METHOD(fetchProvidersForEmail: code = @"auth/internal-error"; message = @"An internal error has occurred, please try again."; break; - + // unsure of the below codes so leaving them as the default error message case FIRAuthErrorCodeTooManyRequests: code = @"auth/too-many-requests"; @@ -1078,7 +1079,7 @@ RCT_EXPORT_METHOD(fetchProvidersForEmail: default: break; } - + return @{ @"code": code, @"message": message, diff --git a/ios/RNFirebase/database/RNFirebaseDatabase.h b/ios/RNFirebase/database/RNFirebaseDatabase.h index 6991c4cc..e88d5b5a 100644 --- a/ios/RNFirebase/database/RNFirebaseDatabase.h +++ b/ios/RNFirebase/database/RNFirebaseDatabase.h @@ -16,7 +16,7 @@ + (void)handlePromise:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject databaseError:(NSError *)databaseError; -+ (FIRDatabase *)getDatabaseForApp:(NSString *)appName; ++ (FIRDatabase *)getDatabaseForApp:(NSString *)appDisplayName; + (NSDictionary *)getJSError:(NSError *)nativeError; diff --git a/ios/RNFirebase/database/RNFirebaseDatabase.m b/ios/RNFirebase/database/RNFirebaseDatabase.m index 30d6dedd..69a235fb 100644 --- a/ios/RNFirebase/database/RNFirebaseDatabase.m +++ b/ios/RNFirebase/database/RNFirebaseDatabase.m @@ -22,38 +22,38 @@ RCT_EXPORT_MODULE(); return self; } -RCT_EXPORT_METHOD(goOnline:(NSString *) appName) { - [[RNFirebaseDatabase getDatabaseForApp:appName] goOnline]; +RCT_EXPORT_METHOD(goOnline:(NSString *) appDisplayName) { + [[RNFirebaseDatabase getDatabaseForApp:appDisplayName] goOnline]; } -RCT_EXPORT_METHOD(goOffline:(NSString *) appName) { - [[RNFirebaseDatabase getDatabaseForApp:appName] goOffline]; +RCT_EXPORT_METHOD(goOffline:(NSString *) appDisplayName) { + [[RNFirebaseDatabase getDatabaseForApp:appDisplayName] goOffline]; } -RCT_EXPORT_METHOD(setPersistence:(NSString *) appName +RCT_EXPORT_METHOD(setPersistence:(NSString *) appDisplayName state:(BOOL) state) { - [RNFirebaseDatabase getDatabaseForApp:appName].persistenceEnabled = state; + [RNFirebaseDatabase getDatabaseForApp:appDisplayName].persistenceEnabled = state; } -RCT_EXPORT_METHOD(setPersistenceCacheSizeBytes:(NSString *) appName +RCT_EXPORT_METHOD(setPersistenceCacheSizeBytes:(NSString *) appDisplayName size:(NSInteger *) size) { - [RNFirebaseDatabase getDatabaseForApp:appName].persistenceCacheSizeBytes = (NSUInteger)size; + [RNFirebaseDatabase getDatabaseForApp:appDisplayName].persistenceCacheSizeBytes = (NSUInteger)size; } RCT_EXPORT_METHOD(enableLogging:(BOOL) enabled) { [FIRDatabase setLoggingEnabled:enabled]; } -RCT_EXPORT_METHOD(keepSynced:(NSString *) appName +RCT_EXPORT_METHOD(keepSynced:(NSString *) appDisplayName key:(NSString *) key path:(NSString *) path modifiers:(NSArray *) modifiers state:(BOOL) state) { - FIRDatabaseQuery *query = [self getInternalReferenceForApp:appName key:key path:path modifiers:modifiers].query; + FIRDatabaseQuery *query = [self getInternalReferenceForApp:appDisplayName key:key path:path modifiers:modifiers].query; [query keepSynced:state]; } -RCT_EXPORT_METHOD(transactionTryCommit:(NSString *) appName +RCT_EXPORT_METHOD(transactionTryCommit:(NSString *) appDisplayName transactionId:(nonnull NSNumber *) transactionId updates:(NSDictionary *) updates) { __block NSMutableDictionary *transactionState; @@ -82,7 +82,7 @@ RCT_EXPORT_METHOD(transactionTryCommit:(NSString *) appName } -RCT_EXPORT_METHOD(transactionStart:(NSString *) appName +RCT_EXPORT_METHOD(transactionStart:(NSString *) appDisplayName path:(NSString *) path transactionId:(nonnull NSNumber *) transactionId applyLocally:(BOOL) applyLocally) { @@ -90,13 +90,13 @@ RCT_EXPORT_METHOD(transactionStart:(NSString *) appName NSMutableDictionary *transactionState = [NSMutableDictionary new]; dispatch_semaphore_t sema = dispatch_semaphore_create(0); transactionState[@"semaphore"] = sema; - FIRDatabaseReference *ref = [self getReferenceForAppPath:appName path:path]; + FIRDatabaseReference *ref = [self getReferenceForAppPath:appDisplayName path:path]; [ref runTransactionBlock:^FIRTransactionResult * _Nonnull(FIRMutableData * _Nonnull currentData) { dispatch_barrier_async(_transactionQueue, ^{ [_transactions setValue:transactionState forKey:transactionId]; - NSDictionary *updateMap = [self createTransactionUpdateMap:appName transactionId:transactionId updatesData:currentData]; + NSDictionary *updateMap = [self createTransactionUpdateMap:appDisplayName transactionId:transactionId updatesData:currentData]; [RNFirebaseUtil sendJSEvent:self name:DATABASE_TRANSACTION_EVENT body:updateMap]; }); @@ -123,7 +123,7 @@ RCT_EXPORT_METHOD(transactionStart:(NSString *) appName } andCompletionBlock: ^(NSError *_Nullable databaseError, BOOL committed, FIRDataSnapshot *_Nullable snapshot) { - NSDictionary *resultMap = [self createTransactionResultMap:appName transactionId:transactionId error:databaseError committed:committed snapshot:snapshot]; + NSDictionary *resultMap = [self createTransactionResultMap:appDisplayName transactionId:transactionId error:databaseError committed:committed snapshot:snapshot]; [RNFirebaseUtil sendJSEvent:self name:DATABASE_TRANSACTION_EVENT body:resultMap]; } withLocalEvents: @@ -131,117 +131,117 @@ RCT_EXPORT_METHOD(transactionStart:(NSString *) appName }); } -RCT_EXPORT_METHOD(onDisconnectSet:(NSString *) appName +RCT_EXPORT_METHOD(onDisconnectSet:(NSString *) appDisplayName path:(NSString *) path props:(NSDictionary *) props resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRDatabaseReference *ref = [self getReferenceForAppPath:appName path:path]; + FIRDatabaseReference *ref = [self getReferenceForAppPath:appDisplayName path:path]; [ref onDisconnectSetValue:props[@"value"] withCompletionBlock:^(NSError *_Nullable error, FIRDatabaseReference *_Nonnull _ref) { [RNFirebaseDatabase handlePromise:resolve rejecter:reject databaseError:error]; }]; } -RCT_EXPORT_METHOD(onDisconnectUpdate:(NSString *) appName +RCT_EXPORT_METHOD(onDisconnectUpdate:(NSString *) appDisplayName path:(NSString *) path props:(NSDictionary *) props resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRDatabaseReference *ref = [self getReferenceForAppPath:appName path:path]; + FIRDatabaseReference *ref = [self getReferenceForAppPath:appDisplayName path:path]; [ref onDisconnectUpdateChildValues:props withCompletionBlock:^(NSError *_Nullable error, FIRDatabaseReference *_Nonnull _ref) { [RNFirebaseDatabase handlePromise:resolve rejecter:reject databaseError:error]; }]; } -RCT_EXPORT_METHOD(onDisconnectRemove:(NSString *) appName +RCT_EXPORT_METHOD(onDisconnectRemove:(NSString *) appDisplayName path:(NSString *) path resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRDatabaseReference *ref = [self getReferenceForAppPath:appName path:path]; + FIRDatabaseReference *ref = [self getReferenceForAppPath:appDisplayName path:path]; [ref onDisconnectRemoveValueWithCompletionBlock:^(NSError *_Nullable error, FIRDatabaseReference *_Nonnull _ref) { [RNFirebaseDatabase handlePromise:resolve rejecter:reject databaseError:error]; }]; } -RCT_EXPORT_METHOD(onDisconnectCancel:(NSString *) appName +RCT_EXPORT_METHOD(onDisconnectCancel:(NSString *) appDisplayName path:(NSString *) path resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRDatabaseReference *ref = [self getReferenceForAppPath:appName path:path]; + FIRDatabaseReference *ref = [self getReferenceForAppPath:appDisplayName path:path]; [ref cancelDisconnectOperationsWithCompletionBlock:^(NSError *_Nullable error, FIRDatabaseReference *_Nonnull _ref) { [RNFirebaseDatabase handlePromise:resolve rejecter:reject databaseError:error]; }]; } -RCT_EXPORT_METHOD(set:(NSString *) appName +RCT_EXPORT_METHOD(set:(NSString *) appDisplayName path:(NSString *) path props:(NSDictionary *) props resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRDatabaseReference *ref = [self getReferenceForAppPath:appName path:path]; + FIRDatabaseReference *ref = [self getReferenceForAppPath:appDisplayName path:path]; [ref setValue:[props valueForKey:@"value"] withCompletionBlock:^(NSError *_Nullable error, FIRDatabaseReference *_Nonnull _ref) { [RNFirebaseDatabase handlePromise:resolve rejecter:reject databaseError:error]; }]; } -RCT_EXPORT_METHOD(setPriority:(NSString *) appName +RCT_EXPORT_METHOD(setPriority:(NSString *) appDisplayName path:(NSString *) path priority:(NSDictionary *) priority resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRDatabaseReference *ref = [self getReferenceForAppPath:appName path:path]; + FIRDatabaseReference *ref = [self getReferenceForAppPath:appDisplayName path:path]; [ref setPriority:[priority valueForKey:@"value"] withCompletionBlock:^(NSError *_Nullable error, FIRDatabaseReference *_Nonnull ref) { [RNFirebaseDatabase handlePromise:resolve rejecter:reject databaseError:error]; }]; } -RCT_EXPORT_METHOD(setWithPriority:(NSString *) appName +RCT_EXPORT_METHOD(setWithPriority:(NSString *) appDisplayName path:(NSString *) path data:(NSDictionary *) data priority:(NSDictionary *) priority resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRDatabaseReference *ref = [self getReferenceForAppPath:appName path:path]; + FIRDatabaseReference *ref = [self getReferenceForAppPath:appDisplayName path:path]; [ref setValue:[data valueForKey:@"value"] andPriority:[priority valueForKey:@"value"] withCompletionBlock:^(NSError *_Nullable error, FIRDatabaseReference *_Nonnull ref) { [RNFirebaseDatabase handlePromise:resolve rejecter:reject databaseError:error]; }]; } -RCT_EXPORT_METHOD(update:(NSString *) appName +RCT_EXPORT_METHOD(update:(NSString *) appDisplayName path:(NSString *) path props:(NSDictionary *) props resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRDatabaseReference *ref = [self getReferenceForAppPath:appName path:path]; + FIRDatabaseReference *ref = [self getReferenceForAppPath:appDisplayName path:path]; [ref updateChildValues:props withCompletionBlock:^(NSError *_Nullable error, FIRDatabaseReference *_Nonnull _ref) { [RNFirebaseDatabase handlePromise:resolve rejecter:reject databaseError:error]; }]; } -RCT_EXPORT_METHOD(remove:(NSString *) appName +RCT_EXPORT_METHOD(remove:(NSString *) appDisplayName path:(NSString *) path resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRDatabaseReference *ref = [self getReferenceForAppPath:appName path:path]; + FIRDatabaseReference *ref = [self getReferenceForAppPath:appDisplayName path:path]; [ref removeValueWithCompletionBlock:^(NSError *_Nullable error, FIRDatabaseReference *_Nonnull _ref) { [RNFirebaseDatabase handlePromise:resolve rejecter:reject databaseError:error]; }]; } -RCT_EXPORT_METHOD(once:(NSString *) appName +RCT_EXPORT_METHOD(once:(NSString *) appDisplayName key:(NSString *) key path:(NSString *) path modifiers:(NSArray *) modifiers eventName:(NSString *) eventName resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - RNFirebaseDatabaseReference *ref = [self getInternalReferenceForApp:appName key:key path:path modifiers:modifiers]; + RNFirebaseDatabaseReference *ref = [self getInternalReferenceForApp:appDisplayName key:key path:path modifiers:modifiers]; [ref once:eventName resolver:resolve rejecter:reject]; } -RCT_EXPORT_METHOD(on:(NSString *) appName +RCT_EXPORT_METHOD(on:(NSString *) appDisplayName props:(NSDictionary *) props) { - RNFirebaseDatabaseReference *ref = [self getCachedInternalReferenceForApp:appName props:props]; + RNFirebaseDatabaseReference *ref = [self getCachedInternalReferenceForApp:appDisplayName props:props]; [ref on:props[@"eventType"] registration:props[@"registration"]]; } @@ -271,20 +271,20 @@ RCT_EXPORT_METHOD(off:(NSString *) key } } -+ (FIRDatabase *)getDatabaseForApp:(NSString *)appName { - FIRApp *app = [FIRApp appNamed:appName]; ++ (FIRDatabase *)getDatabaseForApp:(NSString *)appDisplayName { + FIRApp *app = [RNFirebaseUtil getApp:appDisplayName]; return [FIRDatabase databaseForApp:app]; } -- (FIRDatabaseReference *)getReferenceForAppPath:(NSString *)appName path:(NSString *)path { - return [[RNFirebaseDatabase getDatabaseForApp:appName] referenceWithPath:path]; +- (FIRDatabaseReference *)getReferenceForAppPath:(NSString *)appDisplayName path:(NSString *)path { + return [[RNFirebaseDatabase getDatabaseForApp:appDisplayName] referenceWithPath:path]; } -- (RNFirebaseDatabaseReference *)getInternalReferenceForApp:(NSString *)appName key:(NSString *)key path:(NSString *)path modifiers:(NSArray *)modifiers { - return [[RNFirebaseDatabaseReference alloc] initWithPathAndModifiers:self app:appName key:key refPath:path modifiers:modifiers]; +- (RNFirebaseDatabaseReference *)getInternalReferenceForApp:(NSString *)appDisplayName key:(NSString *)key path:(NSString *)path modifiers:(NSArray *)modifiers { + return [[RNFirebaseDatabaseReference alloc] initWithPathAndModifiers:self appDisplayName:appDisplayName key:key refPath:path modifiers:modifiers]; } -- (RNFirebaseDatabaseReference *)getCachedInternalReferenceForApp:(NSString *)appName props:(NSDictionary *)props { +- (RNFirebaseDatabaseReference *)getCachedInternalReferenceForApp:(NSString *)appDisplayName props:(NSDictionary *)props { NSString *key = props[@"key"]; NSString *path = props[@"path"]; NSDictionary *modifiers = props[@"modifiers"]; @@ -292,7 +292,7 @@ RCT_EXPORT_METHOD(off:(NSString *) key RNFirebaseDatabaseReference *ref = _dbReferences[key]; if (ref == nil) { - ref = [[RNFirebaseDatabaseReference alloc] initWithPathAndModifiers:self app:appName key:key refPath:path modifiers:modifiers]; + ref = [[RNFirebaseDatabaseReference alloc] initWithPathAndModifiers:self appDisplayName:appDisplayName key:key refPath:path modifiers:modifiers]; _dbReferences[key] = ref; } return ref; @@ -380,20 +380,20 @@ RCT_EXPORT_METHOD(off:(NSString *) key return errorMap; } -- (NSDictionary *)createTransactionUpdateMap:(NSString *)appName transactionId:(NSNumber *)transactionId updatesData:(FIRMutableData *)updatesData { +- (NSDictionary *)createTransactionUpdateMap:(NSString *)appDisplayName transactionId:(NSNumber *)transactionId updatesData:(FIRMutableData *)updatesData { NSMutableDictionary *updatesMap = [[NSMutableDictionary alloc] init]; [updatesMap setValue:transactionId forKey:@"id"]; [updatesMap setValue:@"update" forKey:@"type"]; - [updatesMap setValue:appName forKey:@"appName"]; + [updatesMap setValue:appDisplayName forKey:@"appName"]; [updatesMap setValue:updatesData.value forKey:@"value"]; return updatesMap; } -- (NSDictionary *)createTransactionResultMap:(NSString *)appName transactionId:(NSNumber *)transactionId error:(NSError *)error committed:(BOOL)committed snapshot:(FIRDataSnapshot *)snapshot { +- (NSDictionary *)createTransactionResultMap:(NSString *)appDisplayName transactionId:(NSNumber *)transactionId error:(NSError *)error committed:(BOOL)committed snapshot:(FIRDataSnapshot *)snapshot { NSMutableDictionary *resultMap = [[NSMutableDictionary alloc] init]; [resultMap setValue:transactionId forKey:@"id"]; - [resultMap setValue:appName forKey:@"appName"]; + [resultMap setValue:appDisplayName forKey:@"appName"]; // TODO: no timeout on iOS [resultMap setValue:@(committed) forKey:@"committed"]; // TODO: no interrupted on iOS diff --git a/ios/RNFirebase/database/RNFirebaseDatabaseReference.h b/ios/RNFirebase/database/RNFirebaseDatabaseReference.h index ec02e502..fb64295c 100644 --- a/ios/RNFirebase/database/RNFirebaseDatabaseReference.h +++ b/ios/RNFirebase/database/RNFirebaseDatabaseReference.h @@ -12,12 +12,12 @@ @interface RNFirebaseDatabaseReference : NSObject @property RCTEventEmitter *emitter; @property FIRDatabaseQuery *query; -@property NSString *app; +@property NSString *appDisplayName; @property NSString *key; @property NSString *path; @property NSMutableDictionary *listeners; -- (id)initWithPathAndModifiers:(RCTEventEmitter *)emitter app:(NSString *)app key:(NSString *)key refPath:(NSString *)refPath modifiers:(NSArray *)modifiers; +- (id)initWithPathAndModifiers:(RCTEventEmitter *)emitter appDisplayName:(NSString *)appDisplayName key:(NSString *)key refPath:(NSString *)refPath modifiers:(NSArray *)modifiers; - (void)on:(NSString *) eventName registration:(NSDictionary *) registration; - (void)once:(NSString *) eventType resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject; - (void)removeEventListener:(NSString *)eventRegistrationKey; diff --git a/ios/RNFirebase/database/RNFirebaseDatabaseReference.m b/ios/RNFirebase/database/RNFirebaseDatabaseReference.m index 3a3d6730..a6caf8c2 100644 --- a/ios/RNFirebase/database/RNFirebaseDatabaseReference.m +++ b/ios/RNFirebase/database/RNFirebaseDatabaseReference.m @@ -5,14 +5,14 @@ #if __has_include() - (id)initWithPathAndModifiers:(RCTEventEmitter *)emitter - app:(NSString *) app + appDisplayName:(NSString *) appDisplayName key:(NSString *) key refPath:(NSString *) refPath modifiers:(NSArray *) modifiers { self = [super init]; if (self) { _emitter = emitter; - _app = app; + _appDisplayName = appDisplayName; _key = key; _path = refPath; _listeners = [[NSMutableDictionary alloc] init]; @@ -123,7 +123,7 @@ - (FIRDatabaseQuery *)buildQueryAtPathWithModifiers:(NSString *) path modifiers:(NSArray *)modifiers { - FIRDatabase *firebaseDatabase = [RNFirebaseDatabase getDatabaseForApp:_app]; + FIRDatabase *firebaseDatabase = [RNFirebaseDatabase getDatabaseForApp:_appDisplayName]; FIRDatabaseQuery *query = [[firebaseDatabase reference] child:path]; for (NSDictionary *modifier in modifiers) { diff --git a/ios/RNFirebase/firestore/RNFirebaseFirestore.h b/ios/RNFirebase/firestore/RNFirebaseFirestore.h index e93595b1..98036471 100644 --- a/ios/RNFirebase/firestore/RNFirebaseFirestore.h +++ b/ios/RNFirebase/firestore/RNFirebaseFirestore.h @@ -13,7 +13,7 @@ + (void)promiseRejectException:(RCTPromiseRejectBlock)reject error:(NSError *)error; -+ (FIRFirestore *)getFirestoreForApp:(NSString *)appName; ++ (FIRFirestore *)getFirestoreForApp:(NSString *)appDisplayName; + (NSDictionary *)getJSError:(NSError *)nativeError; @end diff --git a/ios/RNFirebase/firestore/RNFirebaseFirestore.m b/ios/RNFirebase/firestore/RNFirebaseFirestore.m index 29d8646d..f662afb0 100644 --- a/ios/RNFirebase/firestore/RNFirebaseFirestore.m +++ b/ios/RNFirebase/firestore/RNFirebaseFirestore.m @@ -22,17 +22,17 @@ RCT_EXPORT_METHOD(enableLogging:(BOOL) enabled) { [FIRFirestore enableLogging:enabled]; } -RCT_EXPORT_METHOD(collectionGet:(NSString *) appName +RCT_EXPORT_METHOD(collectionGet:(NSString *) appDisplayName path:(NSString *) path filters:(NSArray *) filters orders:(NSArray *) orders options:(NSDictionary *) options resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - [[self getCollectionForAppPath:appName path:path filters:filters orders:orders options:options] get:resolve rejecter:reject]; + [[self getCollectionForAppPath:appDisplayName path:path filters:filters orders:orders options:options] get:resolve rejecter:reject]; } -RCT_EXPORT_METHOD(collectionOffSnapshot:(NSString *) appName +RCT_EXPORT_METHOD(collectionOffSnapshot:(NSString *) appDisplayName path:(NSString *) path filters:(NSArray *) filters orders:(NSArray *) orders @@ -41,22 +41,22 @@ RCT_EXPORT_METHOD(collectionOffSnapshot:(NSString *) appName [RNFirebaseFirestoreCollectionReference offSnapshot:listenerId]; } -RCT_EXPORT_METHOD(collectionOnSnapshot:(NSString *) appName +RCT_EXPORT_METHOD(collectionOnSnapshot:(NSString *) appDisplayName path:(NSString *) path filters:(NSArray *) filters orders:(NSArray *) orders options:(NSDictionary *) options listenerId:(nonnull NSString *) listenerId queryListenOptions:(NSDictionary *) queryListenOptions) { - RNFirebaseFirestoreCollectionReference *ref = [self getCollectionForAppPath:appName path:path filters:filters orders:orders options:options]; + RNFirebaseFirestoreCollectionReference *ref = [self getCollectionForAppPath:appDisplayName path:path filters:filters orders:orders options:options]; [ref onSnapshot:listenerId queryListenOptions:queryListenOptions]; } -RCT_EXPORT_METHOD(documentBatch:(NSString *) appName +RCT_EXPORT_METHOD(documentBatch:(NSString *) appDisplayName writes:(NSArray *) writes resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRFirestore *firestore = [RNFirebaseFirestore getFirestoreForApp:appName]; + FIRFirestore *firestore = [RNFirebaseFirestore getFirestoreForApp:appDisplayName]; FIRWriteBatch *batch = [firestore batch]; for (NSDictionary *write in writes) { @@ -89,56 +89,56 @@ RCT_EXPORT_METHOD(documentBatch:(NSString *) appName }]; } -RCT_EXPORT_METHOD(documentDelete:(NSString *) appName +RCT_EXPORT_METHOD(documentDelete:(NSString *) appDisplayName path:(NSString *) path resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - [[self getDocumentForAppPath:appName path:path] delete:resolve rejecter:reject]; + [[self getDocumentForAppPath:appDisplayName path:path] delete:resolve rejecter:reject]; } -RCT_EXPORT_METHOD(documentGet:(NSString *) appName +RCT_EXPORT_METHOD(documentGet:(NSString *) appDisplayName path:(NSString *) path resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - [[self getDocumentForAppPath:appName path:path] get:resolve rejecter:reject]; + [[self getDocumentForAppPath:appDisplayName path:path] get:resolve rejecter:reject]; } -RCT_EXPORT_METHOD(documentGetAll:(NSString *) appName +RCT_EXPORT_METHOD(documentGetAll:(NSString *) appDisplayName documents:(NSString *) documents resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { // Not supported on iOS out of the box } -RCT_EXPORT_METHOD(documentOffSnapshot:(NSString *) appName +RCT_EXPORT_METHOD(documentOffSnapshot:(NSString *) appDisplayName path:(NSString *) path listenerId:(nonnull NSString *) listenerId) { [RNFirebaseFirestoreDocumentReference offSnapshot:listenerId]; } -RCT_EXPORT_METHOD(documentOnSnapshot:(NSString *) appName +RCT_EXPORT_METHOD(documentOnSnapshot:(NSString *) appDisplayName path:(NSString *) path listenerId:(nonnull NSString *) listenerId docListenOptions:(NSDictionary *) docListenOptions) { - RNFirebaseFirestoreDocumentReference *ref = [self getDocumentForAppPath:appName path:path]; + RNFirebaseFirestoreDocumentReference *ref = [self getDocumentForAppPath:appDisplayName path:path]; [ref onSnapshot:listenerId docListenOptions:docListenOptions]; } -RCT_EXPORT_METHOD(documentSet:(NSString *) appName +RCT_EXPORT_METHOD(documentSet:(NSString *) appDisplayName path:(NSString *) path data:(NSDictionary *) data options:(NSDictionary *) options resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - [[self getDocumentForAppPath:appName path:path] set:data options:options resolver:resolve rejecter:reject]; + [[self getDocumentForAppPath:appDisplayName path:path] set:data options:options resolver:resolve rejecter:reject]; } -RCT_EXPORT_METHOD(documentUpdate:(NSString *) appName +RCT_EXPORT_METHOD(documentUpdate:(NSString *) appDisplayName path:(NSString *) path data:(NSDictionary *) data resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - [[self getDocumentForAppPath:appName path:path] update:data resolver:resolve rejecter:reject]; + [[self getDocumentForAppPath:appDisplayName path:path] update:data resolver:resolve rejecter:reject]; } /* @@ -149,17 +149,17 @@ RCT_EXPORT_METHOD(documentUpdate:(NSString *) appName reject([jsError valueForKey:@"code"], [jsError valueForKey:@"message"], error); } -+ (FIRFirestore *)getFirestoreForApp:(NSString *)appName { - FIRApp *app = [FIRApp appNamed:appName]; ++ (FIRFirestore *)getFirestoreForApp:(NSString *)appDisplayName { + FIRApp *app = [RNFirebaseUtil getApp:appDisplayName]; return [FIRFirestore firestoreForApp:app]; } -- (RNFirebaseFirestoreCollectionReference *)getCollectionForAppPath:(NSString *)appName path:(NSString *)path filters:(NSArray *)filters orders:(NSArray *)orders options:(NSDictionary *)options { - return [[RNFirebaseFirestoreCollectionReference alloc] initWithPathAndModifiers:self app:appName path:path filters:filters orders:orders options:options]; +- (RNFirebaseFirestoreCollectionReference *)getCollectionForAppPath:(NSString *)appDisplayName path:(NSString *)path filters:(NSArray *)filters orders:(NSArray *)orders options:(NSDictionary *)options { + return [[RNFirebaseFirestoreCollectionReference alloc] initWithPathAndModifiers:self appDisplayName:appDisplayName path:path filters:filters orders:orders options:options]; } -- (RNFirebaseFirestoreDocumentReference *)getDocumentForAppPath:(NSString *)appName path:(NSString *)path { - return [[RNFirebaseFirestoreDocumentReference alloc] initWithPath:self app:appName path:path]; +- (RNFirebaseFirestoreDocumentReference *)getDocumentForAppPath:(NSString *)appDisplayName path:(NSString *)path { + return [[RNFirebaseFirestoreDocumentReference alloc] initWithPath:self appDisplayName:appDisplayName path:path]; } // TODO: Move to error util for use in other modules diff --git a/ios/RNFirebase/firestore/RNFirebaseFirestoreCollectionReference.h b/ios/RNFirebase/firestore/RNFirebaseFirestoreCollectionReference.h index 8fc07cbe..9e067ab0 100644 --- a/ios/RNFirebase/firestore/RNFirebaseFirestoreCollectionReference.h +++ b/ios/RNFirebase/firestore/RNFirebaseFirestoreCollectionReference.h @@ -13,14 +13,14 @@ @interface RNFirebaseFirestoreCollectionReference : NSObject @property RCTEventEmitter *emitter; -@property NSString *app; +@property NSString *appDisplayName; @property NSString *path; @property NSArray *filters; @property NSArray *orders; @property NSDictionary *options; @property FIRQuery *query; -- (id)initWithPathAndModifiers:(RCTEventEmitter *)emitter app:(NSString *)app path:(NSString *)path filters:(NSArray *)filters orders:(NSArray *)orders options:(NSDictionary *)options; +- (id)initWithPathAndModifiers:(RCTEventEmitter *)emitter appDisplayName:(NSString *)appDisplayName path:(NSString *)path filters:(NSArray *)filters orders:(NSArray *)orders options:(NSDictionary *)options; - (void)get:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject; + (void)offSnapshot:(NSString *)listenerId; - (void)onSnapshot:(NSString *)listenerId queryListenOptions:(NSDictionary *) queryListenOptions; diff --git a/ios/RNFirebase/firestore/RNFirebaseFirestoreCollectionReference.m b/ios/RNFirebase/firestore/RNFirebaseFirestoreCollectionReference.m index 4985ab8e..91af07cd 100644 --- a/ios/RNFirebase/firestore/RNFirebaseFirestoreCollectionReference.m +++ b/ios/RNFirebase/firestore/RNFirebaseFirestoreCollectionReference.m @@ -7,7 +7,7 @@ static NSMutableDictionary *_listeners; - (id)initWithPathAndModifiers:(RCTEventEmitter *) emitter - app:(NSString *) app + appDisplayName:(NSString *) appDisplayName path:(NSString *) path filters:(NSArray *) filters orders:(NSArray *) orders @@ -15,7 +15,7 @@ static NSMutableDictionary *_listeners; self = [super init]; if (self) { _emitter = emitter; - _app = app; + _appDisplayName = appDisplayName; _path = path; _filters = filters; _orders = orders; @@ -64,7 +64,7 @@ queryListenOptions:(NSDictionary *) queryListenOptions { [self handleQuerySnapshotEvent:listenerId querySnapshot:snapshot]; } }; - + FIRQueryListenOptions *options = [[FIRQueryListenOptions alloc] init]; if (queryListenOptions) { if (queryListenOptions[@"includeDocumentMetadataChanges"]) { @@ -74,14 +74,14 @@ queryListenOptions:(NSDictionary *) queryListenOptions { [options includeQueryMetadataChanges:TRUE]; } } - + id listener = [_query addSnapshotListenerWithOptions:options listener:listenerBlock]; _listeners[listenerId] = listener; } } - (FIRQuery *)buildQuery { - FIRFirestore *firestore = [RNFirebaseFirestore getFirestoreForApp:_app]; + FIRFirestore *firestore = [RNFirebaseFirestore getFirestoreForApp:_appDisplayName]; FIRQuery *query = (FIRQuery*)[firestore collectionWithPath:_path]; query = [self applyFilters:firestore query:query]; query = [self applyOrders:query]; @@ -152,7 +152,7 @@ queryListenOptions:(NSDictionary *) queryListenOptions { - (void)handleQuerySnapshotError:(NSString *)listenerId error:(NSError *)error { NSMutableDictionary *event = [[NSMutableDictionary alloc] init]; - [event setValue:_app forKey:@"appName"]; + [event setValue:_appDisplayName forKey:@"appName"]; [event setValue:_path forKey:@"path"]; [event setValue:listenerId forKey:@"listenerId"]; [event setValue:[RNFirebaseFirestore getJSError:error] forKey:@"error"]; @@ -163,7 +163,7 @@ queryListenOptions:(NSDictionary *) queryListenOptions { - (void)handleQuerySnapshotEvent:(NSString *)listenerId querySnapshot:(FIRQuerySnapshot *)querySnapshot { NSMutableDictionary *event = [[NSMutableDictionary alloc] init]; - [event setValue:_app forKey:@"appName"]; + [event setValue:_appDisplayName forKey:@"appName"]; [event setValue:_path forKey:@"path"]; [event setValue:listenerId forKey:@"listenerId"]; [event setValue:[RNFirebaseFirestoreCollectionReference snapshotToDictionary:querySnapshot] forKey:@"querySnapshot"]; diff --git a/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.h b/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.h index 5a944ad9..9745a091 100644 --- a/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.h +++ b/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.h @@ -13,11 +13,11 @@ @interface RNFirebaseFirestoreDocumentReference : NSObject @property RCTEventEmitter *emitter; -@property NSString *app; +@property NSString *appDisplayName; @property NSString *path; @property FIRDocumentReference *ref; -- (id)initWithPath:(RCTEventEmitter *)emitter app:(NSString *)app path:(NSString *)path; +- (id)initWithPath:(RCTEventEmitter *)emitter appDisplayName:(NSString *)appDisplayName path:(NSString *)path; - (void)delete:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject; - (void)get:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject; + (void)offSnapshot:(NSString *)listenerId; diff --git a/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.m b/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.m index d9c5a950..ba8ca21b 100644 --- a/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.m +++ b/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.m @@ -7,14 +7,14 @@ static NSMutableDictionary *_listeners; - (id)initWithPath:(RCTEventEmitter *)emitter - app:(NSString *) app + appDisplayName:(NSString *) appDisplayName path:(NSString *) path { self = [super init]; if (self) { _emitter = emitter; - _app = app; + _appDisplayName = appDisplayName; _path = path; - _ref = [[RNFirebaseFirestore getFirestoreForApp:_app] documentWithPath:_path]; + _ref = [[RNFirebaseFirestore getFirestoreForApp:_appDisplayName] documentWithPath:_path]; } // Initialise the static listeners object if required if (!_listeners) { @@ -78,7 +78,7 @@ static NSMutableDictionary *_listeners; options:(NSDictionary *) options resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject { - NSDictionary *dictionary = [RNFirebaseFirestoreDocumentReference parseJSMap:[RNFirebaseFirestore getFirestoreForApp:_app] jsMap:data]; + NSDictionary *dictionary = [RNFirebaseFirestoreDocumentReference parseJSMap:[RNFirebaseFirestore getFirestoreForApp:_appDisplayName] jsMap:data]; if (options && options[@"merge"]) { [_ref setData:dictionary options:[FIRSetOptions merge] completion:^(NSError * _Nullable error) { [RNFirebaseFirestoreDocumentReference handleWriteResponse:error resolver:resolve rejecter:reject]; @@ -93,7 +93,7 @@ static NSMutableDictionary *_listeners; - (void)update:(NSDictionary *) data resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject { - NSDictionary *dictionary = [RNFirebaseFirestoreDocumentReference parseJSMap:[RNFirebaseFirestore getFirestoreForApp:_app] jsMap:data]; + NSDictionary *dictionary = [RNFirebaseFirestoreDocumentReference parseJSMap:[RNFirebaseFirestore getFirestoreForApp:_appDisplayName] jsMap:data]; [_ref updateData:dictionary completion:^(NSError * _Nullable error) { [RNFirebaseFirestoreDocumentReference handleWriteResponse:error resolver:resolve rejecter:reject]; }]; @@ -131,7 +131,7 @@ static NSMutableDictionary *_listeners; - (void)handleDocumentSnapshotError:(NSString *)listenerId error:(NSError *)error { NSMutableDictionary *event = [[NSMutableDictionary alloc] init]; - [event setValue:_app forKey:@"appName"]; + [event setValue:_appDisplayName forKey:@"appName"]; [event setValue:_path forKey:@"path"]; [event setValue:listenerId forKey:@"listenerId"]; [event setValue:[RNFirebaseFirestore getJSError:error] forKey:@"error"]; @@ -142,7 +142,7 @@ static NSMutableDictionary *_listeners; - (void)handleDocumentSnapshotEvent:(NSString *)listenerId documentSnapshot:(FIRDocumentSnapshot *)documentSnapshot { NSMutableDictionary *event = [[NSMutableDictionary alloc] init]; - [event setValue:_app forKey:@"appName"]; + [event setValue:_appDisplayName forKey:@"appName"]; [event setValue:_path forKey:@"path"]; [event setValue:listenerId forKey:@"listenerId"]; [event setValue:[RNFirebaseFirestoreDocumentReference snapshotToDictionary:documentSnapshot] forKey:@"documentSnapshot"]; diff --git a/ios/RNFirebase/storage/RNFirebaseStorage.m b/ios/RNFirebase/storage/RNFirebaseStorage.m index e73038d5..ce6ea1ed 100644 --- a/ios/RNFirebase/storage/RNFirebaseStorage.m +++ b/ios/RNFirebase/storage/RNFirebaseStorage.m @@ -23,11 +23,11 @@ RCT_EXPORT_MODULE(RNFirebaseStorage); @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#delete @param NSString path */ -RCT_EXPORT_METHOD(delete:(NSString *) appName +RCT_EXPORT_METHOD(delete:(NSString *) appDisplayName path:(NSString *) path resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRStorageReference *fileRef = [self getReference:path appName:appName]; + FIRStorageReference *fileRef = [self getReference:path appDisplayName:appDisplayName]; [fileRef deleteWithCompletion:^(NSError *_Nullable error) { if (error != nil) { @@ -44,11 +44,11 @@ RCT_EXPORT_METHOD(delete:(NSString *) appName @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getDownloadURL @param NSString path */ -RCT_EXPORT_METHOD(getDownloadURL:(NSString *) appName +RCT_EXPORT_METHOD(getDownloadURL:(NSString *) appDisplayName path:(NSString *) path resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRStorageReference *fileRef = [self getReference:path appName:appName]; + FIRStorageReference *fileRef = [self getReference:path appDisplayName:appDisplayName]; [fileRef downloadURLWithCompletion:^(NSURL *_Nullable URL, NSError *_Nullable error) { if (error != nil) { @@ -65,11 +65,11 @@ RCT_EXPORT_METHOD(getDownloadURL:(NSString *) appName @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getMetadata @param NSString path */ -RCT_EXPORT_METHOD(getMetadata:(NSString *) appName +RCT_EXPORT_METHOD(getMetadata:(NSString *) appDisplayName path:(NSString *) path resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRStorageReference *fileRef = [self getReference:path appName:appName]; + FIRStorageReference *fileRef = [self getReference:path appDisplayName:appDisplayName]; [fileRef metadataWithCompletion:^(FIRStorageMetadata *_Nullable metadata, NSError *_Nullable error) { if (error != nil) { @@ -87,12 +87,12 @@ RCT_EXPORT_METHOD(getMetadata:(NSString *) appName @param NSString path @param NSDictionary metadata */ -RCT_EXPORT_METHOD(updateMetadata:(NSString *) appName +RCT_EXPORT_METHOD(updateMetadata:(NSString *) appDisplayName path:(NSString *) path metadata:(NSDictionary *) metadata resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRStorageReference *fileRef = [self getReference:path appName:appName]; + FIRStorageReference *fileRef = [self getReference:path appDisplayName:appDisplayName]; FIRStorageMetadata *firmetadata = [self buildMetadataFromMap:metadata]; [fileRef updateMetadata:firmetadata completion:^(FIRStorageMetadata *_Nullable metadata, NSError *_Nullable error) { @@ -111,12 +111,12 @@ RCT_EXPORT_METHOD(updateMetadata:(NSString *) appName @param NSString path @param NSString localPath */ -RCT_EXPORT_METHOD(downloadFile:(NSString *) appName +RCT_EXPORT_METHOD(downloadFile:(NSString *) appDisplayName path:(NSString *) path localPath:(NSString *) localPath resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject) { - FIRStorageReference *fileRef = [self getReference:path appName:appName]; + FIRStorageReference *fileRef = [self getReference:path appDisplayName:appDisplayName]; NSURL *localFile = [NSURL fileURLWithPath:localPath]; FIRStorageDownloadTask *downloadTask = [fileRef writeToFile:localFile]; @@ -124,25 +124,25 @@ RCT_EXPORT_METHOD(downloadFile:(NSString *) appName [downloadTask observeStatus:FIRStorageTaskStatusResume handler:^(FIRStorageTaskSnapshot *snapshot) { // download resumed, also fires when the upload starts NSDictionary *event = [self getDownloadTaskAsDictionary:snapshot]; - [self sendJSEvent:appName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:event]; + [self sendJSEvent:appDisplayName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:event]; }]; [downloadTask observeStatus:FIRStorageTaskStatusPause handler:^(FIRStorageTaskSnapshot *snapshot) { // download paused NSDictionary *event = [self getDownloadTaskAsDictionary:snapshot]; - [self sendJSEvent:appName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:event]; + [self sendJSEvent:appDisplayName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:event]; }]; [downloadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) { // download reported progress NSDictionary *event = [self getDownloadTaskAsDictionary:snapshot]; - [self sendJSEvent:appName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:event]; + [self sendJSEvent:appDisplayName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:event]; }]; [downloadTask observeStatus:FIRStorageTaskStatusSuccess handler:^(FIRStorageTaskSnapshot *snapshot) { // download completed successfully NSDictionary *resp = [self getDownloadTaskAsDictionary:snapshot]; - [self sendJSEvent:appName type:STORAGE_EVENT path:path title:STORAGE_DOWNLOAD_SUCCESS props:resp]; + [self sendJSEvent:appDisplayName type:STORAGE_EVENT path:path title:STORAGE_DOWNLOAD_SUCCESS props:resp]; resolve(resp); }]; @@ -161,9 +161,10 @@ RCT_EXPORT_METHOD(downloadFile:(NSString *) appName @url https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxDownloadRetryTime @param NSNumber milliseconds */ -RCT_EXPORT_METHOD(setMaxDownloadRetryTime:(NSString *) appName +RCT_EXPORT_METHOD(setMaxDownloadRetryTime:(NSString *) appDisplayName milliseconds:(NSNumber *) milliseconds) { - [[FIRStorage storageForApp:[FIRApp appNamed:appName]] setMaxDownloadRetryTime:[milliseconds doubleValue]]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; + [[FIRStorage storageForApp:firApp] setMaxDownloadRetryTime:[milliseconds doubleValue]]; } /** @@ -172,9 +173,10 @@ RCT_EXPORT_METHOD(setMaxDownloadRetryTime:(NSString *) appName @url https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxOperationRetryTime @param NSNumber milliseconds */ -RCT_EXPORT_METHOD(setMaxOperationRetryTime:(NSString *) appName +RCT_EXPORT_METHOD(setMaxOperationRetryTime:(NSString *) appDisplayName milliseconds:(NSNumber *) milliseconds) { - [[FIRStorage storageForApp:[FIRApp appNamed:appName]] setMaxOperationRetryTime:[milliseconds doubleValue]]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; + [[FIRStorage storageForApp:firApp] setMaxOperationRetryTime:[milliseconds doubleValue]]; } /** @@ -182,9 +184,10 @@ RCT_EXPORT_METHOD(setMaxOperationRetryTime:(NSString *) appName @url https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxUploadRetryTime */ -RCT_EXPORT_METHOD(setMaxUploadRetryTime:(NSString *) appName +RCT_EXPORT_METHOD(setMaxUploadRetryTime:(NSString *) appDisplayName milliseconds:(NSNumber *) milliseconds) { - [[FIRStorage storageForApp:[FIRApp appNamed:appName]] setMaxUploadRetryTime:[milliseconds doubleValue]]; + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; + [[FIRStorage storageForApp:firApp] setMaxUploadRetryTime:[milliseconds doubleValue]]; } /** @@ -195,7 +198,7 @@ RCT_EXPORT_METHOD(setMaxUploadRetryTime:(NSString *) appName @param NSString localPath @param NSDictionary metadata */ -RCT_EXPORT_METHOD(putFile:(NSString *) appName +RCT_EXPORT_METHOD(putFile:(NSString *) appDisplayName path:(NSString *) path localPath:(NSString *) localPath metadata:(NSDictionary *) metadata @@ -224,7 +227,7 @@ RCT_EXPORT_METHOD(putFile:(NSString *) appName if (info[PHImageErrorKey] == nil) { if (UTTypeConformsTo((__bridge CFStringRef)dataUTI, kUTTypeJPEG)) { firmetadata.contentType = [self utiToMimeType:dataUTI]; - [self uploadData:appName data:imageData firmetadata:firmetadata path:path resolver:resolve rejecter:reject]; + [self uploadData:appDisplayName data:imageData firmetadata:firmetadata path:path resolver:resolve rejecter:reject]; } else { // if the image UTI is not JPEG then convert to JPEG, e.g. HEI CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL); @@ -236,7 +239,7 @@ RCT_EXPORT_METHOD(putFile:(NSString *) appName CGImageDestinationFinalize(destination); // Manually set mimetype to JPEG firmetadata.contentType = @"image/jpeg"; - [self uploadData:appName data:[NSData dataWithData:imageDataJPEG] firmetadata:firmetadata path:path resolver:resolve rejecter:reject]; + [self uploadData:appDisplayName data:[NSData dataWithData:imageDataJPEG] firmetadata:firmetadata path:path resolver:resolve rejecter:reject]; } } else { reject(@"storage/request-image-data-failed", @"Could not obtain image data for the specified file.", nil); @@ -260,7 +263,7 @@ RCT_EXPORT_METHOD(putFile:(NSString *) appName [exportSession exportAsynchronouslyWithCompletionHandler:^{ if (exportSession.status == AVAssetExportSessionStatusCompleted) { firmetadata.contentType = [self utiToMimeType:exportSession.outputFileType]; - [self uploadFile:appName url:tempUrl firmetadata:firmetadata path:path resolver:resolve rejecter:reject]; + [self uploadFile:appDisplayName url:tempUrl firmetadata:firmetadata path:path resolver:resolve rejecter:reject]; // we're not cleaning up the temporary file at the moment, just relying on the OS to do that in it's own time - todo? } else { reject(@"storage/temporary-file-failure", @"Unable to create temporary file for upload.", nil); @@ -274,7 +277,7 @@ RCT_EXPORT_METHOD(putFile:(NSString *) appName } else { // TODO: Content type for file? NSData *data = [[NSFileManager defaultManager] contentsAtPath:localPath]; - [self uploadData:appName data:data firmetadata:firmetadata path:path resolver:resolve rejecter:reject]; + [self uploadData:appDisplayName data:data firmetadata:firmetadata path:path resolver:resolve rejecter:reject]; } } @@ -288,42 +291,42 @@ RCT_EXPORT_METHOD(putFile:(NSString *) appName return (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)dataUTI, kUTTagClassMIMEType); } -- (void)uploadFile:(NSString *)appName url:(NSURL *)url firmetadata:(FIRStorageMetadata *)firmetadata path:(NSString *)path resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject { - FIRStorageReference *fileRef = [self getReference:path appName:appName]; +- (void)uploadFile:(NSString *)appDisplayName url:(NSURL *)url firmetadata:(FIRStorageMetadata *)firmetadata path:(NSString *)path resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject { + FIRStorageReference *fileRef = [self getReference:path appDisplayName:appDisplayName]; FIRStorageUploadTask *uploadTask = [fileRef putFile:url metadata:firmetadata]; - [self addUploadObservers:appName uploadTask:uploadTask path:path resolver:resolve rejecter:reject]; + [self addUploadObservers:appDisplayName uploadTask:uploadTask path:path resolver:resolve rejecter:reject]; } -- (void)uploadData:(NSString *)appName data:(NSData *)data firmetadata:(FIRStorageMetadata *)firmetadata path:(NSString *)path resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject { - FIRStorageReference *fileRef = [self getReference:path appName:appName]; +- (void)uploadData:(NSString *)appDisplayName data:(NSData *)data firmetadata:(FIRStorageMetadata *)firmetadata path:(NSString *)path resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject { + FIRStorageReference *fileRef = [self getReference:path appDisplayName:appDisplayName]; FIRStorageUploadTask *uploadTask = [fileRef putData:data metadata:firmetadata]; - [self addUploadObservers:appName uploadTask:uploadTask path:path resolver:resolve rejecter:reject]; + [self addUploadObservers:appDisplayName uploadTask:uploadTask path:path resolver:resolve rejecter:reject]; } -- (void)addUploadObservers:(NSString *)appName uploadTask:(FIRStorageUploadTask *)uploadTask path:(NSString *)path resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject { +- (void)addUploadObservers:(NSString *)appDisplayName uploadTask:(FIRStorageUploadTask *)uploadTask path:(NSString *)path resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject { // listen for state changes, errors, and completion of the upload. [uploadTask observeStatus:FIRStorageTaskStatusResume handler:^(FIRStorageTaskSnapshot *snapshot) { // upload resumed, also fires when the upload starts NSDictionary *event = [self getUploadTaskAsDictionary:snapshot]; - [self sendJSEvent:appName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:event]; + [self sendJSEvent:appDisplayName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:event]; }]; [uploadTask observeStatus:FIRStorageTaskStatusPause handler:^(FIRStorageTaskSnapshot *snapshot) { // upload paused NSDictionary *event = [self getUploadTaskAsDictionary:snapshot]; - [self sendJSEvent:appName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:event]; + [self sendJSEvent:appDisplayName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:event]; }]; [uploadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) { // upload reported progress NSDictionary *event = [self getUploadTaskAsDictionary:snapshot]; - [self sendJSEvent:appName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:event]; + [self sendJSEvent:appDisplayName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:event]; }]; [uploadTask observeStatus:FIRStorageTaskStatusSuccess handler:^(FIRStorageTaskSnapshot *snapshot) { // upload completed successfully NSDictionary *resp = [self getUploadTaskAsDictionary:snapshot]; - [self sendJSEvent:appName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:resp]; - [self sendJSEvent:appName type:STORAGE_EVENT path:path title:STORAGE_UPLOAD_SUCCESS props:resp]; + [self sendJSEvent:appDisplayName type:STORAGE_EVENT path:path title:STORAGE_STATE_CHANGED props:resp]; + [self sendJSEvent:appDisplayName type:STORAGE_EVENT path:path title:STORAGE_UPLOAD_SUCCESS props:resp]; resolve(resp); }]; @@ -335,12 +338,13 @@ RCT_EXPORT_METHOD(putFile:(NSString *) appName } - (FIRStorageReference *)getReference:(NSString *)path - appName:(NSString *)appName { + appDisplayName:(NSString *)appDisplayName { + FIRApp *firApp = [RNFirebaseUtil getApp:appDisplayName]; if ([path hasPrefix:@"url::"]) { NSString *url = [path substringFromIndex:5]; - return [[FIRStorage storageForApp:[FIRApp appNamed:appName]] referenceForURL:url]; + return [[FIRStorage storageForApp:firApp] referenceForURL:url]; } else { - return [[FIRStorage storageForApp:[FIRApp appNamed:appName]] referenceWithPath:path]; + return [[FIRStorage storageForApp:firApp] referenceWithPath:path]; } } @@ -387,13 +391,13 @@ RCT_EXPORT_METHOD(putFile:(NSString *) appName return @[STORAGE_EVENT, STORAGE_ERROR]; } -- (void)sendJSError:(NSString *)appName error:(NSError *)error path:(NSString *)path { +- (void)sendJSError:(NSString *)appDisplayName error:(NSError *)error path:(NSString *)path { NSDictionary *evt = @{@"path": path, @"message": [error debugDescription]}; - [self sendJSEvent:appName type:STORAGE_ERROR path:path title:STORAGE_ERROR props:evt]; + [self sendJSEvent:appDisplayName type:STORAGE_ERROR path:path title:STORAGE_ERROR props:evt]; } -- (void)sendJSEvent:(NSString *)appName type:(NSString *)type path:(NSString *)path title:(NSString *)title props:(NSDictionary *)props { - [RNFirebaseUtil sendJSEvent:self name:type body:@{@"eventName": title, @"appName": appName, @"path": path, @"body": props}]; +- (void)sendJSEvent:(NSString *)appDisplayName type:(NSString *)type path:(NSString *)path title:(NSString *)title props:(NSDictionary *)props { + [RNFirebaseUtil sendJSEvent:self name:type body:@{@"eventName": title, @"appName": appDisplayName, @"path": path, @"body": props}]; } /** diff --git a/lib/modules/admob/index.js b/lib/modules/admob/index.js index fc971d01..8a81f873 100644 --- a/lib/modules/admob/index.js +++ b/lib/modules/admob/index.js @@ -31,15 +31,19 @@ const NATIVE_EVENTS = [ 'rewarded_video_event', ]; -export default class AdMob extends ModuleBase { - static _NAMESPACE = 'admob'; - static _NATIVE_MODULE = 'RNFirebaseAdMob'; +export const MODULE_NAME = 'RNFirebaseAdmob'; +export const NAMESPACE = 'admob'; +export default class AdMob extends ModuleBase { _appId: ?string; _initialized: boolean; constructor(firebaseApp: FirebaseApp, options: Object = {}) { - super(firebaseApp, options, NATIVE_EVENTS); + super(firebaseApp, options, { + events: NATIVE_EVENTS, + moduleName: MODULE_NAME, + namespace: NAMESPACE, + }); this._initialized = false; this._appId = null; diff --git a/lib/modules/analytics/index.js b/lib/modules/analytics/index.js index cc842340..dbff883c 100644 --- a/lib/modules/analytics/index.js +++ b/lib/modules/analytics/index.js @@ -24,12 +24,15 @@ const ReservedEventNames = [ 'user_engagement', ]; -export default class Analytics extends ModuleBase { - static _NAMESPACE = 'analytics'; - static _NATIVE_MODULE = 'RNFirebaseAnalytics'; +export const MODULE_NAME = 'RNFirebaseAnalytics'; +export const NAMESPACE = 'analytics'; +export default class Analytics extends ModuleBase { constructor(firebaseApp: FirebaseApp, options: Object = {}) { - super(firebaseApp, options); + super(firebaseApp, options, { + moduleName: MODULE_NAME, + namespace: NAMESPACE, + }); } /** diff --git a/lib/modules/auth/index.js b/lib/modules/auth/index.js index e9ac0296..acf8e0a5 100644 --- a/lib/modules/auth/index.js +++ b/lib/modules/auth/index.js @@ -32,15 +32,19 @@ const NATIVE_EVENTS = [ 'phone_auth_state_changed', ]; -export default class Auth extends ModuleBase { - static _NAMESPACE = 'auth'; - static _NATIVE_MODULE = 'RNFirebaseAuth'; +export const MODULE_NAME = 'RNFirebaseAuth'; +export const NAMESPACE = 'auth'; +export default class Auth extends ModuleBase { _authResult: AuthResult | null; _user: User | null; constructor(firebaseApp: FirebaseApp, options: Object = {}) { - super(firebaseApp, options, NATIVE_EVENTS); + super(firebaseApp, options, { + events: NATIVE_EVENTS, + moduleName: MODULE_NAME, + namespace: NAMESPACE, + }); this._user = null; this._authResult = null; @@ -346,23 +350,23 @@ export default class Auth extends ModuleBase { */ getRedirectResult() { - throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_MODULE_METHOD(Auth, 'getRedirectResult')); + throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_MODULE_METHOD('auth', 'getRedirectResult')); } setPersistence() { - throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_MODULE_METHOD(Auth, 'setPersistence')); + throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_MODULE_METHOD('auth', 'setPersistence')); } signInAndRetrieveDataWithCredential() { - throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_MODULE_METHOD(Auth, 'signInAndRetrieveDataWithCredential')); + throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_MODULE_METHOD('auth', 'signInAndRetrieveDataWithCredential')); } signInWithPopup() { - throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_MODULE_METHOD(Auth, 'signInWithPopup')); + throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_MODULE_METHOD('auth', 'signInWithPopup')); } signInWithRedirect() { - throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_MODULE_METHOD(Auth, 'signInWithRedirect')); + throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_MODULE_METHOD('auth', 'signInWithRedirect')); } } diff --git a/lib/modules/config/index.js b/lib/modules/config/index.js index 990d8e9a..ea3ab5cb 100644 --- a/lib/modules/config/index.js +++ b/lib/modules/config/index.js @@ -15,17 +15,20 @@ type NativeValue = { source: 'remoteConfigSourceRemote' | 'remoteConfigSourceDefault' | ' remoteConfigSourceStatic', } +export const MODULE_NAME = 'RNFirebaseRemoteConfig'; +export const NAMESPACE = 'config'; + /** * @class Config */ export default class RemoteConfig extends ModuleBase { - static _NAMESPACE = 'config'; - static _NATIVE_MODULE = 'RNFirebaseRemoteConfig'; - _developerModeEnabled: boolean; constructor(firebaseApp: FirebaseApp, options: Object = {}) { - super(firebaseApp, options); + super(firebaseApp, options, { + moduleName: MODULE_NAME, + namespace: NAMESPACE, + }); this._developerModeEnabled = false; } diff --git a/lib/modules/core/firebase-app.js b/lib/modules/core/firebase-app.js index 2711d4f1..ae340e44 100644 --- a/lib/modules/core/firebase-app.js +++ b/lib/modules/core/firebase-app.js @@ -8,19 +8,19 @@ import { SharedEventEmitter } from '../../utils/events'; import INTERNALS from '../../utils/internals'; import { isObject } from '../../utils'; -import AdMob from '../admob'; -import Auth from '../auth'; -import Analytics from '../analytics'; -import Config from '../config'; -import Crash from '../crash'; -import Crashlytics from '../fabric/crashlytics'; -import Database from '../database'; -import Firestore from '../firestore'; -import Links from '../links'; -import Messaging from '../messaging'; -import Performance from '../perf'; -import Storage from '../storage'; -import Utils from '../utils'; +import AdMob, { NAMESPACE as AdmobNamespace } from '../admob'; +import Auth, { NAMESPACE as AuthNamespace } from '../auth'; +import Analytics, { NAMESPACE as AnalyticsNamespace } from '../analytics'; +import Config, { NAMESPACE as ConfigNamespace } from '../config'; +import Crash, { NAMESPACE as CrashNamespace } from '../crash'; +import Crashlytics, { NAMESPACE as CrashlyticsNamespace } from '../fabric/crashlytics'; +import Database, { NAMESPACE as DatabaseNamespace } from '../database'; +import Firestore, { NAMESPACE as FirestoreNamespace } from '../firestore'; +import Links, { NAMESPACE as LinksNamespace } from '../links'; +import Messaging, { NAMESPACE as MessagingNamespace } from '../messaging'; +import Performance, { NAMESPACE as PerfNamespace } from '../perf'; +import Storage, { NAMESPACE as StorageNamespace } from '../storage'; +import Utils, { NAMESPACE as UtilsNamespace } from '../utils'; import type { FirebaseOptions, @@ -66,21 +66,21 @@ export default class FirebaseApp { } // modules - this.admob = APPS.appModule(this, 'admob', AdMob); - this.analytics = APPS.appModule(this, 'analytics', Analytics); - this.auth = APPS.appModule(this, 'auth', Auth); - this.config = APPS.appModule(this, 'config', Config); - this.crash = APPS.appModule(this, 'crash', Crash); - this.database = APPS.appModule(this, 'database', Database); + this.admob = APPS.appModule(this, AdmobNamespace, AdMob); + this.analytics = APPS.appModule(this, AnalyticsNamespace, Analytics); + this.auth = APPS.appModule(this, AuthNamespace, Auth); + this.config = APPS.appModule(this, ConfigNamespace, Config); + this.crash = APPS.appModule(this, CrashNamespace, Crash); + this.database = APPS.appModule(this, DatabaseNamespace, Database); this.fabric = { - crashlytics: APPS.appModule(this, 'crashlytics', Crashlytics), + crashlytics: APPS.appModule(this, CrashlyticsNamespace, Crashlytics), }; - this.firestore = APPS.appModule(this, 'firestore', Firestore); - this.links = APPS.appModule(this, 'links', Links); - this.messaging = APPS.appModule(this, 'messaging', Messaging); - this.perf = APPS.appModule(this, 'perf', Performance); - this.storage = APPS.appModule(this, 'storage', Storage); - this.utils = APPS.appModule(this, 'utils', Utils); + this.firestore = APPS.appModule(this, FirestoreNamespace, Firestore); + this.links = APPS.appModule(this, LinksNamespace, Links); + this.messaging = APPS.appModule(this, MessagingNamespace, Messaging); + this.perf = APPS.appModule(this, PerfNamespace, Performance); + this.storage = APPS.appModule(this, StorageNamespace, Storage); + this.utils = APPS.appModule(this, UtilsNamespace, Utils); this._extendedProps = {}; } @@ -89,13 +89,6 @@ export default class FirebaseApp { * @return {*} */ get name(): string { - if (this._name === INTERNALS.STRINGS.DEFAULT_APP_NAME) { - // ios and android firebase sdk's return different - // app names - so we just return what the web sdk - // would if it was default. - return '[DEFAULT]'; - } - return this._name; } @@ -138,7 +131,7 @@ export default class FirebaseApp { delete() { throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_CLASS_METHOD('app', 'delete')); // TODO only the ios sdk currently supports delete, add back in when android also supports it - // if (this._name === INTERNALS.STRINGS.DEFAULT_APP_NAME && this._nativeInitialized) { + // if (this._name === APPS.DEFAULT_APP_NAME && this._nativeInitialized) { // return Promise.reject( // new Error('Unable to delete the default native firebase app instance.'), // ); diff --git a/lib/modules/core/firebase.js b/lib/modules/core/firebase.js index 4dc60e88..7bd151b6 100644 --- a/lib/modules/core/firebase.js +++ b/lib/modules/core/firebase.js @@ -9,19 +9,19 @@ import INTERNALS from '../../utils/internals'; import FirebaseApp from './firebase-app'; // module imports -import AdMob, { statics as AdMobStatics } from '../admob'; -import Auth, { statics as AuthStatics } from '../auth'; -import Analytics, { statics as AnalyticsStatics } from '../analytics'; -import Config, { statics as ConfigStatics } from '../config'; -import Crash, { statics as CrashStatics } from '../crash'; -import Crashlytics, { statics as CrashlyticsStatics } from '../fabric/crashlytics'; -import Database, { statics as DatabaseStatics } from '../database'; -import Firestore, { statics as FirestoreStatics } from '../firestore'; -import Links, { statics as LinksStatics } from '../links'; -import Messaging, { statics as MessagingStatics } from '../messaging'; -import Performance, { statics as PerformanceStatics } from '../perf'; -import Storage, { statics as StorageStatics } from '../storage'; -import Utils, { statics as UtilsStatics } from '../utils'; +import { statics as AdMobStatics, MODULE_NAME as AdmobModuleName } from '../admob'; +import { statics as AuthStatics, MODULE_NAME as AuthModuleName } from '../auth'; +import { statics as AnalyticsStatics, MODULE_NAME as AnalyticsModuleName } from '../analytics'; +import { statics as ConfigStatics, MODULE_NAME as ConfigModuleName } from '../config'; +import { statics as CrashStatics, MODULE_NAME as CrashModuleName } from '../crash'; +import { statics as CrashlyticsStatics, MODULE_NAME as CrashlyticsModuleName } from '../fabric/crashlytics'; +import { statics as DatabaseStatics, MODULE_NAME as DatabaseModuleName } from '../database'; +import { statics as FirestoreStatics, MODULE_NAME as FirestoreModuleName } from '../firestore'; +import { statics as LinksStatics, MODULE_NAME as LinksModuleName } from '../links'; +import { statics as MessagingStatics, MODULE_NAME as MessagingModuleName } from '../messaging'; +import { statics as PerformanceStatics, MODULE_NAME as PerfModuleName } from '../perf'; +import { statics as StorageStatics, MODULE_NAME as StorageModuleName } from '../storage'; +import { statics as UtilsStatics, MODULE_NAME as UtilsModuleName } from '../utils'; import type { AdMobModule, @@ -64,21 +64,21 @@ class FirebaseCore { APPS.initializeNativeApps(); // modules - this.admob = APPS.moduleAndStatics('admob', AdMobStatics, AdMob); - this.analytics = APPS.moduleAndStatics('analytics', AnalyticsStatics, Analytics); - this.auth = APPS.moduleAndStatics('auth', AuthStatics, Auth); - this.config = APPS.moduleAndStatics('config', ConfigStatics, Config); - this.crash = APPS.moduleAndStatics('crash', CrashStatics, Crash); - this.database = APPS.moduleAndStatics('database', DatabaseStatics, Database); + this.admob = APPS.moduleAndStatics('admob', AdMobStatics, AdmobModuleName); + this.analytics = APPS.moduleAndStatics('analytics', AnalyticsStatics, AnalyticsModuleName); + this.auth = APPS.moduleAndStatics('auth', AuthStatics, AuthModuleName); + this.config = APPS.moduleAndStatics('config', ConfigStatics, ConfigModuleName); + this.crash = APPS.moduleAndStatics('crash', CrashStatics, CrashModuleName); + this.database = APPS.moduleAndStatics('database', DatabaseStatics, DatabaseModuleName); this.fabric = { - crashlytics: APPS.moduleAndStatics('crashlytics', CrashlyticsStatics, Crashlytics), + crashlytics: APPS.moduleAndStatics('crashlytics', CrashlyticsStatics, CrashlyticsModuleName), }; - this.firestore = APPS.moduleAndStatics('firestore', FirestoreStatics, Firestore); - this.links = APPS.moduleAndStatics('links', LinksStatics, Links); - this.messaging = APPS.moduleAndStatics('messaging', MessagingStatics, Messaging); - this.perf = APPS.moduleAndStatics('perf', PerformanceStatics, Performance); - this.storage = APPS.moduleAndStatics('storage', StorageStatics, Storage); - this.utils = APPS.moduleAndStatics('utils', UtilsStatics, Utils); + this.firestore = APPS.moduleAndStatics('firestore', FirestoreStatics, FirestoreModuleName); + this.links = APPS.moduleAndStatics('links', LinksStatics, LinksModuleName); + this.messaging = APPS.moduleAndStatics('messaging', MessagingStatics, MessagingModuleName); + this.perf = APPS.moduleAndStatics('perf', PerformanceStatics, PerfModuleName); + this.storage = APPS.moduleAndStatics('storage', StorageStatics, StorageModuleName); + this.utils = APPS.moduleAndStatics('utils', UtilsStatics, UtilsModuleName); } /** diff --git a/lib/modules/crash/index.js b/lib/modules/crash/index.js index 2844a65c..9d2a2042 100644 --- a/lib/modules/crash/index.js +++ b/lib/modules/crash/index.js @@ -7,12 +7,15 @@ import ModuleBase from '../../utils/ModuleBase'; import type FirebaseApp from '../core/firebase-app'; import type { FirebaseError } from '../../types'; -export default class Crash extends ModuleBase { - static _NAMESPACE = 'crash'; - static _NATIVE_MODULE = 'RNFirebaseCrash'; +export const MODULE_NAME = 'RNFirebaseCrash'; +export const NAMESPACE = 'crash'; +export default class Crash extends ModuleBase { constructor(firebaseApp: FirebaseApp, options: Object = {}) { - super(firebaseApp, options); + super(firebaseApp, options, { + moduleName: MODULE_NAME, + namespace: NAMESPACE, + }); } /** diff --git a/lib/modules/database/index.js b/lib/modules/database/index.js index 850f6152..cfac1094 100644 --- a/lib/modules/database/index.js +++ b/lib/modules/database/index.js @@ -15,19 +15,26 @@ const NATIVE_EVENTS = [ // 'database_server_offset', // TODO ]; +export const MODULE_NAME = 'RNFirebaseDatabase'; +export const NAMESPACE = 'database'; + /** * @class Database */ export default class Database extends ModuleBase { - static _NAMESPACE = 'database'; - static _NATIVE_MODULE = 'RNFirebaseDatabase'; - _offsetRef: Reference; _serverTimeOffset: number; _transactionHandler: TransactionHandler; constructor(firebaseApp: FirebaseApp, options: Object = {}) { - super(firebaseApp, options, NATIVE_EVENTS); + super(firebaseApp, { + persistence: false, + ...options, + }, { + events: NATIVE_EVENTS, + moduleName: MODULE_NAME, + namespace: NAMESPACE, + }); this._transactionHandler = new TransactionHandler(this); if (this._options.persistence) { @@ -84,8 +91,8 @@ export const statics = { TIMESTAMP: NativeModules.RNFirebaseDatabase.serverValueTimestamp || { '.sv': 'timestamp' }, } : {}, enableLogging(enabled: boolean) { - if (NativeModules[Database._NATIVE_MODULE]) { - NativeModules[Database._NATIVE_MODULE].enableLogging(enabled); + if (NativeModules[MODULE_NAME]) { + NativeModules[MODULE_NAME].enableLogging(enabled); } }, }; diff --git a/lib/modules/database/reference.js b/lib/modules/database/reference.js index 43d61b9f..fbb2a7e2 100644 --- a/lib/modules/database/reference.js +++ b/lib/modules/database/reference.js @@ -18,11 +18,10 @@ import { generatePushID, } from '../../utils'; -import INTERNALS from '../../utils/internals'; +import SyncTree from '../../utils/SyncTree'; import type Database from './'; import type { DatabaseModifier, FirebaseError } from '../../types'; -import type SyncTree from '../../utils/SyncTree'; // track all event registrations by path let listeners = 0; @@ -537,7 +536,7 @@ export default class Reference extends ReferenceBase { * @return {string} */ _getRegistrationKey(eventType: string): string { - return `$${this._database._appName}$/${this.path}$${this._query.queryIdentifier()}$${listeners}$${eventType}`; + return `$${this._database.app.name}$/${this.path}$${this._query.queryIdentifier()}$${listeners}$${eventType}`; } /** @@ -548,7 +547,7 @@ export default class Reference extends ReferenceBase { * @private */ _getRefKey(): string { - return `$${this._database._appName}$/${this.path}$${this._query.queryIdentifier()}`; + return `$${this._database.app.name}$/${this.path}$${this._query.queryIdentifier()}`; } /** @@ -654,23 +653,23 @@ export default class Reference extends ReferenceBase { ref: this, path: this.path, key: this._getRefKey(), - appName: this._database._appName, + appName: this._database.app.name, eventRegistrationKey, }; - this._syncTree.addRegistration(registrationObj, _context ? callback.bind(_context) : callback); + SyncTree.addRegistration(registrationObj, _context ? callback.bind(_context) : callback); if (isFunction(cancelCallbackOrContext)) { // cancellations have their own separate registration // as these are one off events, and they're not guaranteed // to occur either, only happens on failure to register on native - this._syncTree.addRegistration( + SyncTree.addRegistration( { ref: this, once: true, path: this.path, key: this._getRefKey(), - appName: this._database._appName, + appName: this._database.app.name, eventType: `${eventType}$cancelled`, eventRegistrationKey: registrationCancellationKey, }, @@ -683,7 +682,7 @@ export default class Reference extends ReferenceBase { eventType, path: this.path, key: this._getRefKey(), - appName: this._database._appName, + appName: this._database.app.name, modifiers: this._query.getModifiers(), hasCancellationCallback: isFunction(cancelCallbackOrContext), registration: { @@ -721,7 +720,7 @@ export default class Reference extends ReferenceBase { if (!arguments.length) { // Firebase Docs: // if no eventType or callback is specified, all callbacks for the Reference will be removed. - return this._syncTree.removeListenersForRegistrations(this._syncTree.getRegistrationsByPath(this.path)); + return SyncTree.removeListenersForRegistrations(SyncTree.getRegistrationsByPath(this.path)); } /* @@ -742,29 +741,25 @@ export default class Reference extends ReferenceBase { // remove the callback. // Remove only a single registration if (eventType && originalCallback) { - const registration = this._syncTree.getOneByPathEventListener(this.path, eventType, originalCallback); + const registration = SyncTree.getOneByPathEventListener(this.path, eventType, originalCallback); if (!registration) return []; // remove the paired cancellation registration if any exist - this._syncTree.removeListenersForRegistrations([`${registration}$cancelled`]); + SyncTree.removeListenersForRegistrations([`${registration}$cancelled`]); // remove only the first registration to match firebase web sdk // call multiple times to remove multiple registrations - return this._syncTree.removeListenerRegistrations(originalCallback, [registration]); + return SyncTree.removeListenerRegistrations(originalCallback, [registration]); } // Firebase Docs: // If a callback is not specified, all callbacks for the specified eventType will be removed. - const registrations = this._syncTree.getRegistrationsByPathEvent(this.path, eventType); + const registrations = SyncTree.getRegistrationsByPathEvent(this.path, eventType); - this._syncTree.removeListenersForRegistrations( - this._syncTree.getRegistrationsByPathEvent(this.path, `${eventType}$cancelled`), + SyncTree.removeListenersForRegistrations( + SyncTree.getRegistrationsByPathEvent(this.path, `${eventType}$cancelled`), ); - return this._syncTree.removeListenersForRegistrations(registrations); - } - - get _syncTree(): SyncTree { - return INTERNALS.SyncTree; + return SyncTree.removeListenersForRegistrations(registrations); } } diff --git a/lib/modules/fabric/crashlytics/index.js b/lib/modules/fabric/crashlytics/index.js index 6ab1d9f9..5c55bb0c 100644 --- a/lib/modules/fabric/crashlytics/index.js +++ b/lib/modules/fabric/crashlytics/index.js @@ -6,12 +6,15 @@ import ModuleBase from '../../../utils/ModuleBase'; import type FirebaseApp from '../../core/firebase-app'; -export default class Crashlytics extends ModuleBase { - static _NAMESPACE = 'crashlytics'; - static _NATIVE_MODULE = 'RNFirebaseCrashlytics'; +export const MODULE_NAME = 'RNFirebaseCrashlytics'; +export const NAMESPACE = 'crashlytics'; +export default class Crashlytics extends ModuleBase { constructor(firebaseApp: FirebaseApp, options: Object = {}) { - super(firebaseApp, options); + super(firebaseApp, options, { + moduleName: MODULE_NAME, + namespace: NAMESPACE, + }); } /** diff --git a/lib/modules/firestore/index.js b/lib/modules/firestore/index.js index c3d3a0fb..ac78e497 100644 --- a/lib/modules/firestore/index.js +++ b/lib/modules/firestore/index.js @@ -39,17 +39,21 @@ const NATIVE_EVENTS = [ 'firestore_document_sync_event', ]; +export const MODULE_NAME = 'RNFirebaseFirestore'; +export const NAMESPACE = 'firestore'; + /** * @class Firestore */ export default class Firestore extends ModuleBase { - static _NAMESPACE = 'firestore'; - static _NATIVE_MODULE = 'RNFirebaseFirestore'; - _referencePath: Path; constructor(firebaseApp: FirebaseApp, options: Object = {}) { - super(firebaseApp, options, NATIVE_EVENTS); + super(firebaseApp, options, { + events: NATIVE_EVENTS, + moduleName: MODULE_NAME, + namespace: NAMESPACE, + }); this._referencePath = new Path([]); SharedEventEmitter.addListener( @@ -108,7 +112,7 @@ export default class Firestore extends ModuleBase { } setLogLevel(): void { - throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_MODULE_METHOD(Firestore, 'setLogLevel')); + throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_MODULE_METHOD('firestore', 'setLogLevel')); } settings(): void { @@ -145,9 +149,9 @@ export default class Firestore extends ModuleBase { export const statics = { FieldValue, GeoPoint, - enableLogging(bool) { - if (NativeModules[Firestore._NATIVE_MODULE]) { - NativeModules[Firestore._NATIVE_MODULE].enableLogging(bool); + enableLogging(enabled: boolean) { + if (NativeModules[MODULE_NAME]) { + NativeModules[MODULE_NAME].enableLogging(enabled); } }, }; diff --git a/lib/modules/links/index.js b/lib/modules/links/index.js index fc36c1ae..411a2427 100644 --- a/lib/modules/links/index.js +++ b/lib/modules/links/index.js @@ -16,6 +16,9 @@ const NATIVE_EVENTS = [ EVENT_TYPE.Link, ]; +export const MODULE_NAME = 'RNFirebaseLinks'; +export const NAMESPACE = 'links'; + function validateParameters(parameters: Object): void { const suportedParametersObject = { dynamicLinkDomain: 'string', @@ -67,11 +70,12 @@ function checkForMandatoryParameters(parameters: Object): void { * @class Links */ export default class Links extends ModuleBase { - static _NAMESPACE = 'links'; - static _NATIVE_MODULE = 'RNFirebaseLinks'; - constructor(firebaseApp: FirebaseApp, options: Object = {}) { - super(firebaseApp, options, NATIVE_EVENTS); + super(firebaseApp, options, { + events: NATIVE_EVENTS, + moduleName: MODULE_NAME, + namespace: NAMESPACE, + }); } get EVENT_TYPE(): Object { diff --git a/lib/modules/messaging/index.js b/lib/modules/messaging/index.js index 091b5b05..ab365583 100644 --- a/lib/modules/messaging/index.js +++ b/lib/modules/messaging/index.js @@ -79,16 +79,19 @@ function finish(data) { } } +export const MODULE_NAME = 'RNFirebaseMessaging'; +export const NAMESPACE = 'messaging'; /** * @class Messaging */ export default class Messaging extends ModuleBase { - static _NAMESPACE = 'messaging'; - static _NATIVE_MODULE = 'RNFirebaseMessaging'; - constructor(firebaseApp: FirebaseApp, options: Object = {}) { - super(firebaseApp, options, NATIVE_EVENTS); + super(firebaseApp, options, { + events: NATIVE_EVENTS, + moduleName: MODULE_NAME, + namespace: NAMESPACE, + }); } get EVENT_TYPE(): Object { diff --git a/lib/modules/perf/index.js b/lib/modules/perf/index.js index 81d3a5d1..7ac349c3 100644 --- a/lib/modules/perf/index.js +++ b/lib/modules/perf/index.js @@ -7,12 +7,15 @@ import ModuleBase from '../../utils/ModuleBase'; import type FirebaseApp from '../core/firebase-app'; -export default class PerformanceMonitoring extends ModuleBase { - static _NAMESPACE = 'perf'; - static _NATIVE_MODULE = 'RNFirebasePerformance'; +export const MODULE_NAME = 'RNFirebasePerformance'; +export const NAMESPACE = 'perf'; +export default class PerformanceMonitoring extends ModuleBase { constructor(firebaseApp: FirebaseApp, options: Object = {}) { - super(firebaseApp, options); + super(firebaseApp, options, { + moduleName: MODULE_NAME, + namespace: NAMESPACE, + }); } /** diff --git a/lib/modules/storage/index.js b/lib/modules/storage/index.js index 358f7594..77f0400f 100644 --- a/lib/modules/storage/index.js +++ b/lib/modules/storage/index.js @@ -18,17 +18,21 @@ const NATIVE_EVENTS = [ 'storage_error', ]; -export default class Storage extends ModuleBase { - static _NAMESPACE = 'storage'; - static _NATIVE_MODULE = 'RNFirebaseStorage'; +export const MODULE_NAME = 'RNFirebaseStorage'; +export const NAMESPACE = 'storage'; +export default class Storage extends ModuleBase { /** * * @param firebaseApp * @param options */ constructor(firebaseApp: FirebaseApp, options: Object = {}) { - super(firebaseApp, options, NATIVE_EVENTS); + super(firebaseApp, options, { + events: NATIVE_EVENTS, + moduleName: MODULE_NAME, + namespace: NAMESPACE, + }); SharedEventEmitter.addListener( getAppEventName(this, 'storage_event'), diff --git a/lib/modules/utils/index.js b/lib/modules/utils/index.js index e72f9beb..9e3cc5db 100644 --- a/lib/modules/utils/index.js +++ b/lib/modules/utils/index.js @@ -2,7 +2,6 @@ import { NativeModules } from 'react-native'; // import { version as ReactVersion } from 'react'; // import ReactNativeVersion from 'react-native/Libraries/Core/ReactNativeVersion'; - import INTERNALS from '../../utils/internals'; import { isIOS } from '../../utils'; import ModuleBase from '../../utils/ModuleBase'; @@ -18,18 +17,17 @@ type GoogleApiAvailabilityType = { error?: string } -export default class RNFirebaseUtils extends ModuleBase { - static _NAMESPACE = 'utils'; - static _NATIVE_DISABLED = true; - static _NATIVE_MODULE = 'RNFirebaseUtils'; +export const MODULE_NAME = 'RNFirebaseUtils'; +export const NAMESPACE = 'utils'; +export default class RNFirebaseUtils extends ModuleBase { /** * */ checkPlayServicesAvailability() { if (isIOS) return null; - const code = this.playServicesAvailability.code; + const { code } = this.playServicesAvailability; if (!this.playServicesAvailability.isAvailable) { if (INTERNALS.OPTIONS.promptOnMissingPlayServices && this.playServicesAvailability.isUserResolvableError) { @@ -72,30 +70,6 @@ export default class RNFirebaseUtils extends ModuleBase { INTERNALS.OPTIONS.logLevel = booleanOrDebugString; } - - /** - * Returns an array of all current database registrations id strings - */ - get databaseRegistrations(): Array { - return Object.keys(INTERNALS.SyncTree._reverseLookup); - } - - /** - * Call with a registration id string to get the details off this reg - */ - get getDatabaseRegistrationDetails(): Function { - return INTERNALS.SyncTree.getRegistration.bind(INTERNALS.SyncTree); - } - - /** - * Accepts an array or a single string of registration ids. - * This will remove the refs on both the js and native sides and their listeners. - * @return {function(this:T)} - */ - get removeDatabaseRegistration(): Function { - return INTERNALS.SyncTree.removeListenersForRegistrations.bind(INTERNALS.SyncTree); - } - /** * Returns props from the android GoogleApiAvailability sdk * @android @@ -126,7 +100,6 @@ export default class RNFirebaseUtils extends ModuleBase { export const statics = { - DEFAULT_APP_NAME: INTERNALS.STRINGS.DEFAULT_APP_NAME, // VERSIONS: { // react: ReactVersion, // 'react-native': Object.values(ReactNativeVersion.version).slice(0, 3).join('.'), diff --git a/lib/types/index.js b/lib/types/index.js index d002a2a7..31588854 100644 --- a/lib/types/index.js +++ b/lib/types/index.js @@ -40,7 +40,18 @@ export type FirebaseError = { export type FirebaseModule = $Subtype; -export type FirebaseModuleName = 'admob' | 'analytics' | 'auth' | 'config' | 'crash' +export type FirebaseModuleConfig = { + events?: string[], + moduleName: FirebaseModuleName, + namespace: FirebaseNamespace, +} + +export type FirebaseModuleName = 'RNFirebaseAdmob' | 'RNFirebaseAnalytics' | 'RNFirebaseAuth' + | 'RNFirebaseRemoteConfig' | 'RNFirebaseCrash' | 'RNFirebaseCrashlytics' | 'RNFirebaseDatabase' + | 'RNFirebaseFirestore' | 'RNFirebaseLinks' | 'RNFirebaseMessaging' | 'RNFirebasePerformance' + | 'RNFirebaseStorage' | 'RNFirebaseUtils'; + +export type FirebaseNamespace = 'admob' | 'analytics' | 'auth' | 'config' | 'crash' | 'crashlytics' | 'database' | 'firestore' | 'links' | 'messaging' | 'perf' | 'storage' | 'utils'; diff --git a/lib/utils/ModuleBase.js b/lib/utils/ModuleBase.js index cb0a974f..c93ba6ba 100644 --- a/lib/utils/ModuleBase.js +++ b/lib/utils/ModuleBase.js @@ -1,27 +1,16 @@ /** * @flow */ -import { initialiseNativeModuleEventEmitter } from './events'; -import { getNativeModule, initialiseNativeModule } from './native'; +import { initialiseLogger } from './log'; +import { initialiseNativeModule } from './native'; import type FirebaseApp from '../modules/core/firebase-app'; -import type { FirebaseModuleName } from '../types'; - -const DEFAULTS = { - Database: { - persistence: false, - }, -}; +import type { FirebaseModuleConfig } from '../types'; export default class ModuleBase { - _native: Object; - _module: string; - _options: Object; - _appName: string; - _namespace: string; _firebaseApp: FirebaseApp; - static _NAMESPACE: FirebaseModuleName; - static _NATIVE_MODULE: string; + _native: Object; + _options: Object; /** * @@ -29,19 +18,21 @@ export default class ModuleBase { * @param options * @param withEventEmitter */ - constructor(firebaseApp: FirebaseApp, options: Object, events: string[] = []) { - this._module = this.constructor._NATIVE_MODULE.replace('RNFirebase', ''); + constructor(firebaseApp: FirebaseApp, options: Object, config: FirebaseModuleConfig) { + if (!config.moduleName) { + throw new Error('Missing module name'); + } + if (!config.namespace) { + throw new Error('Missing namespace'); + } + const { moduleName } = config; this._firebaseApp = firebaseApp; - this._appName = firebaseApp._name; - this._namespace = `${this._appName}:${this._module}`; - this._options = Object.assign({}, DEFAULTS[this._module] || {}, options); + this._options = options; // check if native module exists as all native - initialiseNativeModule(this); - // TODO: Get rid of - this._native = getNativeModule(this); - - initialiseNativeModuleEventEmitter(this, events); + // TODO: Get rid of this._native and change to using getNativeModule instead? + this._native = initialiseNativeModule(this, config); + initialiseLogger(this, `${firebaseApp.name}:${moduleName.replace('RNFirebase', '')}`); } /** diff --git a/lib/utils/SyncTree.js b/lib/utils/SyncTree.js index a1849bb3..c4213365 100644 --- a/lib/utils/SyncTree.js +++ b/lib/utils/SyncTree.js @@ -1,7 +1,7 @@ /** * @flow */ -import { NativeEventEmitter } from 'react-native'; +import { NativeEventEmitter, NativeModules } from 'react-native'; import { SharedEventEmitter } from './events'; import DatabaseSnapshot from '../modules/database/snapshot'; @@ -23,21 +23,21 @@ type Registration = { * Internally used to manage firebase database realtime event * subscriptions and keep the listeners in sync in js vs native. */ -export default class SyncTree { - _databaseNative: Object; +class SyncTree { _nativeEmitter: NativeEventEmitter; _reverseLookup: { [string]: Registration }; - _tree: { [string]: { [string]: Array }}; + _tree: { [string]: { [string]: { [string]: Function }}}; - constructor(databaseNative: Object) { + constructor() { this._tree = {}; this._reverseLookup = {}; - this._databaseNative = databaseNative; - this._nativeEmitter = new NativeEventEmitter(databaseNative); - this._nativeEmitter.addListener( - 'database_sync_event', - this._handleSyncEvent.bind(this), - ); + if (NativeModules.RNFirebaseDatabase) { + this._nativeEmitter = new NativeEventEmitter(NativeModules.RNFirebaseDatabase); + this._nativeEmitter.addListener( + 'database_sync_event', + this._handleSyncEvent.bind(this), + ); + } } /** @@ -71,7 +71,7 @@ export default class SyncTree { // notify native that the registration // no longer exists so it can remove // the native listeners - return this._databaseNative.off(key, eventRegistrationKey); + return NativeModules.RNFirebaseDatabase.off(key, eventRegistrationKey); } const { snapshot, previousChildName } = event.data; @@ -287,7 +287,7 @@ export default class SyncTree { // automatically unsubscribed on native when the first event is sent const registrationObj = this._reverseLookup[registration]; if (registrationObj && !once) { - this._databaseNative.off(registrationObj.key, registration); + NativeModules.RNFirebaseDatabase.off(registrationObj.key, registration); } delete this._tree[path][eventType][registration]; @@ -311,3 +311,5 @@ export default class SyncTree { }; } } + +export default new SyncTree(); diff --git a/lib/utils/apps.js b/lib/utils/apps.js index 2d39e0f6..fcef8fa1 100644 --- a/lib/utils/apps.js +++ b/lib/utils/apps.js @@ -10,6 +10,7 @@ import type { FirebaseModule, FirebaseModuleAndStatics, FirebaseModuleName, + FirebaseNamespace, FirebaseOptions, FirebaseStatics, } from '../types'; @@ -18,10 +19,13 @@ const FirebaseCoreModule = NativeModules.RNFirebase; const APPS: { [string]: FirebaseApp } = {}; const APP_MODULES: { [FirebaseApp]: { [string]: FirebaseModule }} = {}; +const DEFAULT_APP_NAME = '[DEFAULT]'; export default { + DEFAULT_APP_NAME, + app(name?: string): FirebaseApp { - const _name = name ? name.toUpperCase() : INTERNALS.STRINGS.DEFAULT_APP_NAME; + const _name = name ? name.toUpperCase() : DEFAULT_APP_NAME; const app = APPS[_name]; if (!app) throw new Error(INTERNALS.STRINGS.ERROR_APP_NOT_INIT(_name)); return app; @@ -38,22 +42,22 @@ export default { * @return {function()} * @private */ - appModule(firebaseApp: FirebaseApp, moduleName: FirebaseModuleName, InstanceClass: Class): () => FirebaseModule { + appModule(firebaseApp: FirebaseApp, namespace: FirebaseNamespace, InstanceClass: Class): () => FirebaseModule { return (): M => { if (!APP_MODULES[firebaseApp]) { APP_MODULES[firebaseApp] = {}; } - if (isAndroid && moduleName !== 'utils' && !INTERNALS.FLAGS.checkedPlayServices) { + if (isAndroid && namespace !== 'utils' && !INTERNALS.FLAGS.checkedPlayServices) { INTERNALS.FLAGS.checkedPlayServices = true; this.utils().checkPlayServicesAvailability(); } - if (!APP_MODULES[firebaseApp][moduleName]) { - APP_MODULES[firebaseApp][moduleName] = new InstanceClass(firebaseApp, this._options); + if (!APP_MODULES[firebaseApp][namespace]) { + APP_MODULES[firebaseApp][namespace] = new InstanceClass(firebaseApp, firebaseApp.options); } - return APP_MODULES[firebaseApp][moduleName]; + return APP_MODULES[firebaseApp][namespace]; }; }, @@ -80,7 +84,7 @@ export default { throw new Error(INTERNALS.STRINGS.ERROR_INIT_STRING_NAME); } - const _name = (name || INTERNALS.STRINGS.DEFAULT_APP_NAME).toUpperCase(); + const _name = (name || DEFAULT_APP_NAME).toUpperCase(); // return an existing app if found // todo in v4 remove deprecation and throw an error @@ -143,25 +147,25 @@ export default { * @param InstanceClass * @return {function(FirebaseApp=)} */ - moduleAndStatics(moduleName: FirebaseModuleName, statics: S, InstanceClass: Class): FirebaseModuleAndStatics { + moduleAndStatics(namespace: FirebaseNamespace, statics: S, moduleName: FirebaseModuleName): FirebaseModuleAndStatics { const getModule = (app?: FirebaseApp): FirebaseModule => { let firebaseApp = app; // throw an error if it's not a valid app instance - if (firebaseApp && !(firebaseApp instanceof FirebaseApp)) throw new Error(INTERNALS.STRINGS.ERROR_NOT_APP(moduleName)); + if (firebaseApp && !(firebaseApp instanceof FirebaseApp)) throw new Error(INTERNALS.STRINGS.ERROR_NOT_APP(namespace)); // default to the 'DEFAULT' app if no arg provided - will throw an error // if default app not initialized - else if (!firebaseApp) firebaseApp = this.app(INTERNALS.STRINGS.DEFAULT_APP_NAME); - if (moduleName === 'crashlytics') { - return firebaseApp.fabric[moduleName](); + else if (!firebaseApp) firebaseApp = this.app(DEFAULT_APP_NAME); + if (namespace === 'crashlytics') { + return firebaseApp.fabric[namespace](); } - const module = firebaseApp[moduleName]; + const module = firebaseApp[namespace]; return module(); }; return Object.assign(getModule, statics, { - nativeModuleExists: !!NativeModules[InstanceClass._NATIVE_MODULE], + nativeModuleExists: !!NativeModules[moduleName], }); }, }; diff --git a/lib/utils/events.js b/lib/utils/events.js index 90be83c1..659be82b 100644 --- a/lib/utils/events.js +++ b/lib/utils/events.js @@ -1,11 +1,11 @@ /** * @flow */ -import { NativeEventEmitter } from 'react-native'; +import { NativeEventEmitter, NativeModules } from 'react-native'; import EventEmitter from './emitter/EventEmitter'; -import { getRawNativeModule } from './native'; import type ModuleBase from './ModuleBase'; +import type { FirebaseModuleConfig, FirebaseModuleName } from '../types'; const NATIVE_EMITTERS: { [string]: NativeEventEmitter } = {}; const NATIVE_SUBSCRIPTIONS: { [string]: boolean } = {}; @@ -16,9 +16,9 @@ export const getAppEventName = (module: ModuleBase, eventName: string): string = return `${module._firebaseApp._name}-${eventName}`; }; -const getNativeEmitter = (module: ModuleBase): NativeEventEmitter => { - const name = `${module._appName}-${module._module}`; - const nativeModule = getRawNativeModule(module); +const getNativeEmitter = (moduleName: FirebaseModuleName, module: ModuleBase): NativeEventEmitter => { + const name = `${module.app.name}-${moduleName}`; + const nativeModule = NativeModules[moduleName]; if (!NATIVE_EMITTERS[name]) { NATIVE_EMITTERS[name] = new NativeEventEmitter(nativeModule); } @@ -35,9 +35,9 @@ const getNativeEmitter = (module: ModuleBase): NativeEventEmitter => { * @param eventName * @private */ -const subscribeToNativeModuleEvents = (module: ModuleBase, eventName: string): void => { +const subscribeToNativeModuleEvents = (moduleName: FirebaseModuleName, module: ModuleBase, eventName: string): void => { if (!NATIVE_SUBSCRIPTIONS[eventName]) { - const nativeEmitter = getNativeEmitter(module); + const nativeEmitter = getNativeEmitter(moduleName, module); nativeEmitter.addListener(eventName, (event) => { if (event.appName) { // native event has an appName property - auto prefix and internally emit @@ -52,10 +52,11 @@ const subscribeToNativeModuleEvents = (module: ModuleBase, eventName: string): v } }; -export const initialiseNativeModuleEventEmitter = (module: ModuleBase, events: string[]): void => { +export const initialiseNativeModuleEventEmitter = (module: ModuleBase, config: FirebaseModuleConfig): void => { + const { events, moduleName } = config; if (events && events.length) { for (let i = 0, len = events.length; i < len; i++) { - subscribeToNativeModuleEvents(module, events[i]); + subscribeToNativeModuleEvents(moduleName, module, events[i]); } } }; diff --git a/lib/utils/internals.js b/lib/utils/internals.js index 53bbc73c..907c63da 100644 --- a/lib/utils/internals.js +++ b/lib/utils/internals.js @@ -1,12 +1,7 @@ /** * @flow */ -import { Platform, NativeModules } from 'react-native'; - -import ModuleBase from './ModuleBase'; -import SyncTree from './SyncTree'; - -const DEFAULT_APP_NAME = Platform.OS === 'ios' ? '__FIRAPP_DEFAULT' : '[DEFAULT]'; +import { Platform } from 'react-native'; const NAMESPACE_PODS = { admob: 'Firebase/AdMob', @@ -186,8 +181,8 @@ export default { /** * @return {string} */ - ERROR_UNSUPPORTED_MODULE_METHOD(module: Class, method: string) { - return `firebase.${module._NAMESPACE}().${method}() is unsupported by the native Firebase SDKs.`; + ERROR_UNSUPPORTED_MODULE_METHOD(namespace: string, method: string) { + return `firebase.${namespace}().${method}() is unsupported by the native Firebase SDKs.`; }, @@ -214,10 +209,5 @@ export default { 'For more information on how to resolve this issue, configure Play Services checks or for guides on how to validate Play Services on your users devices see the link below:' + '\r\n\r\nhttp://invertase.link/play-services'; }, - - - DEFAULT_APP_NAME, }, - - SyncTree: NativeModules.RNFirebaseDatabase ? new SyncTree(NativeModules.RNFirebaseDatabase) : null, }; diff --git a/lib/utils/log.js b/lib/utils/log.js index 73f5f83d..e16eca99 100644 --- a/lib/utils/log.js +++ b/lib/utils/log.js @@ -14,11 +14,12 @@ import type ModuleBase from './ModuleBase'; const NATIVE_LOGGERS: { [ModuleBase]: Object } = {}; -export const getLogger = (module: ModuleBase) => { +export const getLogger = (module: ModuleBase) => NATIVE_LOGGERS[module]; + +export const initialiseLogger = (module: ModuleBase, logNamespace: string) => { if (!NATIVE_LOGGERS[module]) { - NATIVE_LOGGERS[module] = require('bows')(`🔥 ${module._namespace.toUpperCase()}`); + NATIVE_LOGGERS[module] = require('bows')(`🔥 ${logNamespace.toUpperCase()}`); } - return NATIVE_LOGGERS[module]; }; export default class Log { diff --git a/lib/utils/native.js b/lib/utils/native.js index a6ff5926..d6404a47 100644 --- a/lib/utils/native.js +++ b/lib/utils/native.js @@ -2,20 +2,21 @@ * @flow */ import { NativeModules } from 'react-native'; +import { initialiseNativeModuleEventEmitter } from './events'; import INTERNALS from './internals'; import type ModuleBase from './ModuleBase'; +import type { FirebaseModuleConfig } from '../types'; // Firebase Native SDKs that support multiple app instances const MULTI_APP_MODULES = [ - 'auth', - 'database', - 'firestore', - 'storage', + 'RNFirebaseAuth', + 'RNFirebaseDatabase', + 'RNFirebaseFirestore', + 'RNFirebaseStorage', ]; const NATIVE_MODULES: { [ModuleBase]: Object } = {}; -const RAW_NATIVE_MODULES: { [ModuleBase]: Object } = {}; /** * Prepends appName arg to all native method calls @@ -40,23 +41,23 @@ export const getNativeModule = (module: ModuleBase): Object => { return NATIVE_MODULES[module]; }; -export const getRawNativeModule = (module: ModuleBase): Object => { - return RAW_NATIVE_MODULES[module]; -}; +export const initialiseNativeModule = (module: ModuleBase, config: FirebaseModuleConfig): Object => { + const { moduleName, namespace } = config; + const nativeModule = NativeModules[moduleName]; -export const initialiseNativeModule = (module: ModuleBase): void => { - const nativeModule = NativeModules[module.constructor._NATIVE_MODULE]; - - if (!nativeModule && !module.constructor._NATIVE_DISABLED) { - throw new Error(INTERNALS.STRINGS.ERROR_MISSING_MODULE(module.constructor._NAMESPACE, module.constructor._NATIVE_MODULE)); + if (!nativeModule && namespace !== 'utils') { + throw new Error(INTERNALS.STRINGS.ERROR_MISSING_MODULE(namespace, moduleName)); } // used by the modules that extend ModuleBase // to access their native module counterpart - RAW_NATIVE_MODULES[module] = nativeModule; - if (!MULTI_APP_MODULES.includes(module._module.toLowerCase())) { + if (!MULTI_APP_MODULES.includes(moduleName)) { NATIVE_MODULES[module] = nativeModule; } else { - NATIVE_MODULES[module] = nativeWithApp(module._appName, nativeModule); + NATIVE_MODULES[module] = nativeWithApp(module.app.name, nativeModule); } + + initialiseNativeModuleEventEmitter(module, config); + + return NATIVE_MODULES[module]; }; diff --git a/tests/src/tests/core/coreTests.js b/tests/src/tests/core/coreTests.js index b7e971a4..5134dcbe 100644 --- a/tests/src/tests/core/coreTests.js +++ b/tests/src/tests/core/coreTests.js @@ -53,7 +53,7 @@ function coreTests({ describe, it }) { it('it should provide an array of apps', () => { should.equal(!!RNFirebase.apps.length, true); - should.equal(RNFirebase.apps.includes(RNFirebase.app(RNFirebase.utils.DEFAULT_APP_NAME)), true); + should.equal(RNFirebase.apps.includes(RNFirebase.app('[DEFAULT]')), true); return Promise.resolve(); });