|
26 | 26 | import com.facebook.react.bridge.Promise;
|
27 | 27 | import com.facebook.react.bridge.ReactApplicationContext;
|
28 | 28 | import com.facebook.react.bridge.ReactMethod;
|
| 29 | +import com.facebook.react.bridge.ReadableArray; |
29 | 30 | import com.facebook.react.bridge.ReadableMap;
|
| 31 | +import com.facebook.react.bridge.ReadableMapKeySetIterator; |
30 | 32 | import com.facebook.react.bridge.WritableArray;
|
31 | 33 | import com.facebook.react.bridge.WritableMap;
|
32 | 34 | import com.google.android.gms.tasks.OnCompleteListener;
|
| 35 | +import com.google.android.gms.tasks.Task; |
33 | 36 | import com.google.firebase.FirebaseApp;
|
34 | 37 | import com.google.firebase.FirebaseException;
|
35 | 38 | import com.google.firebase.FirebaseNetworkException;
|
@@ -877,6 +880,72 @@ private void signInWithCredential(
|
877 | 880 | }
|
878 | 881 | }
|
879 | 882 |
|
| 883 | + @ReactMethod |
| 884 | + private void signInWithProvider(String appName, ReadableMap provider, final Promise promise) { |
| 885 | + FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); |
| 886 | + FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); |
| 887 | + |
| 888 | + if (provider.getString("providerId") == null) { |
| 889 | + rejectPromiseWithCodeAndMessage( |
| 890 | + promise, |
| 891 | + "invalid-credential", |
| 892 | + "The supplied auth credential is malformed, has expired or is not currently supported."); |
| 893 | + return; |
| 894 | + } |
| 895 | + |
| 896 | + OAuthProvider.Builder builder = OAuthProvider.newBuilder(provider.getString("providerId")); |
| 897 | + // Add scopes if present |
| 898 | + if (provider.hasKey("scopes")) { |
| 899 | + ReadableArray scopes = provider.getArray("scopes"); |
| 900 | + if (scopes != null) { |
| 901 | + List<String> scopeList = new ArrayList<>(); |
| 902 | + for (int i = 0; i < scopes.size(); i++) { |
| 903 | + String scope = scopes.getString(i); |
| 904 | + scopeList.add(scope); |
| 905 | + } |
| 906 | + builder.setScopes(scopeList); |
| 907 | + } |
| 908 | + } |
| 909 | + // Add custom parameters if present |
| 910 | + if (provider.hasKey("customParameters")) { |
| 911 | + ReadableMap customParameters = provider.getMap("customParameters"); |
| 912 | + if (customParameters != null) { |
| 913 | + ReadableMapKeySetIterator iterator = customParameters.keySetIterator(); |
| 914 | + while (iterator.hasNextKey()) { |
| 915 | + String key = iterator.nextKey(); |
| 916 | + builder.addCustomParameter(key, customParameters.getString(key)); |
| 917 | + } |
| 918 | + } |
| 919 | + } |
| 920 | + Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); |
| 921 | + if (pendingResultTask != null) { |
| 922 | + pendingResultTask |
| 923 | + .addOnSuccessListener( |
| 924 | + authResult -> { |
| 925 | + Log.d(TAG, "signInWithProvider:success"); |
| 926 | + promiseWithAuthResult(authResult, promise); |
| 927 | + }) |
| 928 | + .addOnFailureListener( |
| 929 | + e -> { |
| 930 | + Log.d(TAG, "signInWithProvider:failure", e); |
| 931 | + promiseRejectAuthException(promise, e); |
| 932 | + }); |
| 933 | + } else { |
| 934 | + firebaseAuth |
| 935 | + .startActivityForSignInWithProvider(getCurrentActivity(), builder.build()) |
| 936 | + .addOnSuccessListener( |
| 937 | + authResult -> { |
| 938 | + Log.d(TAG, "signInWithProvider:success"); |
| 939 | + promiseWithAuthResult(authResult, promise); |
| 940 | + }) |
| 941 | + .addOnFailureListener( |
| 942 | + e -> { |
| 943 | + Log.d(TAG, "signInWithProvider:failure", e); |
| 944 | + promiseRejectAuthException(promise, e); |
| 945 | + }); |
| 946 | + } |
| 947 | + } |
| 948 | + |
880 | 949 | /**
|
881 | 950 | * signInWithPhoneNumber
|
882 | 951 | *
|
@@ -1527,6 +1596,85 @@ private void linkWithCredential(
|
1527 | 1596 | }
|
1528 | 1597 | }
|
1529 | 1598 |
|
| 1599 | + /** |
| 1600 | + * linkWithProvider |
| 1601 | + * |
| 1602 | + * @param provider |
| 1603 | + * @param promise |
| 1604 | + */ |
| 1605 | + @ReactMethod |
| 1606 | + private void linkWithProvider(String appName, ReadableMap provider, final Promise promise) { |
| 1607 | + FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); |
| 1608 | + FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); |
| 1609 | + |
| 1610 | + if (provider.getString("providerId") == null) { |
| 1611 | + rejectPromiseWithCodeAndMessage( |
| 1612 | + promise, |
| 1613 | + "invalid-credential", |
| 1614 | + "The supplied auth credential is malformed, has expired or is not currently supported."); |
| 1615 | + return; |
| 1616 | + } |
| 1617 | + |
| 1618 | + FirebaseUser user = firebaseAuth.getCurrentUser(); |
| 1619 | + Log.d(TAG, "linkWithProvider"); |
| 1620 | + |
| 1621 | + if (user == null) { |
| 1622 | + promiseNoUser(promise, true); |
| 1623 | + return; |
| 1624 | + } |
| 1625 | + |
| 1626 | + OAuthProvider.Builder builder = OAuthProvider.newBuilder(provider.getString("providerId")); |
| 1627 | + // Add scopes if present |
| 1628 | + if (provider.hasKey("scopes")) { |
| 1629 | + ReadableArray scopes = provider.getArray("scopes"); |
| 1630 | + if (scopes != null) { |
| 1631 | + List<String> scopeList = new ArrayList<>(); |
| 1632 | + for (int i = 0; i < scopes.size(); i++) { |
| 1633 | + String scope = scopes.getString(i); |
| 1634 | + scopeList.add(scope); |
| 1635 | + } |
| 1636 | + builder.setScopes(scopeList); |
| 1637 | + } |
| 1638 | + } |
| 1639 | + // Add custom parameters if present |
| 1640 | + if (provider.hasKey("customParameters")) { |
| 1641 | + ReadableMap customParameters = provider.getMap("customParameters"); |
| 1642 | + if (customParameters != null) { |
| 1643 | + ReadableMapKeySetIterator iterator = customParameters.keySetIterator(); |
| 1644 | + while (iterator.hasNextKey()) { |
| 1645 | + String key = iterator.nextKey(); |
| 1646 | + builder.addCustomParameter(key, customParameters.getString(key)); |
| 1647 | + } |
| 1648 | + } |
| 1649 | + } |
| 1650 | + Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); |
| 1651 | + if (pendingResultTask != null) { |
| 1652 | + pendingResultTask |
| 1653 | + .addOnSuccessListener( |
| 1654 | + authResult -> { |
| 1655 | + Log.d(TAG, "linkWithProvider:success"); |
| 1656 | + promiseWithAuthResult(authResult, promise); |
| 1657 | + }) |
| 1658 | + .addOnFailureListener( |
| 1659 | + e -> { |
| 1660 | + Log.d(TAG, "linkWithProvider:failure", e); |
| 1661 | + promiseRejectAuthException(promise, e); |
| 1662 | + }); |
| 1663 | + } else { |
| 1664 | + user.startActivityForLinkWithProvider(getCurrentActivity(), builder.build()) |
| 1665 | + .addOnSuccessListener( |
| 1666 | + authResult -> { |
| 1667 | + Log.d(TAG, "linkWithProvider:success"); |
| 1668 | + promiseWithAuthResult(authResult, promise); |
| 1669 | + }) |
| 1670 | + .addOnFailureListener( |
| 1671 | + e -> { |
| 1672 | + Log.d(TAG, "linkWithProvider:failure", e); |
| 1673 | + promiseRejectAuthException(promise, e); |
| 1674 | + }); |
| 1675 | + } |
| 1676 | + } |
| 1677 | + |
1530 | 1678 | @ReactMethod
|
1531 | 1679 | public void unlink(final String appName, final String providerId, final Promise promise) {
|
1532 | 1680 | FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
|
@@ -1590,6 +1738,86 @@ private void reauthenticateWithCredential(
|
1590 | 1738 | }
|
1591 | 1739 | }
|
1592 | 1740 |
|
| 1741 | + /** |
| 1742 | + * reauthenticateWithProvider |
| 1743 | + * |
| 1744 | + * @param provider |
| 1745 | + * @param promise |
| 1746 | + */ |
| 1747 | + @ReactMethod |
| 1748 | + private void reauthenticateWithProvider( |
| 1749 | + String appName, ReadableMap provider, final Promise promise) { |
| 1750 | + FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); |
| 1751 | + FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); |
| 1752 | + |
| 1753 | + if (provider.getString("providerId") == null) { |
| 1754 | + rejectPromiseWithCodeAndMessage( |
| 1755 | + promise, |
| 1756 | + "invalid-credential", |
| 1757 | + "The supplied auth credential is malformed, has expired or is not currently supported."); |
| 1758 | + return; |
| 1759 | + } |
| 1760 | + |
| 1761 | + FirebaseUser user = firebaseAuth.getCurrentUser(); |
| 1762 | + Log.d(TAG, "reauthenticateWithProvider"); |
| 1763 | + |
| 1764 | + if (user == null) { |
| 1765 | + promiseNoUser(promise, true); |
| 1766 | + return; |
| 1767 | + } |
| 1768 | + |
| 1769 | + OAuthProvider.Builder builder = OAuthProvider.newBuilder(provider.getString("providerId")); |
| 1770 | + // Add scopes if present |
| 1771 | + if (provider.hasKey("scopes")) { |
| 1772 | + ReadableArray scopes = provider.getArray("scopes"); |
| 1773 | + if (scopes != null) { |
| 1774 | + List<String> scopeList = new ArrayList<>(); |
| 1775 | + for (int i = 0; i < scopes.size(); i++) { |
| 1776 | + String scope = scopes.getString(i); |
| 1777 | + scopeList.add(scope); |
| 1778 | + } |
| 1779 | + builder.setScopes(scopeList); |
| 1780 | + } |
| 1781 | + } |
| 1782 | + // Add custom parameters if present |
| 1783 | + if (provider.hasKey("customParameters")) { |
| 1784 | + ReadableMap customParameters = provider.getMap("customParameters"); |
| 1785 | + if (customParameters != null) { |
| 1786 | + ReadableMapKeySetIterator iterator = customParameters.keySetIterator(); |
| 1787 | + while (iterator.hasNextKey()) { |
| 1788 | + String key = iterator.nextKey(); |
| 1789 | + builder.addCustomParameter(key, customParameters.getString(key)); |
| 1790 | + } |
| 1791 | + } |
| 1792 | + } |
| 1793 | + Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); |
| 1794 | + if (pendingResultTask != null) { |
| 1795 | + pendingResultTask |
| 1796 | + .addOnSuccessListener( |
| 1797 | + authResult -> { |
| 1798 | + Log.d(TAG, "reauthenticateWithProvider:success"); |
| 1799 | + promiseWithAuthResult(authResult, promise); |
| 1800 | + }) |
| 1801 | + .addOnFailureListener( |
| 1802 | + e -> { |
| 1803 | + Log.d(TAG, "reauthenticateWithProvider:failure", e); |
| 1804 | + promiseRejectAuthException(promise, e); |
| 1805 | + }); |
| 1806 | + } else { |
| 1807 | + user.startActivityForReauthenticateWithProvider(getCurrentActivity(), builder.build()) |
| 1808 | + .addOnSuccessListener( |
| 1809 | + authResult -> { |
| 1810 | + Log.d(TAG, "reauthenticateWithProvider:success"); |
| 1811 | + promiseWithAuthResult(authResult, promise); |
| 1812 | + }) |
| 1813 | + .addOnFailureListener( |
| 1814 | + e -> { |
| 1815 | + Log.d(TAG, "reauthenticateWithProvider:failure", e); |
| 1816 | + promiseRejectAuthException(promise, e); |
| 1817 | + }); |
| 1818 | + } |
| 1819 | + } |
| 1820 | + |
1593 | 1821 | /** Returns an instance of AuthCredential for the specified provider */
|
1594 | 1822 | private AuthCredential getCredentialForProvider(
|
1595 | 1823 | String provider, String authToken, String authSecret) {
|
|
0 commit comments