@react-native-firebase/auth 25.1.0 → 26.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/RNFBAuth.podspec +16 -7
  3. package/android/build.gradle +23 -0
  4. package/android/src/main/java/io/invertase/firebase/auth/{ReactNativeFirebaseAuthModule.java → NativeRNFBTurboAuth.java} +131 -103
  5. package/android/src/main/java/io/invertase/firebase/auth/ReactNativeFirebaseAuthPackage.java +1 -1
  6. package/android/src/main/java/io/invertase/firebase/auth/ReactNativeFirebaseAuthSyncException.java +35 -0
  7. package/android/src/main/java/io/invertase/firebase/auth/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAuthSpec.java +308 -0
  8. package/android/src/main/java/io/invertase/firebase/auth/generated/jni/CMakeLists.txt +36 -0
  9. package/android/src/main/java/io/invertase/firebase/auth/generated/jni/RNFBAuthTurboModules-generated.cpp +392 -0
  10. package/android/src/main/java/io/invertase/firebase/auth/generated/jni/RNFBAuthTurboModules.h +31 -0
  11. package/android/src/main/java/io/invertase/firebase/auth/generated/jni/react/renderer/components/RNFBAuthTurboModules/RNFBAuthTurboModulesJSI-generated.cpp +539 -0
  12. package/android/src/main/java/io/invertase/firebase/auth/generated/jni/react/renderer/components/RNFBAuthTurboModules/RNFBAuthTurboModulesJSI.h +611 -0
  13. package/app.plugin.js +1 -1
  14. package/dist/module/ConfirmationResult.js.map +1 -1
  15. package/dist/module/MultiFactorResolver.js.map +1 -1
  16. package/dist/module/PhoneAuthListener.js +3 -4
  17. package/dist/module/PhoneAuthListener.js.map +1 -1
  18. package/dist/module/TotpMultiFactorGenerator.js +1 -1
  19. package/dist/module/TotpMultiFactorGenerator.js.map +1 -1
  20. package/dist/module/TotpSecret.js +15 -9
  21. package/dist/module/TotpSecret.js.map +1 -1
  22. package/dist/module/User.js +1 -1
  23. package/dist/module/User.js.map +1 -1
  24. package/dist/module/credentials/OAuthCredential.js +22 -1
  25. package/dist/module/credentials/OAuthCredential.js.map +1 -1
  26. package/dist/module/getMultiFactorResolver.js +2 -2
  27. package/dist/module/getMultiFactorResolver.js.map +1 -1
  28. package/dist/module/index.js +1226 -6
  29. package/dist/module/index.js.map +1 -1
  30. package/dist/module/internal/syncNativeError.js +75 -0
  31. package/dist/module/internal/syncNativeError.js.map +1 -0
  32. package/dist/module/multiFactor.js +5 -3
  33. package/dist/module/multiFactor.js.map +1 -1
  34. package/dist/module/providers/AppleAuthProvider.js +17 -4
  35. package/dist/module/providers/AppleAuthProvider.js.map +1 -1
  36. package/dist/module/providers/OAuthProvider.js +4 -2
  37. package/dist/module/providers/OAuthProvider.js.map +1 -1
  38. package/dist/module/providers/PhoneAuthProvider.js +4 -4
  39. package/dist/module/providers/PhoneAuthProvider.js.map +1 -1
  40. package/dist/module/types/auth.js +8 -0
  41. package/dist/module/types/auth.js.map +1 -1
  42. package/dist/module/version.js +1 -1
  43. package/dist/module/web/RNFBAuthModule.js +26 -18
  44. package/dist/module/web/RNFBAuthModule.js.map +1 -1
  45. package/dist/typescript/lib/ConfirmationResult.d.ts +2 -2
  46. package/dist/typescript/lib/ConfirmationResult.d.ts.map +1 -1
  47. package/dist/typescript/lib/MultiFactorResolver.d.ts +6 -6
  48. package/dist/typescript/lib/MultiFactorResolver.d.ts.map +1 -1
  49. package/dist/typescript/lib/PhoneAuthListener.d.ts +1 -4
  50. package/dist/typescript/lib/PhoneAuthListener.d.ts.map +1 -1
  51. package/dist/typescript/lib/TotpSecret.d.ts +2 -4
  52. package/dist/typescript/lib/TotpSecret.d.ts.map +1 -1
  53. package/dist/typescript/lib/User.d.ts +13 -13
  54. package/dist/typescript/lib/User.d.ts.map +1 -1
  55. package/dist/typescript/lib/credentials/OAuthCredential.d.ts +6 -0
  56. package/dist/typescript/lib/credentials/OAuthCredential.d.ts.map +1 -1
  57. package/dist/typescript/lib/getMultiFactorResolver.d.ts +5 -5
  58. package/dist/typescript/lib/getMultiFactorResolver.d.ts.map +1 -1
  59. package/dist/typescript/lib/index.d.ts +377 -4
  60. package/dist/typescript/lib/index.d.ts.map +1 -1
  61. package/dist/typescript/lib/internal/syncNativeError.d.ts +6 -0
  62. package/dist/typescript/lib/internal/syncNativeError.d.ts.map +1 -0
  63. package/dist/typescript/lib/multiFactor.d.ts +9 -9
  64. package/dist/typescript/lib/multiFactor.d.ts.map +1 -1
  65. package/dist/typescript/lib/providers/AppleAuthProvider.d.ts +10 -3
  66. package/dist/typescript/lib/providers/AppleAuthProvider.d.ts.map +1 -1
  67. package/dist/typescript/lib/providers/OAuthProvider.d.ts.map +1 -1
  68. package/dist/typescript/lib/providers/PhoneAuthProvider.d.ts.map +1 -1
  69. package/dist/typescript/lib/types/auth.d.ts +39 -0
  70. package/dist/typescript/lib/types/auth.d.ts.map +1 -1
  71. package/dist/typescript/lib/types/internal.d.ts +45 -48
  72. package/dist/typescript/lib/types/internal.d.ts.map +1 -1
  73. package/dist/typescript/lib/version.d.ts +1 -1
  74. package/dist/typescript/lib/web/RNFBAuthModule.d.ts +7 -5
  75. package/dist/typescript/lib/web/RNFBAuthModule.d.ts.map +1 -1
  76. package/ios/RNFBAuth/RNFBAuthHelper.h +338 -0
  77. package/ios/RNFBAuth/{RNFBAuthModule.m → RNFBAuthHelper.m} +605 -323
  78. package/ios/RNFBAuth/RNFBAuthModule.h +9 -66
  79. package/ios/RNFBAuth/RNFBAuthModule.mm +592 -0
  80. package/ios/RNFBAuth.xcodeproj/project.pbxproj +8 -8
  81. package/ios/generated/RCTAppDependencyProvider.h +25 -0
  82. package/ios/generated/RCTAppDependencyProvider.mm +55 -0
  83. package/ios/generated/RCTModulesConformingToProtocolsProvider.h +18 -0
  84. package/ios/generated/RCTModulesConformingToProtocolsProvider.mm +33 -0
  85. package/ios/generated/RCTThirdPartyComponentsProvider.h +16 -0
  86. package/ios/generated/RCTThirdPartyComponentsProvider.mm +23 -0
  87. package/ios/generated/RNFBAuthTurboModules/RNFBAuthTurboModules-generated.mm +459 -0
  88. package/ios/generated/RNFBAuthTurboModules/RNFBAuthTurboModules.h +342 -0
  89. package/ios/generated/RNFBAuthTurboModulesJSI-generated.cpp +539 -0
  90. package/ios/generated/RNFBAuthTurboModulesJSI.h +611 -0
  91. package/ios/generated/ReactAppDependencyProvider.podspec +34 -0
  92. package/lib/ConfirmationResult.ts +3 -6
  93. package/lib/MultiFactorResolver.ts +8 -8
  94. package/lib/PhoneAuthListener.ts +6 -10
  95. package/lib/TotpMultiFactorGenerator.ts +1 -1
  96. package/lib/TotpSecret.ts +22 -9
  97. package/lib/User.ts +27 -38
  98. package/lib/credentials/OAuthCredential.ts +44 -0
  99. package/lib/getMultiFactorResolver.ts +9 -11
  100. package/lib/index.ts +1848 -6
  101. package/lib/internal/syncNativeError.ts +89 -0
  102. package/lib/multiFactor.ts +25 -16
  103. package/lib/providers/AppleAuthProvider.ts +21 -5
  104. package/lib/providers/OAuthProvider.ts +2 -0
  105. package/lib/providers/PhoneAuthProvider.ts +9 -22
  106. package/lib/types/auth.ts +42 -0
  107. package/lib/types/internal.ts +56 -63
  108. package/lib/version.ts +1 -1
  109. package/lib/web/RNFBAuthModule.ts +47 -33
  110. package/package.json +30 -5
  111. package/plugin/build/app.plugin.d.ts +2 -0
  112. package/plugin/build/app.plugin.js +6 -0
  113. package/plugin/src/app.plugin.ts +3 -0
  114. package/plugin/tsconfig.tsbuildinfo +1 -1
  115. package/react-native.config.js +9 -0
  116. package/specs/NativeRNFBTurboAuth.ts +145 -0
  117. package/typedoc.json +0 -1
  118. package/dist/module/modular.js +0 -793
  119. package/dist/module/modular.js.map +0 -1
  120. package/dist/module/namespaced.js +0 -522
  121. package/dist/module/namespaced.js.map +0 -1
  122. package/dist/module/types/namespaced.js +0 -62
  123. package/dist/module/types/namespaced.js.map +0 -1
  124. package/dist/typescript/lib/modular.d.ts +0 -370
  125. package/dist/typescript/lib/modular.d.ts.map +0 -1
  126. package/dist/typescript/lib/namespaced.d.ts +0 -12
  127. package/dist/typescript/lib/namespaced.d.ts.map +0 -1
  128. package/dist/typescript/lib/types/namespaced.d.ts +0 -2185
  129. package/dist/typescript/lib/types/namespaced.d.ts.map +0 -1
  130. package/lib/modular.ts +0 -1166
  131. package/lib/namespaced.ts +0 -849
  132. package/lib/types/namespaced.ts +0 -2350
@@ -15,13 +15,34 @@
15
15
  *
16
16
  */
17
17
 
18
+ #if __has_include(<Firebase/Firebase.h>)
18
19
  #import <Firebase/Firebase.h>
20
+ #else
21
+ @import FirebaseCore;
22
+ @import FirebaseAuth;
23
+ // `@import FirebaseAuth` alone only exposes the Swift-generated interop header
24
+ // (the real `FIRAuth`/`FIRUser` classes). The hand-written ObjC compatibility
25
+ // headers under `Public/FirebaseAuth/` (typedefs like
26
+ // `FIRAuthStateDidChangeListenerHandle`, error userInfo key constants, etc.)
27
+ // are vended by the separate `FirebaseAuthInternal` Clang module, which isn't
28
+ // automatically re-exported by `@import FirebaseAuth` -- it must be imported
29
+ // explicitly too, even though it's a direct (not transitive) SPM dependency of
30
+ // `FirebaseAuth`. See okf-bundle/ios-spm-native-imports.md.
31
+ @import FirebaseAuthInternal;
32
+ #endif
33
+ #import <React/RCTConvert.h>
19
34
  #import <React/RCTUtils.h>
20
35
 
21
36
  #import "RNFBApp/RCTConvert+FIRApp.h"
22
37
  #import "RNFBApp/RNFBAppModule.h"
23
38
  #import "RNFBApp/RNFBSharedUtils.h"
24
- #import "RNFBAuthModule.h"
39
+ #import "RNFBAuthHelper.h"
40
+
41
+ static void RNFBAuthThrowSyncErrorWithCode(NSString *code, NSString *message) {
42
+ @throw [NSException exceptionWithName:code
43
+ reason:message
44
+ userInfo:@{@"code" : code, @"message" : message}];
45
+ }
25
46
 
26
47
  static NSString *const keyIOS = @"iOS";
27
48
  static NSString *const keyUrl = @"url";
@@ -50,6 +71,68 @@ static NSString *const AUTH_STATE_CHANGED_EVENT = @"auth_state_changed";
50
71
  static NSString *const AUTH_ID_TOKEN_CHANGED_EVENT = @"auth_id_token_changed";
51
72
  static NSString *const PHONE_AUTH_STATE_CHANGED_EVENT = @"phone_auth_state_changed";
52
73
 
74
+ static NSString *const AuthErrorCode_toJSErrorCode[] = {
75
+ [FIRAuthErrorCodeInvalidCustomToken] = @"invalid-custom-token",
76
+ [FIRAuthErrorCodeCustomTokenMismatch] = @"custom-token-mismatch",
77
+ [FIRAuthErrorCodeInvalidCredential] = @"invalid-credential",
78
+ [FIRAuthErrorCodeUserDisabled] = @"user-disabled",
79
+ [FIRAuthErrorCodeOperationNotAllowed] = @"operation-not-allowed",
80
+ [FIRAuthErrorCodeEmailAlreadyInUse] = @"email-already-in-use",
81
+ [FIRAuthErrorCodeInvalidEmail] = @"invalid-email",
82
+ [FIRAuthErrorCodeWrongPassword] = @"wrong-password",
83
+ [FIRAuthErrorCodeTooManyRequests] = @"too-many-requests",
84
+ [FIRAuthErrorCodeUserNotFound] = @"user-not-found",
85
+ [FIRAuthErrorCodeAccountExistsWithDifferentCredential] =
86
+ @"account-exists-with-different-credential",
87
+ [FIRAuthErrorCodeRequiresRecentLogin] = @"requires-recent-login",
88
+ [FIRAuthErrorCodeProviderAlreadyLinked] = @"provider-already-linked",
89
+ [FIRAuthErrorCodeNoSuchProvider] = @"no-such-provider",
90
+ [FIRAuthErrorCodeInvalidUserToken] = @"invalid-user-token",
91
+ [FIRAuthErrorCodeNetworkError] = @"network-request-failed",
92
+ [FIRAuthErrorCodeUserTokenExpired] = @"user-token-expired",
93
+ [FIRAuthErrorCodeInvalidAPIKey] = @"invalid-api-key",
94
+ [FIRAuthErrorCodeUserMismatch] = @"user-mismatch",
95
+ [FIRAuthErrorCodeCredentialAlreadyInUse] = @"credential-already-in-use",
96
+ [FIRAuthErrorCodeWeakPassword] = @"weak-password",
97
+ [FIRAuthErrorCodeAppNotAuthorized] = @"app-not-authorized",
98
+ [FIRAuthErrorCodeExpiredActionCode] = @"expired-action-code",
99
+ [FIRAuthErrorCodeInvalidActionCode] = @"invalid-action-code",
100
+ [FIRAuthErrorCodeInvalidMessagePayload] = @"invalid-message-payload",
101
+ [FIRAuthErrorCodeInvalidSender] = @"invalid-sender",
102
+ [FIRAuthErrorCodeInvalidRecipientEmail] = @"invalid-recipient-email",
103
+ [FIRAuthErrorCodeMissingEmail] = @"invalid-email",
104
+ [FIRAuthErrorCodeMissingIosBundleID] = @"missing-ios-bundle-id",
105
+ [FIRAuthErrorCodeMissingAndroidPackageName] = @"missing-android-pkg-name",
106
+ [FIRAuthErrorCodeUnauthorizedDomain] = @"unauthorized-domain",
107
+ [FIRAuthErrorCodeInvalidContinueURI] = @"invalid-continue-uri",
108
+ [FIRAuthErrorCodeMissingContinueURI] = @"missing-continue-uri",
109
+ [FIRAuthErrorCodeMissingPhoneNumber] = @"missing-phone-number",
110
+ [FIRAuthErrorCodeInvalidPhoneNumber] = @"invalid-phone-number",
111
+ [FIRAuthErrorCodeMissingVerificationCode] = @"missing-verification-code",
112
+ [FIRAuthErrorCodeInvalidVerificationCode] = @"invalid-verification-code",
113
+ [FIRAuthErrorCodeMissingVerificationID] = @"missing-verification-id",
114
+ [FIRAuthErrorCodeInvalidVerificationID] = @"invalid-verification-id",
115
+ [FIRAuthErrorCodeMissingAppCredential] = @"missing-app-credential",
116
+ [FIRAuthErrorCodeInvalidAppCredential] = @"invalid-app-credential",
117
+ [FIRAuthErrorCodeSessionExpired] = @"code-expired",
118
+ [FIRAuthErrorCodeQuotaExceeded] = @"quota-exceeded",
119
+ [FIRAuthErrorCodeMissingAppToken] = @"missing-apns-token",
120
+ [FIRAuthErrorCodeNotificationNotForwarded] = @"notification-not-forwarded",
121
+ [FIRAuthErrorCodeAppNotVerified] = @"app-not-verified",
122
+ [FIRAuthErrorCodeCaptchaCheckFailed] = @"captcha-check-failed",
123
+ [FIRAuthErrorCodeWebContextAlreadyPresented] = @"cancelled-popup-request",
124
+ [FIRAuthErrorCodeWebContextCancelled] = @"popup-closed-by-user",
125
+ [FIRAuthErrorCodeAppVerificationUserInteractionFailure] =
126
+ @"app-verification-user-interaction-failure",
127
+ [FIRAuthErrorCodeInvalidClientID] = @"invalid-oauth-client-id",
128
+ [FIRAuthErrorCodeWebNetworkRequestFailed] = @"network-request-failed",
129
+ [FIRAuthErrorCodeWebInternalError] = @"internal-error",
130
+ [FIRAuthErrorCodeNullUser] = @"null-user",
131
+ [FIRAuthErrorCodeKeychainError] = @"keychain-error",
132
+ [FIRAuthErrorCodeInternalError] = @"internal-error",
133
+ [FIRAuthErrorCodeMalformedJWT] = @"malformed-jwt",
134
+ [FIRAuthErrorCodeSecondFactorRequired] = @"multi-factor-auth-required"};
135
+
53
136
  static __strong NSMutableDictionary *authStateHandlers;
54
137
  static __strong NSMutableDictionary *idTokenHandlers;
55
138
  static __strong NSMutableDictionary *emulatorConfigs;
@@ -61,18 +144,60 @@ static __strong NSMutableDictionary<NSString *, FIRMultiFactorSession *> *cached
61
144
  static __strong NSMutableDictionary<NSString *, FIRTOTPSecret *> *cachedTotpSecrets;
62
145
  #endif
63
146
 
64
- @implementation RNFBAuthModule
65
- #pragma mark -
66
- #pragma mark Module Setup
147
+ @interface RNFBAuthHelper ()
67
148
 
68
- RCT_EXPORT_MODULE();
149
+ + (NSString *)nonEmptyStringFromDictionary:(NSDictionary *)dictionary key:(NSString *)key;
150
+ + (NSPersonNameComponents *)personNameComponentsFromDictionary:(NSDictionary *)dictionary;
69
151
 
70
- + (BOOL)requiresMainQueueSetup {
71
- return YES;
72
- }
152
+ + (FIRAuthCredential *)getCredentialForProvider:(NSString *)provider
153
+ token:(NSString *)authToken
154
+ secret:(NSString *)authTokenSecret
155
+ firebaseApp:(FIRApp *)firebaseApp;
156
+
157
+ + (void)reloadAndReturnUser:(FIRUser *)user
158
+ resolver:(RCTPromiseResolveBlock)resolve
159
+ rejecter:(RCTPromiseRejectBlock)reject
160
+ firebaseApp:(FIRApp *)firebaseApp;
161
+
162
+ + (void)promiseNoUser:(RCTPromiseResolveBlock)resolve
163
+ rejecter:(RCTPromiseRejectBlock)reject
164
+ isError:(BOOL)isError;
165
+
166
+ #if TARGET_OS_IOS
167
+ + (NSDictionary *)multiFactorResolverToDict:(FIRMultiFactorResolver *)resolver;
168
+ #endif
169
+
170
+ + (void)promiseRejectAuthException:(RCTPromiseRejectBlock)reject error:(NSError *)error;
171
+ + (NSDictionary *)getJSError:(NSError *)error;
172
+
173
+ + (void)promiseWithUser:(RCTPromiseResolveBlock)resolve
174
+ rejecter:(RCTPromiseRejectBlock)reject
175
+ user:(FIRUser *)user;
176
+
177
+ + (void)promiseWithAuthResult:(RCTPromiseResolveBlock)resolve
178
+ rejecter:(RCTPromiseRejectBlock)reject
179
+ authResult:(FIRAuthDataResult *)authResult;
180
+
181
+ + (NSArray<NSObject *> *)convertProviderData:(NSArray<id<FIRUserInfo>> *)providerData;
182
+ + (NSDictionary *)firebaseUserToDict:(FIRUser *)user;
183
+
184
+ #if TARGET_OS_IOS
185
+ + (NSArray<NSMutableDictionary *> *)convertMultiFactorData:(NSArray<FIRMultiFactorInfo *> *)hints;
186
+ #endif
187
+
188
+ + (NSDictionary *)authCredentialToDict:(FIRAuthCredential *)authCredential;
189
+ + (FIRActionCodeSettings *)buildActionCodeSettings:(NSDictionary *)actionCodeSettings;
190
+
191
+ + (void)initializeSharedStateOnce;
192
+
193
+ @end
194
+
195
+ @implementation RNFBAuthHelper
196
+
197
+ #pragma mark -
198
+ #pragma mark Shared state
73
199
 
74
- - (id)init {
75
- self = [super init];
200
+ + (void)initializeSharedStateOnce {
76
201
  static dispatch_once_t onceToken;
77
202
  dispatch_once(&onceToken, ^{
78
203
  authStateHandlers = [[NSMutableDictionary alloc] init];
@@ -85,14 +210,11 @@ RCT_EXPORT_MODULE();
85
210
  cachedTotpSecrets = [[NSMutableDictionary alloc] init];
86
211
  #endif
87
212
  });
88
- return self;
89
213
  }
90
214
 
91
- - (void)dealloc {
92
- [self invalidate];
93
- }
215
+ + (void)invalidate {
216
+ [self initializeSharedStateOnce];
94
217
 
95
- - (void)invalidate {
96
218
  for (NSString *key in authStateHandlers) {
97
219
  FIRApp *firebaseApp = [RCTConvert firAppFromString:key];
98
220
 
@@ -119,7 +241,10 @@ RCT_EXPORT_MODULE();
119
241
  #pragma mark -
120
242
  #pragma mark Firebase Auth Methods
121
243
 
122
- RCT_EXPORT_METHOD(addAuthStateListener : (FIRApp *)firebaseApp) {
244
+ + (void)addAuthStateListener:(NSString *)appName {
245
+ [self initializeSharedStateOnce];
246
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
247
+
123
248
  if (![authStateHandlers valueForKey:firebaseApp.name]) {
124
249
  FIRAuthStateDidChangeListenerHandle newListenerHandle = [[FIRAuth authWithApp:firebaseApp]
125
250
  addAuthStateDidChangeListener:^(FIRAuth *_Nonnull auth, FIRUser *_Nullable user) {
@@ -135,7 +260,10 @@ RCT_EXPORT_METHOD(addAuthStateListener : (FIRApp *)firebaseApp) {
135
260
  }
136
261
  }
137
262
 
138
- RCT_EXPORT_METHOD(removeAuthStateListener : (FIRApp *)firebaseApp) {
263
+ + (void)removeAuthStateListener:(NSString *)appName {
264
+ [self initializeSharedStateOnce];
265
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
266
+
139
267
  if ([authStateHandlers valueForKey:firebaseApp.name]) {
140
268
  [[FIRAuth authWithApp:firebaseApp]
141
269
  removeAuthStateDidChangeListener:[authStateHandlers valueForKey:firebaseApp.name]];
@@ -143,7 +271,10 @@ RCT_EXPORT_METHOD(removeAuthStateListener : (FIRApp *)firebaseApp) {
143
271
  }
144
272
  }
145
273
 
146
- RCT_EXPORT_METHOD(addIdTokenListener : (FIRApp *)firebaseApp) {
274
+ + (void)addIdTokenListener:(NSString *)appName {
275
+ [self initializeSharedStateOnce];
276
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
277
+
147
278
  if (![idTokenHandlers valueForKey:firebaseApp.name]) {
148
279
  FIRIDTokenDidChangeListenerHandle newListenerHandle = [[FIRAuth authWithApp:firebaseApp]
149
280
  addIDTokenDidChangeListener:^(FIRAuth *_Nonnull auth, FIRUser *_Nullable user) {
@@ -161,7 +292,10 @@ RCT_EXPORT_METHOD(addIdTokenListener : (FIRApp *)firebaseApp) {
161
292
  }
162
293
  }
163
294
 
164
- RCT_EXPORT_METHOD(removeIdTokenListener : (FIRApp *)firebaseApp) {
295
+ + (void)removeIdTokenListener:(NSString *)appName {
296
+ [self initializeSharedStateOnce];
297
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
298
+
165
299
  if ([idTokenHandlers valueForKey:firebaseApp.name]) {
166
300
  [[FIRAuth authWithApp:firebaseApp]
167
301
  removeIDTokenDidChangeListener:[idTokenHandlers valueForKey:firebaseApp.name]];
@@ -169,7 +303,9 @@ RCT_EXPORT_METHOD(removeIdTokenListener : (FIRApp *)firebaseApp) {
169
303
  }
170
304
  }
171
305
 
172
- RCT_EXPORT_METHOD(configureAuthDomain : (FIRApp *)firebaseApp) {
306
+ + (void)configureAuthDomain:(NSString *)appName {
307
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
308
+
173
309
  NSString *authDomain = [RNFBAppModule getCustomDomain:firebaseApp.name];
174
310
  DLog(@"RNFBAuth app: %@ customAuthDomain: %@", firebaseApp.name, authDomain);
175
311
  if (authDomain != nil) {
@@ -177,22 +313,30 @@ RCT_EXPORT_METHOD(configureAuthDomain : (FIRApp *)firebaseApp) {
177
313
  }
178
314
  }
179
315
 
180
- RCT_EXPORT_METHOD(getCustomAuthDomain
181
- : (FIRApp *)firebaseApp
182
- : (RCTPromiseResolveBlock)resolve
183
- : (RCTPromiseRejectBlock)reject) {
316
+ + (void)getCustomAuthDomain:(NSString *)appName
317
+ resolve:(RCTPromiseResolveBlock)resolve
318
+ reject:(RCTPromiseRejectBlock)reject {
319
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
320
+
184
321
  resolve([FIRAuth authWithApp:firebaseApp].customAuthDomain);
185
322
  }
186
323
 
187
- RCT_EXPORT_METHOD(setAppVerificationDisabledForTesting : (FIRApp *)firebaseApp : (BOOL)disabled) {
324
+ + (void)setAppVerificationDisabledForTesting:(NSString *)appName
325
+ disabled:(BOOL)disabled
326
+ resolve:(RCTPromiseResolveBlock)resolve
327
+ reject:(RCTPromiseRejectBlock)reject {
328
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
329
+
188
330
  [FIRAuth authWithApp:firebaseApp].settings.appVerificationDisabledForTesting = disabled;
331
+ resolve([NSNull null]);
189
332
  }
190
333
 
191
- RCT_EXPORT_METHOD(useUserAccessGroup
192
- : (FIRApp *)firebaseApp
193
- : (NSString *)userAccessGroup
194
- : (RCTPromiseResolveBlock)resolve
195
- : (RCTPromiseRejectBlock)reject) {
334
+ + (void)useUserAccessGroup:(NSString *)appName
335
+ userAccessGroup:(NSString *)userAccessGroup
336
+ resolve:(RCTPromiseResolveBlock)resolve
337
+ reject:(RCTPromiseRejectBlock)reject {
338
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
339
+
196
340
  NSError *error;
197
341
  [[FIRAuth authWithApp:firebaseApp] useUserAccessGroup:userAccessGroup error:&error];
198
342
 
@@ -204,10 +348,11 @@ RCT_EXPORT_METHOD(useUserAccessGroup
204
348
  return;
205
349
  }
206
350
 
207
- RCT_EXPORT_METHOD(signOut
208
- : (FIRApp *)firebaseApp
209
- : (RCTPromiseResolveBlock)resolve
210
- : (RCTPromiseRejectBlock)reject) {
351
+ + (void)signOut:(NSString *)appName
352
+ resolve:(RCTPromiseResolveBlock)resolve
353
+ reject:(RCTPromiseRejectBlock)reject {
354
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
355
+
211
356
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
212
357
 
213
358
  if (user) {
@@ -224,10 +369,11 @@ RCT_EXPORT_METHOD(signOut
224
369
  [self promiseNoUser:resolve rejecter:reject isError:YES];
225
370
  }
226
371
 
227
- RCT_EXPORT_METHOD(signInAnonymously
228
- : (FIRApp *)firebaseApp
229
- : (RCTPromiseResolveBlock)resolve
230
- : (RCTPromiseRejectBlock)reject) {
372
+ + (void)signInAnonymously:(NSString *)appName
373
+ resolve:(RCTPromiseResolveBlock)resolve
374
+ reject:(RCTPromiseRejectBlock)reject {
375
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
376
+
231
377
  [[FIRAuth authWithApp:firebaseApp]
232
378
  signInAnonymouslyWithCompletion:^(FIRAuthDataResult *authResult, NSError *error) {
233
379
  if (error) {
@@ -238,12 +384,13 @@ RCT_EXPORT_METHOD(signInAnonymously
238
384
  }];
239
385
  }
240
386
 
241
- RCT_EXPORT_METHOD(signInWithEmailAndPassword
242
- : (FIRApp *)firebaseApp
243
- : (NSString *)email
244
- : (NSString *)password
245
- : (RCTPromiseResolveBlock)resolve
246
- : (RCTPromiseRejectBlock)reject) {
387
+ + (void)signInWithEmailAndPassword:(NSString *)appName
388
+ email:(NSString *)email
389
+ password:(NSString *)password
390
+ resolve:(RCTPromiseResolveBlock)resolve
391
+ reject:(RCTPromiseRejectBlock)reject {
392
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
393
+
247
394
  [[FIRAuth authWithApp:firebaseApp]
248
395
  signInWithEmail:email
249
396
  password:password
@@ -256,21 +403,20 @@ RCT_EXPORT_METHOD(signInWithEmailAndPassword
256
403
  }];
257
404
  }
258
405
 
259
- RCT_EXPORT_METHOD(isSignInWithEmailLink
260
- : (FIRApp *)firebaseApp
261
- : (NSString *)emailLink
262
- : (RCTPromiseResolveBlock)resolve
263
- : (RCTPromiseRejectBlock)reject) {
264
- resolve(
265
- @([RCTConvert BOOL:@([[FIRAuth authWithApp:firebaseApp] isSignInWithEmailLink:emailLink])]));
406
+ + (NSNumber *)isSignInWithEmailLink:(NSString *)appName emailLink:(NSString *)emailLink {
407
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
408
+
409
+ return
410
+ @([RCTConvert BOOL:@([[FIRAuth authWithApp:firebaseApp] isSignInWithEmailLink:emailLink])]);
266
411
  }
267
412
 
268
- RCT_EXPORT_METHOD(signInWithEmailLink
269
- : (FIRApp *)firebaseApp
270
- : (NSString *)email
271
- : (NSString *)emailLink
272
- : (RCTPromiseResolveBlock)resolve
273
- : (RCTPromiseRejectBlock)reject) {
413
+ + (void)signInWithEmailLink:(NSString *)appName
414
+ email:(NSString *)email
415
+ emailLink:(NSString *)emailLink
416
+ resolve:(RCTPromiseResolveBlock)resolve
417
+ reject:(RCTPromiseRejectBlock)reject {
418
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
419
+
274
420
  [[FIRAuth authWithApp:firebaseApp]
275
421
  signInWithEmail:email
276
422
  link:emailLink
@@ -283,12 +429,13 @@ RCT_EXPORT_METHOD(signInWithEmailLink
283
429
  }];
284
430
  }
285
431
 
286
- RCT_EXPORT_METHOD(createUserWithEmailAndPassword
287
- : (FIRApp *)firebaseApp
288
- : (NSString *)email
289
- : (NSString *)password
290
- : (RCTPromiseResolveBlock)resolve
291
- : (RCTPromiseRejectBlock)reject) {
432
+ + (void)createUserWithEmailAndPassword:(NSString *)appName
433
+ email:(NSString *)email
434
+ password:(NSString *)password
435
+ resolve:(RCTPromiseResolveBlock)resolve
436
+ reject:(RCTPromiseRejectBlock)reject {
437
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
438
+
292
439
  [[FIRAuth authWithApp:firebaseApp]
293
440
  createUserWithEmail:email
294
441
  password:password
@@ -301,10 +448,11 @@ RCT_EXPORT_METHOD(createUserWithEmailAndPassword
301
448
  }];
302
449
  }
303
450
 
304
- RCT_EXPORT_METHOD(delete
305
- : (FIRApp *)firebaseApp
306
- : (RCTPromiseResolveBlock)resolve
307
- : (RCTPromiseRejectBlock)reject) {
451
+ + (void)deleteUser:(NSString *)appName
452
+ resolve:(RCTPromiseResolveBlock)resolve
453
+ reject:(RCTPromiseRejectBlock)reject {
454
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
455
+
308
456
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
309
457
 
310
458
  if (user) {
@@ -320,10 +468,11 @@ RCT_EXPORT_METHOD(delete
320
468
  }
321
469
  }
322
470
 
323
- RCT_EXPORT_METHOD(reload
324
- : (FIRApp *)firebaseApp
325
- : (RCTPromiseResolveBlock)resolve
326
- : (RCTPromiseRejectBlock)reject) {
471
+ + (void)reload:(NSString *)appName
472
+ resolve:(RCTPromiseResolveBlock)resolve
473
+ reject:(RCTPromiseRejectBlock)reject {
474
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
475
+
327
476
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
328
477
  if (user) {
329
478
  [self reloadAndReturnUser:user resolver:resolve rejecter:reject firebaseApp:firebaseApp];
@@ -332,11 +481,12 @@ RCT_EXPORT_METHOD(reload
332
481
  }
333
482
  }
334
483
 
335
- RCT_EXPORT_METHOD(sendEmailVerification
336
- : (FIRApp *)firebaseApp
337
- : (NSDictionary *)actionCodeSettings
338
- : (RCTPromiseResolveBlock)resolve
339
- : (RCTPromiseRejectBlock)reject) {
484
+ + (void)sendEmailVerification:(NSString *)appName
485
+ actionCodeSettings:(NSDictionary *)actionCodeSettings
486
+ resolve:(RCTPromiseResolveBlock)resolve
487
+ reject:(RCTPromiseRejectBlock)reject {
488
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
489
+
340
490
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
341
491
  if (user) {
342
492
  id handler = ^(NSError *_Nullable error) {
@@ -358,12 +508,13 @@ RCT_EXPORT_METHOD(sendEmailVerification
358
508
  }
359
509
  }
360
510
 
361
- RCT_EXPORT_METHOD(verifyBeforeUpdateEmail
362
- : (FIRApp *)firebaseApp
363
- : (NSString *)email
364
- : (NSDictionary *)actionCodeSettings
365
- : (RCTPromiseResolveBlock)resolve
366
- : (RCTPromiseRejectBlock)reject) {
511
+ + (void)verifyBeforeUpdateEmail:(NSString *)appName
512
+ email:(NSString *)email
513
+ actionCodeSettings:(NSDictionary *)actionCodeSettings
514
+ resolve:(RCTPromiseResolveBlock)resolve
515
+ reject:(RCTPromiseRejectBlock)reject {
516
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
517
+
367
518
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
368
519
  if (user) {
369
520
  id handler = ^(NSError *_Nullable error) {
@@ -387,11 +538,12 @@ RCT_EXPORT_METHOD(verifyBeforeUpdateEmail
387
538
  }
388
539
  }
389
540
 
390
- RCT_EXPORT_METHOD(updateEmail
391
- : (FIRApp *)firebaseApp
392
- : (NSString *)email
393
- : (RCTPromiseResolveBlock)resolve
394
- : (RCTPromiseRejectBlock)reject) {
541
+ + (void)updateEmail:(NSString *)appName
542
+ email:(NSString *)email
543
+ resolve:(RCTPromiseResolveBlock)resolve
544
+ reject:(RCTPromiseRejectBlock)reject {
545
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
546
+
395
547
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
396
548
 
397
549
  if (user) {
@@ -411,11 +563,12 @@ RCT_EXPORT_METHOD(updateEmail
411
563
  }
412
564
  }
413
565
 
414
- RCT_EXPORT_METHOD(updatePassword
415
- : (FIRApp *)firebaseApp
416
- : (NSString *)password
417
- : (RCTPromiseResolveBlock)resolve
418
- : (RCTPromiseRejectBlock)reject) {
566
+ + (void)updatePassword:(NSString *)appName
567
+ password:(NSString *)password
568
+ resolve:(RCTPromiseResolveBlock)resolve
569
+ reject:(RCTPromiseRejectBlock)reject {
570
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
571
+
419
572
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
420
573
 
421
574
  if (user) {
@@ -434,13 +587,14 @@ RCT_EXPORT_METHOD(updatePassword
434
587
  }
435
588
 
436
589
  #if TARGET_OS_IOS
437
- RCT_EXPORT_METHOD(updatePhoneNumber
438
- : (FIRApp *)firebaseApp
439
- : (NSString *)provider
440
- : (NSString *)authToken
441
- : (NSString *)authSecret
442
- : (RCTPromiseResolveBlock)resolve
443
- : (RCTPromiseRejectBlock)reject) {
590
+ + (void)updatePhoneNumber:(NSString *)appName
591
+ provider:(NSString *)provider
592
+ authToken:(NSString *)authToken
593
+ authSecret:(NSString *)authSecret
594
+ resolve:(RCTPromiseResolveBlock)resolve
595
+ reject:(RCTPromiseRejectBlock)reject {
596
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
597
+
444
598
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
445
599
 
446
600
  if (user) {
@@ -476,11 +630,12 @@ RCT_EXPORT_METHOD(updatePhoneNumber
476
630
  }
477
631
  #endif
478
632
 
479
- RCT_EXPORT_METHOD(updateProfile
480
- : (FIRApp *)firebaseApp
481
- : (NSDictionary *)props
482
- : (RCTPromiseResolveBlock)resolve
483
- : (RCTPromiseRejectBlock)reject) {
633
+ + (void)updateProfile:(NSString *)appName
634
+ props:(NSDictionary *)props
635
+ resolve:(RCTPromiseResolveBlock)resolve
636
+ reject:(RCTPromiseRejectBlock)reject {
637
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
638
+
484
639
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
485
640
 
486
641
  if (user) {
@@ -512,11 +667,12 @@ RCT_EXPORT_METHOD(updateProfile
512
667
  }
513
668
  }
514
669
 
515
- RCT_EXPORT_METHOD(getIdToken
516
- : (FIRApp *)firebaseApp
517
- : (BOOL)forceRefresh
518
- : (RCTPromiseResolveBlock)resolve
519
- : (RCTPromiseRejectBlock)reject) {
670
+ + (void)getIdToken:(NSString *)appName
671
+ forceRefresh:(BOOL)forceRefresh
672
+ resolve:(RCTPromiseResolveBlock)resolve
673
+ reject:(RCTPromiseRejectBlock)reject {
674
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
675
+
520
676
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
521
677
 
522
678
  if (user) {
@@ -533,11 +689,12 @@ RCT_EXPORT_METHOD(getIdToken
533
689
  }
534
690
  }
535
691
 
536
- RCT_EXPORT_METHOD(getIdTokenResult
537
- : (FIRApp *)firebaseApp
538
- : (BOOL)forceRefresh
539
- : (RCTPromiseResolveBlock)resolve
540
- : (RCTPromiseRejectBlock)reject) {
692
+ + (void)getIdTokenResult:(NSString *)appName
693
+ forceRefresh:(BOOL)forceRefresh
694
+ resolve:(RCTPromiseResolveBlock)resolve
695
+ reject:(RCTPromiseRejectBlock)reject {
696
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
697
+
541
698
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
542
699
 
543
700
  if (user) {
@@ -579,17 +736,33 @@ RCT_EXPORT_METHOD(getIdTokenResult
579
736
  }
580
737
  }
581
738
 
582
- RCT_EXPORT_METHOD(signInWithCredential
583
- : (FIRApp *)firebaseApp
584
- : (NSString *)provider
585
- : (NSString *)authToken
586
- : (NSString *)authSecret
587
- : (RCTPromiseResolveBlock)resolve
588
- : (RCTPromiseRejectBlock)reject) {
739
+ + (void)signInWithCredential:(NSString *)appName
740
+ provider:(NSString *)provider
741
+ authToken:(NSString *)authToken
742
+ authSecret:(NSString *)authSecret
743
+ fullName:(NSDictionary *)fullName
744
+ resolve:(RCTPromiseResolveBlock)resolve
745
+ reject:(RCTPromiseRejectBlock)reject {
746
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
747
+
589
748
  FIRAuthCredential *credential = [self getCredentialForProvider:provider
590
749
  token:authToken
591
750
  secret:authSecret
592
751
  firebaseApp:firebaseApp];
752
+
753
+ // Sign in with Apple: if the caller supplied a non-empty fullName (only available on the
754
+ // user's first authorization), rebuild the credential so Firebase can store displayName.
755
+ // See AppleFullPersonName in auth.ts.
756
+ if ([provider compare:@"apple.com" options:NSCaseInsensitiveSearch] == NSOrderedSame) {
757
+ NSPersonNameComponents *personNameComponents =
758
+ [self personNameComponentsFromDictionary:fullName];
759
+ if (personNameComponents != nil) {
760
+ credential = [FIROAuthProvider appleCredentialWithIDToken:authToken
761
+ rawNonce:authSecret
762
+ fullName:personNameComponents];
763
+ }
764
+ }
765
+
593
766
  if (credential == nil) {
594
767
  [RNFBSharedUtils rejectPromiseWithUserInfo:reject
595
768
  userInfo:(NSMutableDictionary *)@{
@@ -611,11 +784,12 @@ RCT_EXPORT_METHOD(signInWithCredential
611
784
  }];
612
785
  }
613
786
 
614
- RCT_EXPORT_METHOD(signInWithProvider
615
- : (FIRApp *)firebaseApp
616
- : (NSDictionary *)provider
617
- : (RCTPromiseResolveBlock)resolve
618
- : (RCTPromiseRejectBlock)reject) {
787
+ + (void)signInWithProvider:(NSString *)appName
788
+ provider:(NSDictionary *)provider
789
+ resolve:(RCTPromiseResolveBlock)resolve
790
+ reject:(RCTPromiseRejectBlock)reject {
791
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
792
+
619
793
  NSString *providerId = provider[@"providerId"];
620
794
  if (providerId == nil) {
621
795
  [RNFBSharedUtils rejectPromiseWithUserInfo:reject
@@ -671,12 +845,13 @@ RCT_EXPORT_METHOD(signInWithProvider
671
845
  #endif
672
846
  }
673
847
 
674
- RCT_EXPORT_METHOD(confirmPasswordReset
675
- : (FIRApp *)firebaseApp
676
- : (NSString *)code
677
- : (NSString *)newPassword
678
- : (RCTPromiseResolveBlock)resolve
679
- : (RCTPromiseRejectBlock)reject) {
848
+ + (void)confirmPasswordReset:(NSString *)appName
849
+ code:(NSString *)code
850
+ newPassword:(NSString *)newPassword
851
+ resolve:(RCTPromiseResolveBlock)resolve
852
+ reject:(RCTPromiseRejectBlock)reject {
853
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
854
+
680
855
  [[FIRAuth authWithApp:firebaseApp]
681
856
  confirmPasswordResetWithCode:code
682
857
  newPassword:newPassword
@@ -689,11 +864,12 @@ RCT_EXPORT_METHOD(confirmPasswordReset
689
864
  }];
690
865
  }
691
866
 
692
- RCT_EXPORT_METHOD(applyActionCode
693
- : (FIRApp *)firebaseApp
694
- : (NSString *)code
695
- : (RCTPromiseResolveBlock)resolve
696
- : (RCTPromiseRejectBlock)reject) {
867
+ + (void)applyActionCode:(NSString *)appName
868
+ code:(NSString *)code
869
+ resolve:(RCTPromiseResolveBlock)resolve
870
+ reject:(RCTPromiseRejectBlock)reject {
871
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
872
+
697
873
  [[FIRAuth authWithApp:firebaseApp]
698
874
  applyActionCode:code
699
875
  completion:^(NSError *_Nullable error) {
@@ -707,11 +883,12 @@ RCT_EXPORT_METHOD(applyActionCode
707
883
  }];
708
884
  }
709
885
 
710
- RCT_EXPORT_METHOD(checkActionCode
711
- : (FIRApp *)firebaseApp
712
- : (NSString *)code
713
- : (RCTPromiseResolveBlock)resolve
714
- : (RCTPromiseRejectBlock)reject) {
886
+ + (void)checkActionCode:(NSString *)appName
887
+ code:(NSString *)code
888
+ resolve:(RCTPromiseResolveBlock)resolve
889
+ reject:(RCTPromiseRejectBlock)reject {
890
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
891
+
715
892
  [[FIRAuth authWithApp:firebaseApp]
716
893
  checkActionCode:code
717
894
  completion:^(FIRActionCodeInfo *_Nullable info, NSError *_Nullable error) {
@@ -763,11 +940,12 @@ RCT_EXPORT_METHOD(checkActionCode
763
940
  }];
764
941
  }
765
942
 
766
- RCT_EXPORT_METHOD(revokeToken
767
- : (FIRApp *)firebaseApp
768
- : (NSString *)authorizationCode
769
- : (RCTPromiseResolveBlock)resolve
770
- : (RCTPromiseRejectBlock)reject) {
943
+ + (void)revokeToken:(NSString *)appName
944
+ authorizationCode:(NSString *)authorizationCode
945
+ resolve:(RCTPromiseResolveBlock)resolve
946
+ reject:(RCTPromiseRejectBlock)reject {
947
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
948
+
771
949
  [[FIRAuth authWithApp:firebaseApp]
772
950
  revokeTokenWithAuthorizationCode:authorizationCode
773
951
  completion:^(NSError *_Nullable error) {
@@ -779,12 +957,13 @@ RCT_EXPORT_METHOD(revokeToken
779
957
  }];
780
958
  }
781
959
 
782
- RCT_EXPORT_METHOD(sendPasswordResetEmail
783
- : (FIRApp *)firebaseApp
784
- : (NSString *)email
785
- : (NSDictionary *)actionCodeSettings
786
- : (RCTPromiseResolveBlock)resolve
787
- : (RCTPromiseRejectBlock)reject) {
960
+ + (void)sendPasswordResetEmail:(NSString *)appName
961
+ email:(NSString *)email
962
+ actionCodeSettings:(NSDictionary *)actionCodeSettings
963
+ resolve:(RCTPromiseResolveBlock)resolve
964
+ reject:(RCTPromiseRejectBlock)reject {
965
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
966
+
788
967
  id handler = ^(NSError *_Nullable error) {
789
968
  if (error) {
790
969
  [self promiseRejectAuthException:reject error:error];
@@ -803,12 +982,13 @@ RCT_EXPORT_METHOD(sendPasswordResetEmail
803
982
  }
804
983
  }
805
984
 
806
- RCT_EXPORT_METHOD(sendSignInLinkToEmail
807
- : (FIRApp *)firebaseApp
808
- : (NSString *)email
809
- : (NSDictionary *)actionCodeSettings
810
- : (RCTPromiseResolveBlock)resolve
811
- : (RCTPromiseRejectBlock)reject) {
985
+ + (void)sendSignInLinkToEmail:(NSString *)appName
986
+ email:(NSString *)email
987
+ actionCodeSettings:(NSDictionary *)actionCodeSettings
988
+ resolve:(RCTPromiseResolveBlock)resolve
989
+ reject:(RCTPromiseRejectBlock)reject {
990
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
991
+
812
992
  id handler = ^(NSError *_Nullable error) {
813
993
  if (error) {
814
994
  [self promiseRejectAuthException:reject error:error];
@@ -823,11 +1003,12 @@ RCT_EXPORT_METHOD(sendSignInLinkToEmail
823
1003
  completion:handler];
824
1004
  }
825
1005
 
826
- RCT_EXPORT_METHOD(signInWithCustomToken
827
- : (FIRApp *)firebaseApp
828
- : (NSString *)customToken
829
- : (RCTPromiseResolveBlock)resolve
830
- : (RCTPromiseRejectBlock)reject) {
1006
+ + (void)signInWithCustomToken:(NSString *)appName
1007
+ customToken:(NSString *)customToken
1008
+ resolve:(RCTPromiseResolveBlock)resolve
1009
+ reject:(RCTPromiseRejectBlock)reject {
1010
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1011
+
831
1012
  [[FIRAuth authWithApp:firebaseApp]
832
1013
  signInWithCustomToken:customToken
833
1014
  completion:^(FIRAuthDataResult *authResult, NSError *error) {
@@ -840,13 +1021,17 @@ RCT_EXPORT_METHOD(signInWithCustomToken
840
1021
  }
841
1022
 
842
1023
  #if TARGET_OS_IOS
843
- RCT_EXPORT_METHOD(signInWithPhoneNumber
844
- : (FIRApp *)firebaseApp
845
- : (NSString *)phoneNumber
846
- : (RCTPromiseResolveBlock)resolve
847
- : (RCTPromiseRejectBlock)reject) {
1024
+ + (void)signInWithPhoneNumber:(NSString *)appName
1025
+ phoneNumber:(NSString *)phoneNumber
1026
+ forceResend:(BOOL)forceResend
1027
+ resolve:(RCTPromiseResolveBlock)resolve
1028
+ reject:(RCTPromiseRejectBlock)reject {
1029
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1030
+
848
1031
  DLog(@"SignInWthPhoneNumber instance: %@", firebaseApp.name);
849
1032
 
1033
+ (void)forceResend;
1034
+
850
1035
  [[FIRPhoneAuthProvider providerWithAuth:[FIRAuth authWithApp:firebaseApp]]
851
1036
  verifyPhoneNumber:phoneNumber
852
1037
  UIDelegate:nil
@@ -860,12 +1045,15 @@ RCT_EXPORT_METHOD(signInWithPhoneNumber
860
1045
  }
861
1046
  }];
862
1047
  }
863
- RCT_EXPORT_METHOD(verifyPhoneNumberWithMultiFactorInfo
864
- : (FIRApp *)firebaseApp
865
- : (NSString *)hintUid
866
- : (NSString *)sessionKey
867
- : (RCTPromiseResolveBlock)resolve
868
- : (RCTPromiseRejectBlock)reject) {
1048
+
1049
+ + (void)verifyPhoneNumberWithMultiFactorInfo:(NSString *)appName
1050
+ hintUid:(NSString *)hintUid
1051
+ sessionKey:(NSString *)sessionKey
1052
+ resolve:(RCTPromiseResolveBlock)resolve
1053
+ reject:(RCTPromiseRejectBlock)reject {
1054
+ [self initializeSharedStateOnce];
1055
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1056
+
869
1057
  if ([cachedResolver valueForKey:sessionKey] == nil) {
870
1058
  [RNFBSharedUtils
871
1059
  rejectPromiseWithUserInfo:reject
@@ -905,16 +1093,18 @@ RCT_EXPORT_METHOD(verifyPhoneNumberWithMultiFactorInfo
905
1093
  }];
906
1094
  }
907
1095
 
908
- RCT_EXPORT_METHOD(verifyPhoneNumberForMultiFactor
909
- : (FIRApp *)firebaseApp
910
- : (NSString *)phoneNumber
911
- : (NSString *)sessionId
912
- : (RCTPromiseResolveBlock)resolve
913
- : (RCTPromiseRejectBlock)reject) {
1096
+ + (void)verifyPhoneNumberForMultiFactor:(NSString *)appName
1097
+ phoneNumber:(NSString *)phoneNumber
1098
+ sessionKey:(NSString *)sessionKey
1099
+ resolve:(RCTPromiseResolveBlock)resolve
1100
+ reject:(RCTPromiseRejectBlock)reject {
1101
+ [self initializeSharedStateOnce];
1102
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1103
+
914
1104
  DLog(@"verifyPhoneNumberForMultifactor using app: %@", firebaseApp.name);
915
1105
  DLog(@"verifyPhoneNumberForMultifactor phoneNumber: %@", phoneNumber);
916
- DLog(@"verifyPhoneNumberForMultifactor sessionId: %@", sessionId);
917
- FIRMultiFactorSession *session = cachedSessions[sessionId];
1106
+ DLog(@"verifyPhoneNumberForMultifactor sessionKey: %@", sessionKey);
1107
+ FIRMultiFactorSession *session = cachedSessions[sessionKey];
918
1108
  if (session == nil) {
919
1109
  [RNFBSharedUtils rejectPromiseWithUserInfo:reject
920
1110
  userInfo:(NSMutableDictionary *)@{
@@ -937,13 +1127,15 @@ RCT_EXPORT_METHOD(verifyPhoneNumberForMultiFactor
937
1127
  }];
938
1128
  }
939
1129
 
940
- RCT_EXPORT_METHOD(resolveMultiFactorSignIn
941
- : (FIRApp *)firebaseApp
942
- : (NSString *)sessionKey
943
- : (NSString *)verificationId
944
- : (NSString *)verificationCode
945
- : (RCTPromiseResolveBlock)resolve
946
- : (RCTPromiseRejectBlock)reject) {
1130
+ + (void)resolveMultiFactorSignIn:(NSString *)appName
1131
+ session:(NSString *)session
1132
+ verificationId:(NSString *)verificationId
1133
+ verificationCode:(NSString *)verificationCode
1134
+ resolve:(RCTPromiseResolveBlock)resolve
1135
+ reject:(RCTPromiseRejectBlock)reject {
1136
+ [self initializeSharedStateOnce];
1137
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1138
+
947
1139
  DLog(@"using instance resolve MultiFactorSignIn: %@", firebaseApp.name);
948
1140
 
949
1141
  FIRPhoneAuthCredential *credential =
@@ -955,28 +1147,29 @@ RCT_EXPORT_METHOD(resolveMultiFactorSignIn
955
1147
  FIRMultiFactorAssertion *assertion =
956
1148
  [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
957
1149
 
958
- [cachedResolver[sessionKey] resolveSignInWithAssertion:assertion
959
- completion:^(FIRAuthDataResult *_Nullable authResult,
960
- NSError *_Nullable error) {
961
- DLog(@"authError: %@", error) if (error) {
962
- [self promiseRejectAuthException:reject
963
- error:error];
964
- }
965
- else {
966
- [self promiseWithAuthResult:resolve
967
- rejecter:reject
968
- authResult:authResult];
969
- }
970
- }];
971
- }
1150
+ [cachedResolver[session] resolveSignInWithAssertion:assertion
1151
+ completion:^(FIRAuthDataResult *_Nullable authResult,
1152
+ NSError *_Nullable error) {
1153
+ DLog(@"authError: %@", error) if (error) {
1154
+ [self promiseRejectAuthException:reject error:error];
1155
+ }
1156
+ else {
1157
+ [self promiseWithAuthResult:resolve
1158
+ rejecter:reject
1159
+ authResult:authResult];
1160
+ }
1161
+ }];
1162
+ }
1163
+
1164
+ + (void)resolveTotpSignIn:(NSString *)appName
1165
+ sessionKey:(NSString *)sessionKey
1166
+ uid:(NSString *)uid
1167
+ oneTimePassword:(NSString *)oneTimePassword
1168
+ resolve:(RCTPromiseResolveBlock)resolve
1169
+ reject:(RCTPromiseRejectBlock)reject {
1170
+ [self initializeSharedStateOnce];
1171
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
972
1172
 
973
- RCT_EXPORT_METHOD(resolveTotpSignIn
974
- : (FIRApp *)firebaseApp
975
- : (NSString *)sessionKey
976
- : (NSString *)uid
977
- : (NSString *)oneTimePassword
978
- : (RCTPromiseResolveBlock)resolve
979
- : (RCTPromiseRejectBlock)reject) {
980
1173
  DLog(@"using instance resolve TotpSignIn: %@", firebaseApp.name);
981
1174
 
982
1175
  FIRMultiFactorAssertion *assertion =
@@ -997,11 +1190,13 @@ RCT_EXPORT_METHOD(resolveTotpSignIn
997
1190
  }];
998
1191
  }
999
1192
 
1000
- RCT_EXPORT_METHOD(generateTotpSecret
1001
- : (FIRApp *)firebaseApp
1002
- : (NSString *)sessionKey
1003
- : (RCTPromiseResolveBlock)resolve
1004
- : (RCTPromiseRejectBlock)reject) {
1193
+ + (void)generateTotpSecret:(NSString *)appName
1194
+ sessionKey:(NSString *)sessionKey
1195
+ resolve:(RCTPromiseResolveBlock)resolve
1196
+ reject:(RCTPromiseRejectBlock)reject {
1197
+ [self initializeSharedStateOnce];
1198
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1199
+
1005
1200
  DLog(@"using instance resolve generateTotpSecret: %@", firebaseApp.name);
1006
1201
 
1007
1202
  FIRMultiFactorSession *session = cachedSessions[sessionKey];
@@ -1026,35 +1221,42 @@ RCT_EXPORT_METHOD(generateTotpSecret
1026
1221
  }];
1027
1222
  }
1028
1223
 
1029
- RCT_EXPORT_METHOD(generateQrCodeUrl
1030
- : (FIRApp *)firebaseApp
1031
- : (NSString *)secretKey
1032
- : (NSString *)accountName
1033
- : (NSString *)issuer
1034
- : (RCTPromiseResolveBlock)resolve
1035
- : (RCTPromiseRejectBlock)reject) {
1224
+ + (NSString *)generateQrCodeUrl:(NSString *)appName
1225
+ secretKey:(NSString *)secretKey
1226
+ account:(NSString *)account
1227
+ issuer:(NSString *)issuer {
1228
+ [self initializeSharedStateOnce];
1229
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1230
+
1036
1231
  DLog(@"generateQrCodeUrl using instance resolve generateQrCodeUrl: %@", firebaseApp.name);
1037
1232
  DLog(@"generateQrCodeUrl using secretKey: %@", secretKey);
1038
1233
  FIRTOTPSecret *totpSecret = cachedTotpSecrets[secretKey];
1039
- NSString *url = [totpSecret generateQRCodeURLWithAccountName:accountName issuer:issuer];
1234
+ if (!totpSecret) {
1235
+ RNFBAuthThrowSyncErrorWithCode(@"invalid-multi-factor-secret",
1236
+ @"can't find secret for provided key");
1237
+ }
1238
+ NSString *url = [totpSecret generateQRCodeURLWithAccountName:account issuer:issuer];
1040
1239
  DLog(@"generateQrCodeUrl got QR Code URL %@", url);
1041
- resolve(url);
1240
+ return url;
1042
1241
  }
1043
1242
 
1044
- RCT_EXPORT_METHOD(openInOtpApp
1045
- : (FIRApp *)firebaseApp
1046
- : (NSString *)secretKey
1047
- : (NSString *)qrCodeUri) {
1243
+ + (void)openInOtpApp:(NSString *)appName
1244
+ secretKey:(NSString *)secretKey
1245
+ qrCodeUri:(NSString *)qrCodeUri {
1246
+ [self initializeSharedStateOnce];
1247
+
1048
1248
  DLog(@"generateQrCodeUrl using secretKey: %@", secretKey);
1049
1249
  FIRTOTPSecret *totpSecret = cachedTotpSecrets[secretKey];
1050
1250
  DLog(@"openInOtpApp using qrCodeUri: %@", qrCodeUri);
1051
1251
  [totpSecret openInOTPAppWithQRCodeURL:qrCodeUri];
1052
1252
  }
1053
1253
 
1054
- RCT_EXPORT_METHOD(getSession
1055
- : (FIRApp *)firebaseApp
1056
- : (RCTPromiseResolveBlock)resolve
1057
- : (RCTPromiseRejectBlock)reject) {
1254
+ + (void)getSession:(NSString *)appName
1255
+ resolve:(RCTPromiseResolveBlock)resolve
1256
+ reject:(RCTPromiseRejectBlock)reject {
1257
+ [self initializeSharedStateOnce];
1258
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1259
+
1058
1260
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
1059
1261
  [[user multiFactor] getSessionWithCompletion:^(FIRMultiFactorSession *_Nullable session,
1060
1262
  NSError *_Nullable error) {
@@ -1069,11 +1271,12 @@ RCT_EXPORT_METHOD(getSession
1069
1271
  }];
1070
1272
  }
1071
1273
 
1072
- RCT_EXPORT_METHOD(unenrollMultiFactor
1073
- : (FIRApp *)firebaseApp
1074
- : (NSString *)factorUID
1075
- : (RCTPromiseResolveBlock)resolve
1076
- : (RCTPromiseRejectBlock)reject) {
1274
+ + (void)unenrollMultiFactor:(NSString *)appName
1275
+ factorUID:(NSString *)factorUID
1276
+ resolve:(RCTPromiseResolveBlock)resolve
1277
+ reject:(RCTPromiseRejectBlock)reject {
1278
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1279
+
1077
1280
  DLog(@"using instance unenrollMultiFactor: %@", firebaseApp.name);
1078
1281
 
1079
1282
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
@@ -1089,13 +1292,14 @@ RCT_EXPORT_METHOD(unenrollMultiFactor
1089
1292
  }];
1090
1293
  }
1091
1294
 
1092
- RCT_EXPORT_METHOD(finalizeMultiFactorEnrollment
1093
- : (FIRApp *)firebaseApp
1094
- : (NSString *)verificationId
1095
- : (NSString *)verificationCode
1096
- : (NSString *_Nullable)displayName
1097
- : (RCTPromiseResolveBlock)resolve
1098
- : (RCTPromiseRejectBlock)reject) {
1295
+ + (void)finalizeMultiFactorEnrollment:(NSString *)appName
1296
+ verificationId:(NSString *)verificationId
1297
+ verificationCode:(NSString *)verificationCode
1298
+ displayName:(NSString *_Nullable)displayName
1299
+ resolve:(RCTPromiseResolveBlock)resolve
1300
+ reject:(RCTPromiseRejectBlock)reject {
1301
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1302
+
1099
1303
  DLog(@"using instance finalizeMultifactorEnrollment: %@", firebaseApp.name);
1100
1304
 
1101
1305
  FIRPhoneAuthCredential *credential =
@@ -1118,13 +1322,15 @@ RCT_EXPORT_METHOD(finalizeMultiFactorEnrollment
1118
1322
  }];
1119
1323
  }
1120
1324
 
1121
- RCT_EXPORT_METHOD(finalizeTotpEnrollment
1122
- : (FIRApp *)firebaseApp
1123
- : (NSString *)totpSecret
1124
- : (NSString *)verificationCode
1125
- : (NSString *_Nullable)displayName
1126
- : (RCTPromiseResolveBlock)resolve
1127
- : (RCTPromiseRejectBlock)reject) {
1325
+ + (void)finalizeTotpEnrollment:(NSString *)appName
1326
+ totpSecret:(NSString *)totpSecret
1327
+ verificationCode:(NSString *)verificationCode
1328
+ displayName:(NSString *_Nullable)displayName
1329
+ resolve:(RCTPromiseResolveBlock)resolve
1330
+ reject:(RCTPromiseRejectBlock)reject {
1331
+ [self initializeSharedStateOnce];
1332
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1333
+
1128
1334
  DLog(@"using instance finalizeTotpEnrollment: %@", firebaseApp.name);
1129
1335
 
1130
1336
  FIRTOTPSecret *cachedTotpSecret = cachedTotpSecrets[totpSecret];
@@ -1149,10 +1355,13 @@ RCT_EXPORT_METHOD(finalizeTotpEnrollment
1149
1355
  }];
1150
1356
  }
1151
1357
 
1152
- RCT_EXPORT_METHOD(verifyPhoneNumber
1153
- : (FIRApp *)firebaseApp
1154
- : (NSString *)phoneNumber
1155
- : (NSString *)requestKey) {
1358
+ + (void)verifyPhoneNumber:(NSString *)appName
1359
+ phoneNumber:(NSString *)phoneNumber
1360
+ requestKey:(NSString *)requestKey
1361
+ timeout:(double)timeout
1362
+ forceResend:(BOOL)forceResend {
1363
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1364
+
1156
1365
  DLog(@"using instance verifyPhoneNumber: %@", firebaseApp.name);
1157
1366
 
1158
1367
  [[FIRPhoneAuthProvider providerWithAuth:[FIRAuth authWithApp:firebaseApp]]
@@ -1184,11 +1393,12 @@ RCT_EXPORT_METHOD(verifyPhoneNumber
1184
1393
  }];
1185
1394
  }
1186
1395
 
1187
- RCT_EXPORT_METHOD(confirmationResultConfirm
1188
- : (FIRApp *)firebaseApp
1189
- : (NSString *)verificationCode
1190
- : (RCTPromiseResolveBlock)resolve
1191
- : (RCTPromiseRejectBlock)reject) {
1396
+ + (void)confirmationResultConfirm:(NSString *)appName
1397
+ verificationCode:(NSString *)verificationCode
1398
+ resolve:(RCTPromiseResolveBlock)resolve
1399
+ reject:(RCTPromiseRejectBlock)reject {
1400
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1401
+
1192
1402
  NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
1193
1403
  NSString *verificationId = [defaults stringForKey:@"authVerificationID"];
1194
1404
 
@@ -1210,13 +1420,14 @@ RCT_EXPORT_METHOD(confirmationResultConfirm
1210
1420
  }
1211
1421
  #endif
1212
1422
 
1213
- RCT_EXPORT_METHOD(linkWithCredential
1214
- : (FIRApp *)firebaseApp
1215
- : (NSString *)provider
1216
- : (NSString *)authToken
1217
- : (NSString *)authSecret
1218
- : (RCTPromiseResolveBlock)resolve
1219
- : (RCTPromiseRejectBlock)reject) {
1423
+ + (void)linkWithCredential:(NSString *)appName
1424
+ provider:(NSString *)provider
1425
+ authToken:(NSString *)authToken
1426
+ authSecret:(NSString *)authSecret
1427
+ resolve:(RCTPromiseResolveBlock)resolve
1428
+ reject:(RCTPromiseRejectBlock)reject {
1429
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1430
+
1220
1431
  FIRAuthCredential *credential = [self getCredentialForProvider:provider
1221
1432
  token:authToken
1222
1433
  secret:authSecret
@@ -1246,11 +1457,12 @@ RCT_EXPORT_METHOD(linkWithCredential
1246
1457
  }
1247
1458
  }
1248
1459
 
1249
- RCT_EXPORT_METHOD(linkWithProvider
1250
- : (FIRApp *)firebaseApp
1251
- : (NSDictionary *)provider
1252
- : (RCTPromiseResolveBlock)resolve
1253
- : (RCTPromiseRejectBlock)reject) {
1460
+ + (void)linkWithProvider:(NSString *)appName
1461
+ provider:(NSDictionary *)provider
1462
+ resolve:(RCTPromiseResolveBlock)resolve
1463
+ reject:(RCTPromiseRejectBlock)reject {
1464
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1465
+
1254
1466
  NSString *providerId = provider[@"providerId"];
1255
1467
  if (providerId == nil) {
1256
1468
  [RNFBSharedUtils rejectPromiseWithUserInfo:reject
@@ -1311,11 +1523,12 @@ RCT_EXPORT_METHOD(linkWithProvider
1311
1523
  #endif
1312
1524
  }
1313
1525
 
1314
- RCT_EXPORT_METHOD(unlink
1315
- : (FIRApp *)firebaseApp
1316
- : (NSString *)providerId
1317
- : (RCTPromiseResolveBlock)resolve
1318
- : (RCTPromiseRejectBlock)reject) {
1526
+ + (void)unlink:(NSString *)appName
1527
+ providerId:(NSString *)providerId
1528
+ resolve:(RCTPromiseResolveBlock)resolve
1529
+ reject:(RCTPromiseRejectBlock)reject {
1530
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1531
+
1319
1532
  FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser;
1320
1533
 
1321
1534
  if (user) {
@@ -1335,13 +1548,14 @@ RCT_EXPORT_METHOD(unlink
1335
1548
  }
1336
1549
  }
1337
1550
 
1338
- RCT_EXPORT_METHOD(reauthenticateWithCredential
1339
- : (FIRApp *)firebaseApp
1340
- : (NSString *)provider
1341
- : (NSString *)authToken
1342
- : (NSString *)authSecret
1343
- : (RCTPromiseResolveBlock)resolve
1344
- : (RCTPromiseRejectBlock)reject) {
1551
+ + (void)reauthenticateWithCredential:(NSString *)appName
1552
+ provider:(NSString *)provider
1553
+ authToken:(NSString *)authToken
1554
+ authSecret:(NSString *)authSecret
1555
+ resolve:(RCTPromiseResolveBlock)resolve
1556
+ reject:(RCTPromiseRejectBlock)reject {
1557
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1558
+
1345
1559
  FIRAuthCredential *credential = [self getCredentialForProvider:provider
1346
1560
  token:authToken
1347
1561
  secret:authSecret
@@ -1375,11 +1589,12 @@ RCT_EXPORT_METHOD(reauthenticateWithCredential
1375
1589
  }
1376
1590
  }
1377
1591
 
1378
- RCT_EXPORT_METHOD(reauthenticateWithProvider
1379
- : (FIRApp *)firebaseApp
1380
- : (NSDictionary *)provider
1381
- : (RCTPromiseResolveBlock)resolve
1382
- : (RCTPromiseRejectBlock)reject) {
1592
+ + (void)reauthenticateWithProvider:(NSString *)appName
1593
+ provider:(NSDictionary *)provider
1594
+ resolve:(RCTPromiseResolveBlock)resolve
1595
+ reject:(RCTPromiseRejectBlock)reject {
1596
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1597
+
1383
1598
  NSString *providerId = provider[@"providerId"];
1384
1599
  if (providerId == nil) {
1385
1600
  [RNFBSharedUtils rejectPromiseWithUserInfo:reject
@@ -1440,11 +1655,12 @@ RCT_EXPORT_METHOD(reauthenticateWithProvider
1440
1655
  #endif
1441
1656
  }
1442
1657
 
1443
- RCT_EXPORT_METHOD(fetchSignInMethodsForEmail
1444
- : (FIRApp *)firebaseApp
1445
- : (NSString *)email
1446
- : (RCTPromiseResolveBlock)resolve
1447
- : (RCTPromiseRejectBlock)reject) {
1658
+ + (void)fetchSignInMethodsForEmail:(NSString *)appName
1659
+ email:(NSString *)email
1660
+ resolve:(RCTPromiseResolveBlock)resolve
1661
+ reject:(RCTPromiseRejectBlock)reject {
1662
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1663
+
1448
1664
  [[FIRAuth authWithApp:firebaseApp]
1449
1665
  fetchSignInMethodsForEmail:email
1450
1666
  completion:^(NSArray<NSString *> *_Nullable providers,
@@ -1460,7 +1676,9 @@ RCT_EXPORT_METHOD(fetchSignInMethodsForEmail
1460
1676
  }];
1461
1677
  }
1462
1678
 
1463
- RCT_EXPORT_METHOD(setLanguageCode : (FIRApp *)firebaseApp : (NSString *)code) {
1679
+ + (void)setLanguageCode:(NSString *)appName code:(NSString *)code {
1680
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1681
+
1464
1682
  if (code) {
1465
1683
  [FIRAuth authWithApp:firebaseApp].languageCode = code;
1466
1684
  } else {
@@ -1468,19 +1686,28 @@ RCT_EXPORT_METHOD(setLanguageCode : (FIRApp *)firebaseApp : (NSString *)code) {
1468
1686
  }
1469
1687
  }
1470
1688
 
1471
- RCT_EXPORT_METHOD(setTenantId : (FIRApp *)firebaseApp : (NSString *)tenantID) {
1472
- [FIRAuth authWithApp:firebaseApp].tenantID = tenantID;
1689
+ + (void)setTenantId:(NSString *)appName
1690
+ tenantId:(NSString *)tenantId
1691
+ resolve:(RCTPromiseResolveBlock)resolve
1692
+ reject:(RCTPromiseRejectBlock)reject {
1693
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1694
+
1695
+ [FIRAuth authWithApp:firebaseApp].tenantID = tenantId;
1696
+ resolve([NSNull null]);
1473
1697
  }
1474
1698
 
1475
- RCT_EXPORT_METHOD(useDeviceLanguage : (FIRApp *)firebaseApp) {
1699
+ + (void)useDeviceLanguage:(NSString *)appName {
1700
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1701
+
1476
1702
  [[FIRAuth authWithApp:firebaseApp] useAppLanguage];
1477
1703
  }
1478
1704
 
1479
- RCT_EXPORT_METHOD(verifyPasswordResetCode
1480
- : (FIRApp *)firebaseApp
1481
- : (NSString *)code
1482
- : (RCTPromiseResolveBlock)resolve
1483
- : (RCTPromiseRejectBlock)reject) {
1705
+ + (void)verifyPasswordResetCode:(NSString *)appName
1706
+ code:(NSString *)code
1707
+ resolve:(RCTPromiseResolveBlock)resolve
1708
+ reject:(RCTPromiseRejectBlock)reject {
1709
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1710
+
1484
1711
  [[FIRAuth authWithApp:firebaseApp]
1485
1712
  verifyPasswordResetCode:code
1486
1713
  completion:^(NSString *_Nullable email, NSError *_Nullable error) {
@@ -1492,20 +1719,73 @@ RCT_EXPORT_METHOD(verifyPasswordResetCode
1492
1719
  }];
1493
1720
  }
1494
1721
 
1495
- RCT_EXPORT_METHOD(useEmulator
1496
- : (FIRApp *)firebaseApp
1497
- : (nonnull NSString *)host
1498
- : (NSInteger)port) {
1722
+ + (void)useEmulator:(NSString *)appName host:(nonnull NSString *)host port:(double)port {
1723
+ [self initializeSharedStateOnce];
1724
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
1725
+
1499
1726
  if (!emulatorConfigs[firebaseApp.name]) {
1500
- [[FIRAuth authWithApp:firebaseApp] useEmulatorWithHost:host port:port];
1727
+ [[FIRAuth authWithApp:firebaseApp] useEmulatorWithHost:host port:(NSInteger)port];
1501
1728
  emulatorConfigs[firebaseApp.name] = @YES;
1502
1729
  }
1503
1730
  }
1504
1731
 
1505
- - (FIRAuthCredential *)getCredentialForProvider:(NSString *)provider
1732
+ + (NSString *)nonEmptyStringFromDictionary:(NSDictionary *)dictionary key:(NSString *)key {
1733
+ id value = dictionary[key];
1734
+ if (![value isKindOfClass:[NSString class]]) {
1735
+ return nil;
1736
+ }
1737
+
1738
+ NSString *stringValue = (NSString *)value;
1739
+ NSString *trimmed = [stringValue
1740
+ stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
1741
+ return trimmed.length > 0 ? stringValue : nil;
1742
+ }
1743
+
1744
+ + (NSPersonNameComponents *)personNameComponentsFromDictionary:(NSDictionary *)dictionary {
1745
+ if (dictionary == nil || (id)dictionary == [NSNull null]) {
1746
+ return nil;
1747
+ }
1748
+
1749
+ NSPersonNameComponents *components = [[NSPersonNameComponents alloc] init];
1750
+ BOOL hasAnyComponent = NO;
1751
+ NSString *namePrefix = [self nonEmptyStringFromDictionary:dictionary key:@"namePrefix"];
1752
+ if (namePrefix != nil) {
1753
+ components.namePrefix = namePrefix;
1754
+ hasAnyComponent = YES;
1755
+ }
1756
+ NSString *givenName = [self nonEmptyStringFromDictionary:dictionary key:@"givenName"];
1757
+ if (givenName != nil) {
1758
+ components.givenName = givenName;
1759
+ hasAnyComponent = YES;
1760
+ }
1761
+ NSString *middleName = [self nonEmptyStringFromDictionary:dictionary key:@"middleName"];
1762
+ if (middleName != nil) {
1763
+ components.middleName = middleName;
1764
+ hasAnyComponent = YES;
1765
+ }
1766
+ NSString *familyName = [self nonEmptyStringFromDictionary:dictionary key:@"familyName"];
1767
+ if (familyName != nil) {
1768
+ components.familyName = familyName;
1769
+ hasAnyComponent = YES;
1770
+ }
1771
+ NSString *nameSuffix = [self nonEmptyStringFromDictionary:dictionary key:@"nameSuffix"];
1772
+ if (nameSuffix != nil) {
1773
+ components.nameSuffix = nameSuffix;
1774
+ hasAnyComponent = YES;
1775
+ }
1776
+ NSString *nickname = [self nonEmptyStringFromDictionary:dictionary key:@"nickname"];
1777
+ if (nickname != nil) {
1778
+ components.nickname = nickname;
1779
+ hasAnyComponent = YES;
1780
+ }
1781
+ return hasAnyComponent ? components : nil;
1782
+ }
1783
+
1784
+ + (FIRAuthCredential *)getCredentialForProvider:(NSString *)provider
1506
1785
  token:(NSString *)authToken
1507
1786
  secret:(NSString *)authTokenSecret
1508
1787
  firebaseApp:(FIRApp *)firebaseApp {
1788
+ [self initializeSharedStateOnce];
1509
1789
  FIRAuthCredential *credential;
1510
1790
 
1511
1791
  // First check if we cached an authToken
@@ -1559,7 +1839,7 @@ RCT_EXPORT_METHOD(useEmulator
1559
1839
 
1560
1840
  // This is here to protect against bugs in the iOS SDK which don't
1561
1841
  // correctly refresh the user object when performing certain operations
1562
- - (void)reloadAndReturnUser:(FIRUser *)user
1842
+ + (void)reloadAndReturnUser:(FIRUser *)user
1563
1843
  resolver:(RCTPromiseResolveBlock)resolve
1564
1844
  rejecter:(RCTPromiseRejectBlock)reject
1565
1845
  firebaseApp:(FIRApp *)firebaseApp {
@@ -1572,7 +1852,7 @@ RCT_EXPORT_METHOD(useEmulator
1572
1852
  }];
1573
1853
  }
1574
1854
 
1575
- - (void)promiseNoUser:(RCTPromiseResolveBlock)resolve
1855
+ + (void)promiseNoUser:(RCTPromiseResolveBlock)resolve
1576
1856
  rejecter:(RCTPromiseRejectBlock)reject
1577
1857
  isError:(BOOL)isError {
1578
1858
  if (isError) {
@@ -1587,7 +1867,7 @@ RCT_EXPORT_METHOD(useEmulator
1587
1867
  }
1588
1868
 
1589
1869
  #if TARGET_OS_IOS
1590
- - (NSDictionary *)multiFactorResolverToDict:(FIRMultiFactorResolver *)resolver {
1870
+ + (NSDictionary *)multiFactorResolverToDict:(FIRMultiFactorResolver *)resolver {
1591
1871
  // Temporarily store the non-serializable session for later
1592
1872
  NSString *sessionHash = [NSString stringWithFormat:@"%@", @([resolver.session hash])];
1593
1873
 
@@ -1599,7 +1879,7 @@ RCT_EXPORT_METHOD(useEmulator
1599
1879
  }
1600
1880
  #endif
1601
1881
 
1602
- - (void)promiseRejectAuthException:(RCTPromiseRejectBlock)reject error:(NSError *)error {
1882
+ + (void)promiseRejectAuthException:(RCTPromiseRejectBlock)reject error:(NSError *)error {
1603
1883
  NSDictionary *jsError = [self getJSError:error];
1604
1884
 
1605
1885
  [RNFBSharedUtils
@@ -1613,7 +1893,8 @@ RCT_EXPORT_METHOD(useEmulator
1613
1893
  }];
1614
1894
  }
1615
1895
 
1616
- - (NSDictionary *)getJSError:(NSError *)error {
1896
+ + (NSDictionary *)getJSError:(NSError *)error {
1897
+ [self initializeSharedStateOnce];
1617
1898
  NSString *code = AuthErrorCode_toJSErrorCode[error.code];
1618
1899
  NSString *message = [error localizedDescription];
1619
1900
  NSString *nativeErrorMessage = [error localizedDescription];
@@ -1718,7 +1999,7 @@ RCT_EXPORT_METHOD(useEmulator
1718
1999
  };
1719
2000
  }
1720
2001
 
1721
- - (void)promiseWithUser:(RCTPromiseResolveBlock)resolve
2002
+ + (void)promiseWithUser:(RCTPromiseResolveBlock)resolve
1722
2003
  rejecter:(RCTPromiseRejectBlock)reject
1723
2004
  user:(FIRUser *)user {
1724
2005
  if (user) {
@@ -1729,7 +2010,7 @@ RCT_EXPORT_METHOD(useEmulator
1729
2010
  }
1730
2011
  }
1731
2012
 
1732
- - (void)promiseWithAuthResult:(RCTPromiseResolveBlock)resolve
2013
+ + (void)promiseWithAuthResult:(RCTPromiseResolveBlock)resolve
1733
2014
  rejecter:(RCTPromiseRejectBlock)reject
1734
2015
  authResult:(FIRAuthDataResult *)authResult {
1735
2016
  if (authResult && authResult.user) {
@@ -1770,7 +2051,7 @@ RCT_EXPORT_METHOD(useEmulator
1770
2051
  }
1771
2052
  }
1772
2053
 
1773
- - (NSArray<NSObject *> *)convertProviderData:(NSArray<id<FIRUserInfo>> *)providerData {
2054
+ + (NSArray<NSObject *> *)convertProviderData:(NSArray<id<FIRUserInfo>> *)providerData {
1774
2055
  NSMutableArray *output = [NSMutableArray array];
1775
2056
 
1776
2057
  for (id<FIRUserInfo> userInfo in providerData) {
@@ -1806,7 +2087,7 @@ RCT_EXPORT_METHOD(useEmulator
1806
2087
  return output;
1807
2088
  }
1808
2089
 
1809
- - (NSDictionary *)constantsToExport {
2090
+ + (NSDictionary *)authConstantsDictionary {
1810
2091
  NSDictionary *firebaseApps = [FIRApp allApps];
1811
2092
  NSMutableDictionary *constants = [NSMutableDictionary new];
1812
2093
  NSMutableDictionary *appLanguage = [NSMutableDictionary new];
@@ -1833,7 +2114,7 @@ RCT_EXPORT_METHOD(useEmulator
1833
2114
  return constants;
1834
2115
  }
1835
2116
 
1836
- - (NSDictionary *)firebaseUserToDict:(FIRUser *)user {
2117
+ + (NSDictionary *)firebaseUserToDict:(FIRUser *)user {
1837
2118
  return @{
1838
2119
  keyDisplayName : user.displayName ? (id)user.displayName : [NSNull null],
1839
2120
  keyEmail : user.email ? (id)user.email : [NSNull null],
@@ -1862,7 +2143,7 @@ RCT_EXPORT_METHOD(useEmulator
1862
2143
  }
1863
2144
 
1864
2145
  #if TARGET_OS_IOS
1865
- - (NSArray<NSMutableDictionary *> *)convertMultiFactorData:(NSArray<FIRMultiFactorInfo *> *)hints {
2146
+ + (NSArray<NSMutableDictionary *> *)convertMultiFactorData:(NSArray<FIRMultiFactorInfo *> *)hints {
1866
2147
  NSMutableArray *enrolledFactors = [NSMutableArray array];
1867
2148
 
1868
2149
  for (FIRMultiFactorInfo *hint in hints) {
@@ -1889,7 +2170,8 @@ RCT_EXPORT_METHOD(useEmulator
1889
2170
  }
1890
2171
  #endif
1891
2172
 
1892
- - (NSDictionary *)authCredentialToDict:(FIRAuthCredential *)authCredential {
2173
+ + (NSDictionary *)authCredentialToDict:(FIRAuthCredential *)authCredential {
2174
+ [self initializeSharedStateOnce];
1893
2175
  NSString *authCredentialHash = [NSString stringWithFormat:@"%@", @([authCredential hash])];
1894
2176
 
1895
2177
  // Temporarily store the non-serializable credential for later
@@ -1902,7 +2184,7 @@ RCT_EXPORT_METHOD(useEmulator
1902
2184
  };
1903
2185
  }
1904
2186
 
1905
- - (FIRActionCodeSettings *)buildActionCodeSettings:(NSDictionary *)actionCodeSettings {
2187
+ + (FIRActionCodeSettings *)buildActionCodeSettings:(NSDictionary *)actionCodeSettings {
1906
2188
  FIRActionCodeSettings *settings = [[FIRActionCodeSettings alloc] init];
1907
2189
 
1908
2190
  NSString *url = actionCodeSettings[keyUrl];