[internals] More tidy up and hiding of internal functions
This commit is contained in:
parent
1f29354145
commit
0fe2fec819
|
@ -1,4 +1,5 @@
|
|||
#import "RNFirebase.h"
|
||||
#import "RNFirebaseUtil.h"
|
||||
#import <FirebaseCore/FirebaseCore.h>
|
||||
|
||||
@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;
|
||||
|
|
|
@ -3,11 +3,15 @@
|
|||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <React/RCTEventEmitter.h>
|
||||
#import <Firebase.h>
|
||||
|
||||
@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
|
||||
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
|
|
@ -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<NSString *> *_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,
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -5,14 +5,14 @@
|
|||
#if __has_include(<FirebaseDatabase/FIRDatabase.h>)
|
||||
|
||||
- (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) {
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
+ (void)promiseRejectException:(RCTPromiseRejectBlock)reject error:(NSError *)error;
|
||||
|
||||
+ (FIRFirestore *)getFirestoreForApp:(NSString *)appName;
|
||||
+ (FIRFirestore *)getFirestoreForApp:(NSString *)appDisplayName;
|
||||
+ (NSDictionary *)getJSError:(NSError *)nativeError;
|
||||
|
||||
@end
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<FIRListenerRegistration> 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"];
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"];
|
||||
|
|
|
@ -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}];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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'));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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.'),
|
||||
// );
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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<string> {
|
||||
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('.'),
|
||||
|
|
|
@ -40,7 +40,18 @@ export type FirebaseError = {
|
|||
|
||||
export type FirebaseModule = $Subtype<ModuleBase>;
|
||||
|
||||
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';
|
||||
|
||||
|
|
|
@ -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', '')}`);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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<M: FirebaseModule>(firebaseApp: FirebaseApp, moduleName: FirebaseModuleName, InstanceClass: Class<M>): () => FirebaseModule {
|
||||
appModule<M: FirebaseModule>(firebaseApp: FirebaseApp, namespace: FirebaseNamespace, InstanceClass: Class<M>): () => 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<M: FirebaseModule, S: FirebaseStatics>(moduleName: FirebaseModuleName, statics: S, InstanceClass: Class<M>): FirebaseModuleAndStatics<M, S> {
|
||||
moduleAndStatics<M: FirebaseModule, S: FirebaseStatics>(namespace: FirebaseNamespace, statics: S, moduleName: FirebaseModuleName): FirebaseModuleAndStatics<M, S> {
|
||||
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],
|
||||
});
|
||||
},
|
||||
};
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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<ModuleBase>, 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,
|
||||
};
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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];
|
||||
};
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
|
||||
|
|
Loading…
Reference in New Issue