@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
@@ -17,15 +17,18 @@ package io.invertase.firebase.auth;
17
17
  *
18
18
  */
19
19
 
20
+ import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithCodeAndMessage;
21
+ import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithExceptionMap;
22
+
20
23
  import android.app.Activity;
21
24
  import android.net.Uri;
22
25
  import android.os.Parcel;
23
26
  import android.util.Log;
24
27
  import androidx.annotation.NonNull;
28
+ import com.facebook.fbreact.specs.NativeRNFBTurboAuthSpec;
25
29
  import com.facebook.react.bridge.Arguments;
26
30
  import com.facebook.react.bridge.Promise;
27
31
  import com.facebook.react.bridge.ReactApplicationContext;
28
- import com.facebook.react.bridge.ReactMethod;
29
32
  import com.facebook.react.bridge.ReadableArray;
30
33
  import com.facebook.react.bridge.ReadableMap;
31
34
  import com.facebook.react.bridge.ReadableMapKeySetIterator;
@@ -72,11 +75,11 @@ import com.google.firebase.auth.TotpSecret;
72
75
  import com.google.firebase.auth.TwitterAuthProvider;
73
76
  import com.google.firebase.auth.UserInfo;
74
77
  import com.google.firebase.auth.UserProfileChangeRequest;
75
- import io.invertase.firebase.app.ReactNativeFirebaseAppModule;
78
+ import io.invertase.firebase.app.NativeRNFBTurboApp;
76
79
  import io.invertase.firebase.common.ReactNativeFirebaseEvent;
77
80
  import io.invertase.firebase.common.ReactNativeFirebaseEventEmitter;
78
- import io.invertase.firebase.common.ReactNativeFirebaseModule;
79
81
  import io.invertase.firebase.common.SharedUtils;
82
+ import io.invertase.firebase.common.TaskExecutorService;
80
83
  import java.text.SimpleDateFormat;
81
84
  import java.util.ArrayList;
82
85
  import java.util.Date;
@@ -86,13 +89,14 @@ import java.util.List;
86
89
  import java.util.Locale;
87
90
  import java.util.Map;
88
91
  import java.util.Objects;
92
+ import java.util.concurrent.ExecutorService;
89
93
  import java.util.concurrent.TimeUnit;
90
94
  import java.util.regex.Matcher;
91
95
  import java.util.regex.Pattern;
92
96
  import javax.annotation.Nullable;
93
97
 
94
98
  @SuppressWarnings({"ThrowableResultOfMethodCallIgnored", "JavaDoc"})
95
- class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
99
+ public class NativeRNFBTurboAuth extends NativeRNFBTurboAuthSpec {
96
100
  // Easier to use would be Instant and DateTimeFormatter, but these are only available in API 26+
97
101
  // According to https://stackoverflow.com/a/2202300 this is not the optimal solution, but we only
98
102
  // get a unix timestamp so we can hardcode the timezone.
@@ -116,8 +120,15 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
116
120
  // https://github.com/invertase/react-native-firebase/issues/4911
117
121
  private HashMap<String, AuthCredential> credentials = new HashMap<>();
118
122
 
119
- ReactNativeFirebaseAuthModule(ReactApplicationContext reactContext) {
120
- super(reactContext, TAG);
123
+ private final TaskExecutorService executorService;
124
+
125
+ public NativeRNFBTurboAuth(ReactApplicationContext reactContext) {
126
+ super(reactContext);
127
+ executorService = new TaskExecutorService("NativeRNFBTurboAuth");
128
+ }
129
+
130
+ private ExecutorService getExecutor() {
131
+ return executorService.getExecutor();
121
132
  }
122
133
 
123
134
  @Override
@@ -161,19 +172,19 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
161
172
  mTotpSecrets.clear();
162
173
  }
163
174
 
164
- @ReactMethod
175
+ @Override
165
176
  public void configureAuthDomain(final String appName) {
166
177
  Log.d(TAG, "configureAuthDomain");
167
178
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
168
179
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
169
- String authDomain = ReactNativeFirebaseAppModule.authDomains.get(appName);
180
+ String authDomain = NativeRNFBTurboApp.authDomains.get(appName);
170
181
  Log.d(TAG, "configureAuthDomain - app " + appName + " domain? " + authDomain);
171
182
  if (authDomain != null) {
172
183
  firebaseAuth.setCustomAuthDomain(authDomain);
173
184
  }
174
185
  }
175
186
 
176
- @ReactMethod
187
+ @Override
177
188
  public void getCustomAuthDomain(final String appName, final Promise promise) {
178
189
  Log.d(TAG, "configureAuthDomain");
179
190
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
@@ -182,7 +193,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
182
193
  }
183
194
 
184
195
  /** Add a new auth state listener - if one doesn't exist already */
185
- @ReactMethod
196
+ @Override
186
197
  public void addAuthStateListener(final String appName) {
187
198
  Log.d(TAG, "addAuthStateListener");
188
199
 
@@ -215,7 +226,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
215
226
  }
216
227
 
217
228
  /** Removes the current auth state listener */
218
- @ReactMethod
229
+ @Override
219
230
  public void removeAuthStateListener(String appName) {
220
231
  Log.d(TAG, "removeAuthStateListener");
221
232
 
@@ -231,7 +242,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
231
242
  }
232
243
 
233
244
  /** Add a new id token listener - if one doesn't exist already */
234
- @ReactMethod
245
+ @Override
235
246
  public void addIdTokenListener(final String appName) {
236
247
  Log.d(TAG, "addIdTokenListener");
237
248
 
@@ -265,7 +276,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
265
276
  }
266
277
 
267
278
  /** Removes the current id token listener */
268
- @ReactMethod
279
+ @Override
269
280
  public void removeIdTokenListener(String appName) {
270
281
  Log.d(TAG, "removeIdTokenListener");
271
282
 
@@ -292,7 +303,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
292
303
  * @param forceRecaptchaFlow
293
304
  * @param promise
294
305
  */
295
- @ReactMethod
306
+ @Override
296
307
  public void forceRecaptchaFlowForTesting(
297
308
  String appName, boolean forceRecaptchaFlow, Promise promise) {
298
309
  Log.d(TAG, "forceRecaptchaFlowForTesting");
@@ -315,7 +326,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
315
326
  * @param smsCode
316
327
  * @param promise
317
328
  */
318
- @ReactMethod
329
+ @Override
319
330
  public void setAutoRetrievedSmsCodeForPhoneNumber(
320
331
  String appName, String phoneNumber, String smsCode, Promise promise) {
321
332
  Log.d(TAG, "setAutoRetrievedSmsCodeForPhoneNumber");
@@ -333,7 +344,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
333
344
  * @param disabled
334
345
  * @param promise
335
346
  */
336
- @ReactMethod
347
+ @Override
337
348
  public void setAppVerificationDisabledForTesting(
338
349
  String appName, boolean disabled, Promise promise) {
339
350
  Log.d(TAG, "setAppVerificationDisabledForTesting");
@@ -344,7 +355,12 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
344
355
  promise.resolve(null);
345
356
  }
346
357
 
347
- @ReactMethod
358
+ @Override
359
+ public void useUserAccessGroup(String appName, String userAccessGroup, Promise promise) {
360
+ promise.resolve(null);
361
+ }
362
+
363
+ @Override
348
364
  public void signOut(String appName, Promise promise) {
349
365
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
350
366
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -358,8 +374,8 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
358
374
  }
359
375
  }
360
376
 
361
- @ReactMethod
362
- private void signInAnonymously(String appName, final Promise promise) {
377
+ @Override
378
+ public void signInAnonymously(String appName, final Promise promise) {
363
379
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
364
380
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
365
381
 
@@ -385,8 +401,8 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
385
401
  * @param password
386
402
  * @param promise
387
403
  */
388
- @ReactMethod
389
- private void createUserWithEmailAndPassword(
404
+ @Override
405
+ public void createUserWithEmailAndPassword(
390
406
  String appName, final String email, final String password, final Promise promise) {
391
407
  Log.d(TAG, "createUserWithEmailAndPassword");
392
408
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
@@ -411,14 +427,13 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
411
427
  * isSignInWithEmailLink
412
428
  *
413
429
  * @param email
414
- * @param promise
415
430
  */
416
- @ReactMethod
417
- public void isSignInWithEmailLink(String appName, String emailLink, final Promise promise) {
431
+ @Override
432
+ public boolean isSignInWithEmailLink(String appName, String emailLink) {
418
433
  Log.d(TAG, "isSignInWithEmailLink");
419
434
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
420
435
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
421
- promise.resolve(firebaseAuth.isSignInWithEmailLink(emailLink));
436
+ return firebaseAuth.isSignInWithEmailLink(emailLink);
422
437
  }
423
438
 
424
439
  /**
@@ -428,8 +443,8 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
428
443
  * @param password
429
444
  * @param promise
430
445
  */
431
- @ReactMethod
432
- private void signInWithEmailAndPassword(
446
+ @Override
447
+ public void signInWithEmailAndPassword(
433
448
  String appName, final String email, final String password, final Promise promise) {
434
449
  Log.d(TAG, "signInWithEmailAndPassword");
435
450
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
@@ -457,8 +472,8 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
457
472
  * @param emailLink
458
473
  * @param promise
459
474
  */
460
- @ReactMethod
461
- private void signInWithEmailLink(
475
+ @Override
476
+ public void signInWithEmailLink(
462
477
  String appName, final String email, final String emailLink, final Promise promise) {
463
478
  Log.d(TAG, "signInWithEmailLink");
464
479
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
@@ -483,8 +498,8 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
483
498
  }
484
499
  }
485
500
 
486
- @ReactMethod
487
- private void signInWithCustomToken(String appName, final String token, final Promise promise) {
501
+ @Override
502
+ public void signInWithCustomToken(String appName, final String token, final Promise promise) {
488
503
  Log.d(TAG, "signInWithCustomToken");
489
504
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
490
505
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -509,7 +524,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
509
524
  * @param authorizationCode
510
525
  * @param promise
511
526
  */
512
- @ReactMethod
527
+ @Override
513
528
  public void revokeToken(String appName, final String authorizationCode, final Promise promise) {
514
529
  Log.d(TAG, "revokeToken");
515
530
 
@@ -524,7 +539,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
524
539
  * @param email
525
540
  * @param promise
526
541
  */
527
- @ReactMethod
542
+ @Override
528
543
  public void sendPasswordResetEmail(
529
544
  String appName, final String email, ReadableMap actionCodeSettings, final Promise promise) {
530
545
  Log.d(TAG, "sendPasswordResetEmail");
@@ -559,7 +574,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
559
574
  * @param email
560
575
  * @param promise
561
576
  */
562
- @ReactMethod
577
+ @Override
563
578
  public void sendSignInLinkToEmail(
564
579
  String appName, String email, ReadableMap actionCodeSettings, final Promise promise) {
565
580
  Log.d(TAG, "sendSignInLinkToEmail");
@@ -589,12 +604,12 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
589
604
  * ---------------------- */
590
605
 
591
606
  /**
592
- * delete
607
+ * deleteUser
593
608
  *
594
609
  * @param promise Promise
595
610
  */
596
- @ReactMethod
597
- public void delete(String appName, final Promise promise) {
611
+ @Override
612
+ public void deleteUser(String appName, final Promise promise) {
598
613
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
599
614
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
600
615
 
@@ -625,7 +640,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
625
640
  *
626
641
  * @param promise
627
642
  */
628
- @ReactMethod
643
+ @Override
629
644
  public void reload(String appName, final Promise promise) {
630
645
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
631
646
  final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -658,7 +673,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
658
673
  *
659
674
  * @param promise
660
675
  */
661
- @ReactMethod
676
+ @Override
662
677
  public void sendEmailVerification(
663
678
  String appName, ReadableMap actionCodeSettings, final Promise promise) {
664
679
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
@@ -697,7 +712,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
697
712
  *
698
713
  * @param promise
699
714
  */
700
- @ReactMethod
715
+ @Override
701
716
  public void verifyBeforeUpdateEmail(
702
717
  String appName, String email, ReadableMap actionCodeSettings, final Promise promise) {
703
718
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
@@ -738,7 +753,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
738
753
  * @param email
739
754
  * @param promise
740
755
  */
741
- @ReactMethod
756
+ @Override
742
757
  public void updateEmail(String appName, final String email, final Promise promise) {
743
758
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
744
759
  final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -772,7 +787,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
772
787
  * @param password
773
788
  * @param promise
774
789
  */
775
- @ReactMethod
790
+ @Override
776
791
  public void updatePassword(String appName, final String password, final Promise promise) {
777
792
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
778
793
  final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -808,8 +823,8 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
808
823
  * @param authSecret
809
824
  * @param promise
810
825
  */
811
- @ReactMethod
812
- private void updatePhoneNumber(
826
+ @Override
827
+ public void updatePhoneNumber(
813
828
  String appName, String provider, String authToken, String authSecret, final Promise promise) {
814
829
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
815
830
  final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -856,7 +871,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
856
871
  * @param props
857
872
  * @param promise
858
873
  */
859
- @ReactMethod
874
+ @Override
860
875
  public void updateProfile(String appName, ReadableMap props, final Promise promise) {
861
876
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
862
877
  final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -898,9 +913,17 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
898
913
  }
899
914
  }
900
915
 
901
- @ReactMethod
902
- private void signInWithCredential(
903
- String appName, String provider, String authToken, String authSecret, final Promise promise) {
916
+ @Override
917
+ public void signInWithCredential(
918
+ String appName,
919
+ String provider,
920
+ String authToken,
921
+ String authSecret,
922
+ @Nullable ReadableMap fullName,
923
+ final Promise promise) {
924
+ // Sign in with Apple fullName has no equivalent credential-level API on the Firebase Android
925
+ // SDK (see AppleFullPersonName in lib/types/auth.ts), so Android intentionally ignores it.
926
+ // Callers should use updateProfile() after sign-in on Android.
904
927
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
905
928
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
906
929
 
@@ -930,8 +953,8 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
930
953
  }
931
954
  }
932
955
 
933
- @ReactMethod
934
- private void signInWithProvider(String appName, ReadableMap provider, final Promise promise) {
956
+ @Override
957
+ public void signInWithProvider(String appName, ReadableMap provider, final Promise promise) {
935
958
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
936
959
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
937
960
 
@@ -1003,7 +1026,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1003
1026
  * @param appName
1004
1027
  * @param phoneNumber
1005
1028
  */
1006
- @ReactMethod
1029
+ @Override
1007
1030
  public void signInWithPhoneNumber(
1008
1031
  String appName, final String phoneNumber, final boolean forceResend, final Promise promise) {
1009
1032
  Log.d(TAG, "signInWithPhoneNumber");
@@ -1112,7 +1135,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1112
1135
  }
1113
1136
  }
1114
1137
 
1115
- @ReactMethod
1138
+ @Override
1116
1139
  public void getSession(final String appName, final Promise promise) {
1117
1140
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
1118
1141
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -1135,7 +1158,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1135
1158
  });
1136
1159
  }
1137
1160
 
1138
- @ReactMethod
1161
+ @Override
1139
1162
  public void unenrollMultiFactor(
1140
1163
  final String appName, final String factorUID, final Promise promise) {
1141
1164
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
@@ -1155,7 +1178,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1155
1178
  });
1156
1179
  }
1157
1180
 
1158
- @ReactMethod
1181
+ @Override
1159
1182
  public void verifyPhoneNumberWithMultiFactorInfo(
1160
1183
  final String appName, final String hintUid, final String sessionKey, final Promise promise) {
1161
1184
  final MultiFactorResolver resolver = mCachedResolvers.get(sessionKey);
@@ -1224,7 +1247,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1224
1247
  PhoneAuthProvider.verifyPhoneNumber(phoneAuthOptions);
1225
1248
  }
1226
1249
 
1227
- @ReactMethod
1250
+ @Override
1228
1251
  public void verifyPhoneNumberForMultiFactor(
1229
1252
  final String appName,
1230
1253
  final String phoneNumber,
@@ -1274,7 +1297,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1274
1297
  PhoneAuthProvider.verifyPhoneNumber(phoneAuthOptions);
1275
1298
  }
1276
1299
 
1277
- @ReactMethod
1300
+ @Override
1278
1301
  public void finalizeMultiFactorEnrollment(
1279
1302
  final String appName,
1280
1303
  final String verificationId,
@@ -1305,24 +1328,19 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1305
1328
  });
1306
1329
  }
1307
1330
 
1308
- @ReactMethod
1309
- public void generateQrCodeUrl(
1310
- final String appName,
1311
- final String secretKey,
1312
- final String account,
1313
- final String issuer,
1314
- final Promise promise) {
1331
+ @Override
1332
+ public String generateQrCodeUrl(
1333
+ final String appName, final String secretKey, final String account, final String issuer) {
1315
1334
 
1316
1335
  TotpSecret secret = mTotpSecrets.get(secretKey);
1317
1336
  if (secret == null) {
1318
- rejectPromiseWithCodeAndMessage(
1319
- promise, "invalid-multi-factor-secret", "can't find secret for provided key");
1320
- return;
1337
+ throw new ReactNativeFirebaseAuthSyncException(
1338
+ "invalid-multi-factor-secret", "can't find secret for provided key");
1321
1339
  }
1322
- promise.resolve(secret.generateQrCodeUrl(account, issuer));
1340
+ return secret.generateQrCodeUrl(account, issuer);
1323
1341
  }
1324
1342
 
1325
- @ReactMethod
1343
+ @Override
1326
1344
  public void openInOtpApp(final String appName, final String secretKey, final String qrCodeUri) {
1327
1345
  TotpSecret secret = mTotpSecrets.get(secretKey);
1328
1346
  if (secret != null) {
@@ -1330,7 +1348,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1330
1348
  }
1331
1349
  }
1332
1350
 
1333
- @ReactMethod
1351
+ @Override
1334
1352
  public void finalizeTotpEnrollment(
1335
1353
  final String appName,
1336
1354
  final String totpSecret,
@@ -1408,7 +1426,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1408
1426
  });
1409
1427
  }
1410
1428
 
1411
- @ReactMethod
1429
+ @Override
1412
1430
  public void resolveMultiFactorSignIn(
1413
1431
  final String appName,
1414
1432
  final String session,
@@ -1421,7 +1439,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1421
1439
  resolveMultiFactorCredential(credential, session, promise);
1422
1440
  }
1423
1441
 
1424
- @ReactMethod
1442
+ @Override
1425
1443
  public void resolveTotpSignIn(
1426
1444
  final String appName,
1427
1445
  final String sessionKey,
@@ -1456,7 +1474,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1456
1474
  });
1457
1475
  }
1458
1476
 
1459
- @ReactMethod
1477
+ @Override
1460
1478
  public void generateTotpSecret(
1461
1479
  final String appName, final String sessionKey, final Promise promise) {
1462
1480
 
@@ -1485,7 +1503,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1485
1503
  });
1486
1504
  }
1487
1505
 
1488
- @ReactMethod
1506
+ @Override
1489
1507
  public void confirmationResultConfirm(
1490
1508
  String appName, final String verificationCode, final Promise promise) {
1491
1509
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
@@ -1526,12 +1544,12 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1526
1544
  * @param phoneNumber
1527
1545
  * @param timeout
1528
1546
  */
1529
- @ReactMethod
1547
+ @Override
1530
1548
  public void verifyPhoneNumber(
1531
1549
  final String appName,
1532
1550
  final String phoneNumber,
1533
1551
  final String requestKey,
1534
- final int timeout,
1552
+ final double timeout,
1535
1553
  final boolean forceResend) {
1536
1554
  Log.d(TAG, "verifyPhoneNumber:" + phoneNumber);
1537
1555
 
@@ -1625,10 +1643,15 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1625
1643
  if (forceResend && mForceResendingToken != null) {
1626
1644
  PhoneAuthProvider.getInstance(firebaseAuth)
1627
1645
  .verifyPhoneNumber(
1628
- phoneNumber, timeout, TimeUnit.SECONDS, activity, callbacks, mForceResendingToken);
1646
+ phoneNumber,
1647
+ (long) timeout,
1648
+ TimeUnit.SECONDS,
1649
+ activity,
1650
+ callbacks,
1651
+ mForceResendingToken);
1629
1652
  } else {
1630
1653
  PhoneAuthProvider.getInstance(firebaseAuth)
1631
- .verifyPhoneNumber(phoneNumber, timeout, TimeUnit.SECONDS, activity, callbacks);
1654
+ .verifyPhoneNumber(phoneNumber, (long) timeout, TimeUnit.SECONDS, activity, callbacks);
1632
1655
  }
1633
1656
  }
1634
1657
  }
@@ -1640,7 +1663,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1640
1663
  * @param newPassword
1641
1664
  * @param promise
1642
1665
  */
1643
- @ReactMethod
1666
+ @Override
1644
1667
  public void confirmPasswordReset(
1645
1668
  String appName, String code, String newPassword, final Promise promise) {
1646
1669
  Log.d(TAG, "confirmPasswordReset");
@@ -1670,7 +1693,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1670
1693
  * @param code
1671
1694
  * @param promise
1672
1695
  */
1673
- @ReactMethod
1696
+ @Override
1674
1697
  public void applyActionCode(String appName, String code, final Promise promise) {
1675
1698
  Log.d(TAG, "applyActionCode");
1676
1699
 
@@ -1697,7 +1720,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1697
1720
  * @param code
1698
1721
  * @param promise
1699
1722
  */
1700
- @ReactMethod
1723
+ @Override
1701
1724
  public void checkActionCode(String appName, String code, final Promise promise) {
1702
1725
  Log.d(TAG, "checkActionCode");
1703
1726
 
@@ -1760,8 +1783,8 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1760
1783
  * @param authSecret
1761
1784
  * @param promise
1762
1785
  */
1763
- @ReactMethod
1764
- private void linkWithCredential(
1786
+ @Override
1787
+ public void linkWithCredential(
1765
1788
  String appName, String provider, String authToken, String authSecret, final Promise promise) {
1766
1789
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
1767
1790
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -1814,8 +1837,8 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1814
1837
  * @param provider
1815
1838
  * @param promise
1816
1839
  */
1817
- @ReactMethod
1818
- private void linkWithProvider(String appName, ReadableMap provider, final Promise promise) {
1840
+ @Override
1841
+ public void linkWithProvider(String appName, ReadableMap provider, final Promise promise) {
1819
1842
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
1820
1843
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
1821
1844
 
@@ -1888,7 +1911,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1888
1911
  }
1889
1912
  }
1890
1913
 
1891
- @ReactMethod
1914
+ @Override
1892
1915
  public void unlink(final String appName, final String providerId, final Promise promise) {
1893
1916
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
1894
1917
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -1914,8 +1937,8 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1914
1937
  }
1915
1938
  }
1916
1939
 
1917
- @ReactMethod
1918
- private void reauthenticateWithCredential(
1940
+ @Override
1941
+ public void reauthenticateWithCredential(
1919
1942
  String appName, String provider, String authToken, String authSecret, final Promise promise) {
1920
1943
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
1921
1944
  final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -1957,8 +1980,8 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
1957
1980
  * @param provider
1958
1981
  * @param promise
1959
1982
  */
1960
- @ReactMethod
1961
- private void reauthenticateWithProvider(
1983
+ @Override
1984
+ public void reauthenticateWithProvider(
1962
1985
  String appName, ReadableMap provider, final Promise promise) {
1963
1986
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
1964
1987
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -2046,7 +2069,12 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
2046
2069
  case "facebook.com":
2047
2070
  return FacebookAuthProvider.getCredential(authToken);
2048
2071
  case "google.com":
2049
- return GoogleAuthProvider.getCredential(authToken, authSecret);
2072
+ // Firebase Android rejects empty tokens; id-token-only and access-token-only flows require
2073
+ // null.
2074
+ // https://firebase.google.com/docs/reference/android/com/google/firebase/auth/GoogleAuthProvider#getCredential(java.lang.String,java.lang.String)
2075
+ String googleIdToken = (authToken == null || authToken.isEmpty()) ? null : authToken;
2076
+ String googleAccessToken = (authSecret == null || authSecret.isEmpty()) ? null : authSecret;
2077
+ return GoogleAuthProvider.getCredential(googleIdToken, googleAccessToken);
2050
2078
  case "twitter.com":
2051
2079
  return TwitterAuthProvider.getCredential(authToken, authSecret);
2052
2080
  case "github.com":
@@ -2104,8 +2132,8 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
2104
2132
  * @param forceRefresh
2105
2133
  * @param promise
2106
2134
  */
2107
- @ReactMethod
2108
- public void getIdToken(String appName, Boolean forceRefresh, final Promise promise) {
2135
+ @Override
2136
+ public void getIdToken(String appName, boolean forceRefresh, final Promise promise) {
2109
2137
  Log.d(TAG, "getIdToken");
2110
2138
 
2111
2139
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
@@ -2140,8 +2168,8 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
2140
2168
  * @param forceRefresh
2141
2169
  * @param promise
2142
2170
  */
2143
- @ReactMethod
2144
- public void getIdTokenResult(String appName, Boolean forceRefresh, final Promise promise) {
2171
+ @Override
2172
+ public void getIdTokenResult(String appName, boolean forceRefresh, final Promise promise) {
2145
2173
  Log.d(TAG, "getIdTokenResult");
2146
2174
 
2147
2175
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
@@ -2201,7 +2229,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
2201
2229
  * @param email
2202
2230
  * @param promise
2203
2231
  */
2204
- @ReactMethod
2232
+ @Override
2205
2233
  public void fetchSignInMethodsForEmail(String appName, String email, final Promise promise) {
2206
2234
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
2207
2235
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -2240,7 +2268,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
2240
2268
  * @param appName
2241
2269
  * @param code
2242
2270
  */
2243
- @ReactMethod
2271
+ @Override
2244
2272
  public void setLanguageCode(String appName, String code) {
2245
2273
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
2246
2274
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -2259,7 +2287,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
2259
2287
  * @param tenantId
2260
2288
  * @param promise
2261
2289
  */
2262
- @ReactMethod
2290
+ @Override
2263
2291
  public void setTenantId(String appName, String tenantId, final Promise promise) {
2264
2292
  try {
2265
2293
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
@@ -2276,7 +2304,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
2276
2304
  *
2277
2305
  * @param appName
2278
2306
  */
2279
- @ReactMethod
2307
+ @Override
2280
2308
  public void useDeviceLanguage(String appName) {
2281
2309
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
2282
2310
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
@@ -2284,7 +2312,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
2284
2312
  firebaseAuth.useAppLanguage();
2285
2313
  }
2286
2314
 
2287
- @ReactMethod
2315
+ @Override
2288
2316
  public void verifyPasswordResetCode(String appName, String code, final Promise promise) {
2289
2317
  Log.d(TAG, "verifyPasswordResetCode");
2290
2318
 
@@ -2307,14 +2335,14 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
2307
2335
  });
2308
2336
  }
2309
2337
 
2310
- @ReactMethod
2311
- public void useEmulator(String appName, String host, int port) {
2338
+ @Override
2339
+ public void useEmulator(String appName, String host, double port) {
2312
2340
 
2313
2341
  if (emulatorConfigs.get(appName) == null) {
2314
2342
  emulatorConfigs.put(appName, "true");
2315
2343
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
2316
2344
  FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
2317
- firebaseAuth.useEmulator(host, port);
2345
+ firebaseAuth.useEmulator(host, (int) port);
2318
2346
  }
2319
2347
  }
2320
2348
 
@@ -2804,7 +2832,7 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule {
2804
2832
  * @return
2805
2833
  */
2806
2834
  @Override
2807
- public Map<String, Object> getConstants() {
2835
+ protected Map<String, Object> getTypedExportedConstants() {
2808
2836
  Map<String, Object> constants = new HashMap<>();
2809
2837
 
2810
2838
  List<FirebaseApp> firebaseAppList = FirebaseApp.getApps(getReactApplicationContext());