@dynamic-labs/sdk-react-core 0.19.0-alpha.7 → 0.19.0-alpha.8
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.
- package/CHANGELOG.md +24 -0
- package/package.cjs +3 -3
- package/package.js +3 -3
- package/package.json +10 -10
- package/src/index.d.ts +1 -1
- package/src/lib/Main.cjs +1 -0
- package/src/lib/Main.js +1 -0
- package/src/lib/components/AuthProviderIcon/AuthProviderIcon.cjs +2 -2
- package/src/lib/components/AuthProviderIcon/AuthProviderIcon.js +2 -2
- package/src/lib/components/IconWithStatus/IconWithStatus.cjs +3 -3
- package/src/lib/components/IconWithStatus/IconWithStatus.d.ts +2 -2
- package/src/lib/components/IconWithStatus/IconWithStatus.js +3 -3
- package/src/lib/components/MockedQrCode/MockedQrCode.cjs +1 -1
- package/src/lib/components/MockedQrCode/MockedQrCode.js +1 -1
- package/src/lib/components/SendBalancePageLayout/SendBalancePageLayout.cjs +2 -2
- package/src/lib/components/SendBalancePageLayout/SendBalancePageLayout.d.ts +1 -1
- package/src/lib/components/SendBalancePageLayout/SendBalancePageLayout.js +2 -2
- package/src/lib/components/SocialSignIn/SocialSignIn.cjs +26 -14
- package/src/lib/components/SocialSignIn/SocialSignIn.d.ts +8 -7
- package/src/lib/components/SocialSignIn/SocialSignIn.js +26 -14
- package/src/lib/components/TransactionOriginDestination/TransactionOriginDestination.d.ts +1 -1
- package/src/lib/components/UserProfile/UserProfile.cjs +4 -1
- package/src/lib/components/UserProfile/UserProfile.js +4 -1
- package/src/lib/components/UserProfile/parts/UserProfileSocialAccount/UserProfileSocialAccount.cjs +15 -13
- package/src/lib/components/UserProfile/parts/UserProfileSocialAccount/UserProfileSocialAccount.js +15 -13
- package/src/lib/context/DynamicContext/helpers.cjs +22 -10
- package/src/lib/context/DynamicContext/helpers.d.ts +4 -2
- package/src/lib/context/DynamicContext/helpers.js +20 -10
- package/src/lib/context/ErrorContext/ErrorContext.cjs +4 -1
- package/src/lib/context/ErrorContext/ErrorContext.js +4 -1
- package/src/lib/context/SocialRedirectContext/SocialRedirectContext.cjs +7 -4
- package/src/lib/context/SocialRedirectContext/SocialRedirectContext.d.ts +5 -5
- package/src/lib/context/SocialRedirectContext/SocialRedirectContext.js +7 -4
- package/src/lib/data/api.cjs +48 -16
- package/src/lib/data/api.d.ts +1 -0
- package/src/lib/data/api.js +50 -19
- package/src/lib/layout/DynamicAuthLayout/HelpContent/WalletListHelpContent/WalletListHelpContent.cjs +1 -1
- package/src/lib/layout/DynamicAuthLayout/HelpContent/WalletListHelpContent/WalletListHelpContent.js +1 -1
- package/src/lib/locale/en/translation.cjs +2 -4
- package/src/lib/locale/en/translation.js +2 -4
- package/src/lib/shared/types/index.d.ts +4 -0
- package/src/lib/shared/utils/functions/wallet/createWallet.cjs +1 -1
- package/src/lib/shared/utils/functions/wallet/createWallet.js +1 -1
- package/src/lib/styles/index.shadow.cjs +1 -1
- package/src/lib/styles/index.shadow.js +1 -1
- package/src/lib/utils/constants/localStorage.cjs +4 -2
- package/src/lib/utils/constants/localStorage.d.ts +2 -1
- package/src/lib/utils/constants/localStorage.js +3 -2
- package/src/lib/utils/functions/getActiveOauthCredential/getActiveOauthCredential.cjs +11 -0
- package/src/lib/utils/functions/getActiveOauthCredential/getActiveOauthCredential.d.ts +2 -0
- package/src/lib/utils/functions/getActiveOauthCredential/getActiveOauthCredential.js +7 -0
- package/src/lib/utils/functions/getActiveOauthCredential/index.d.ts +1 -0
- package/src/lib/utils/functions/getEnabledSocialSignInProvidersAsProviderEnum/getEnabledSocialSignInProvidersAsProviderEnum.d.ts +2 -0
- package/src/lib/utils/functions/getEnabledSocialSignInProvidersAsProviderEnum/index.d.ts +1 -0
- package/src/lib/utils/functions/getProviderEnumForSocialSignInProvider/getProviderEnumForSocialSignInProvider.cjs +19 -0
- package/src/lib/utils/functions/getProviderEnumForSocialSignInProvider/getProviderEnumForSocialSignInProvider.d.ts +2 -0
- package/src/lib/utils/functions/getProviderEnumForSocialSignInProvider/getProviderEnumForSocialSignInProvider.js +15 -0
- package/src/lib/utils/functions/getProviderEnumForSocialSignInProvider/index.d.ts +1 -0
- package/src/lib/utils/functions/getSocialSignInProviderForProviderEnum/getSocialSignInProviderForProviderEnum.cjs +19 -0
- package/src/lib/utils/functions/getSocialSignInProviderForProviderEnum/getSocialSignInProviderForProviderEnum.d.ts +2 -0
- package/src/lib/utils/functions/getSocialSignInProviderForProviderEnum/getSocialSignInProviderForProviderEnum.js +15 -0
- package/src/lib/utils/functions/getSocialSignInProviderForProviderEnum/index.d.ts +1 -0
- package/src/lib/utils/functions/getSocialSignInProviderFromString/getSocialSignInProviderFromString.cjs +19 -0
- package/src/lib/utils/functions/getSocialSignInProviderFromString/getSocialSignInProviderFromString.d.ts +2 -0
- package/src/lib/utils/functions/getSocialSignInProviderFromString/getSocialSignInProviderFromString.js +15 -0
- package/src/lib/utils/functions/getSocialSignInProviderFromString/index.d.ts +1 -0
- package/src/lib/utils/functions/index.d.ts +5 -0
- package/src/lib/utils/hooks/useAuthLayoutChecks/useAuthLayoutChecks.cjs +2 -1
- package/src/lib/utils/hooks/useAuthLayoutChecks/useAuthLayoutChecks.js +2 -1
- package/src/lib/utils/hooks/useConnectWallet/useConnectWallet.cjs +3 -3
- package/src/lib/utils/hooks/useConnectWallet/useConnectWallet.js +4 -4
- package/src/lib/utils/hooks/useFetchProjectSettings/useFetchProjectSettings.cjs +10 -1
- package/src/lib/utils/hooks/useFetchProjectSettings/useFetchProjectSettings.js +10 -1
- package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.cjs +10 -164
- package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.d.ts +2 -2
- package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.js +12 -166
- package/src/lib/utils/hooks/useSocialAuth/index.d.ts +1 -0
- package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.cjs +278 -0
- package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.d.ts +20 -0
- package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.js +274 -0
- package/src/lib/utils/hooks/useVerifyWallet/useVerifyWallet.cjs +13 -3
- package/src/lib/utils/hooks/useVerifyWallet/useVerifyWallet.js +13 -3
- package/src/lib/views/AccountExistsView/AccountExistsView.cjs +4 -2
- package/src/lib/views/AccountExistsView/AccountExistsView.js +4 -2
- package/src/lib/views/BridgeSummaryView/BridgeSummaryView.cjs +1 -1
- package/src/lib/views/BridgeSummaryView/BridgeSummaryView.js +1 -1
- package/src/lib/views/LoginView/LoginView.cjs +1 -1
- package/src/lib/views/LoginView/LoginView.js +1 -1
- package/src/lib/views/LoginView/sections/LoginWidget.d.ts +5 -0
- package/src/lib/views/LoginView/sections/SocialSignInSection/DynamicSocialSignIn/DynamicSocialSignIn.cjs +77 -0
- package/src/lib/views/LoginView/sections/SocialSignInSection/DynamicSocialSignIn/DynamicSocialSignIn.d.ts +3 -0
- package/src/lib/views/LoginView/sections/SocialSignInSection/DynamicSocialSignIn/DynamicSocialSignIn.js +73 -0
- package/src/lib/views/LoginView/sections/SocialSignInSection/DynamicSocialSignIn/index.d.ts +1 -0
- package/src/lib/views/LoginView/sections/SocialSignInSection/MagicSocialSignIn/MagicSocialSignIn.cjs +3 -2
- package/src/lib/views/LoginView/sections/SocialSignInSection/MagicSocialSignIn/MagicSocialSignIn.d.ts +2 -1
- package/src/lib/views/LoginView/sections/SocialSignInSection/MagicSocialSignIn/MagicSocialSignIn.js +3 -2
- package/src/lib/views/LoginView/sections/SocialSignInSection/SocialSignInSection.cjs +18 -4
- package/src/lib/views/LoginView/sections/SocialSignInSection/SocialSignInSection.d.ts +6 -1
- package/src/lib/views/LoginView/sections/SocialSignInSection/SocialSignInSection.js +18 -4
- package/src/lib/views/LoginView/sections/WalletSignInSection/WalletSignInSection.cjs +3 -2
- package/src/lib/views/LoginView/sections/WalletSignInSection/WalletSignInSection.js +3 -2
- package/src/lib/views/LoginView/useLoginView.cjs +9 -10
- package/src/lib/views/LoginView/useLoginView.js +9 -10
- package/src/lib/views/MergeUserAccountsView/MergeUserAccountsView.cjs +1 -1
- package/src/lib/views/MergeUserAccountsView/MergeUserAccountsView.js +1 -1
- package/src/lib/views/NetworkNotSupported/NetworkNotSupported.cjs +1 -1
- package/src/lib/views/NetworkNotSupported/NetworkNotSupported.js +1 -1
- package/src/lib/views/NetworkNotSupportedSwitchManual/NetworkNotSupportedSwitchManual.cjs +1 -1
- package/src/lib/views/NetworkNotSupportedSwitchManual/NetworkNotSupportedSwitchManual.js +1 -1
- package/src/lib/views/NoQrNotInstalledView/NoQrNotInstalledView.cjs +2 -2
- package/src/lib/views/NoQrNotInstalledView/NoQrNotInstalledView.js +2 -2
- package/src/lib/views/PendingConnectView/PendingConnectView.cjs +1 -1
- package/src/lib/views/PendingConnectView/PendingConnectView.js +1 -1
- package/src/lib/views/PendingSignatureView/PendingSignatureView.cjs +1 -1
- package/src/lib/views/PendingSignatureView/PendingSignatureView.js +1 -1
- package/src/lib/views/QrCodeView/QRCode.cjs +3 -3
- package/src/lib/views/QrCodeView/QRCode.d.ts +2 -2
- package/src/lib/views/QrCodeView/QRCode.js +3 -3
- package/src/lib/views/QrCodeView/QrCodeContainer/QrCodeContainer.cjs +2 -2
- package/src/lib/views/QrCodeView/QrCodeContainer/QrCodeContainer.d.ts +2 -1
- package/src/lib/views/QrCodeView/QrCodeContainer/QrCodeContainer.js +2 -2
- package/src/lib/views/QrCodeView/QrCodeView.cjs +2 -2
- package/src/lib/views/QrCodeView/QrCodeView.js +2 -2
- package/src/lib/views/SendBalanceView/SendBalanceView.cjs +1 -1
- package/src/lib/views/SendBalanceView/SendBalanceView.js +1 -1
- package/src/lib/views/SocialRedirectView/SocialRedirectView.cjs +4 -6
- package/src/lib/views/SocialRedirectView/SocialRedirectView.d.ts +1 -1
- package/src/lib/views/SocialRedirectView/SocialRedirectView.js +4 -6
- package/src/lib/views/WalletCannotBeTransferredView/WalletCannotBeTransferredView.cjs +1 -1
- package/src/lib/views/WalletCannotBeTransferredView/WalletCannotBeTransferredView.js +1 -1
- package/src/lib/views/WalletGroupView/WalletGroupView.cjs +1 -1
- package/src/lib/views/WalletGroupView/WalletGroupView.js +1 -1
- package/src/lib/views/WalletList/WalletListItem/WalletListItem.cjs +2 -2
- package/src/lib/views/WalletList/WalletListItem/WalletListItem.js +2 -2
- package/src/lib/views/WalletLockedView/WalletLockedView.cjs +1 -1
- package/src/lib/views/WalletLockedView/WalletLockedView.js +1 -1
- package/src/lib/views/WalletSignSpinnerView/WalletSignSpinnerView.cjs +2 -2
- package/src/lib/views/WalletSignSpinnerView/WalletSignSpinnerView.js +2 -2
- package/src/lib/views/WalletUsedView/WalletUsedView.cjs +1 -1
- package/src/lib/views/WalletUsedView/WalletUsedView.js +1 -1
- package/src/lib/widgets/DynamicBridgeWidget/components/DynamicBridgeWalletCardBody/DynamicBridgeWalletCardBody.cjs +2 -2
- package/src/lib/widgets/DynamicBridgeWidget/components/DynamicBridgeWalletCardBody/DynamicBridgeWalletCardBody.d.ts +1 -1
- package/src/lib/widgets/DynamicBridgeWidget/components/DynamicBridgeWalletCardBody/DynamicBridgeWalletCardBody.js +2 -2
- package/src/lib/widgets/DynamicBridgeWidget/views/WalletsView/WalletsView.cjs +1 -1
- package/src/lib/widgets/DynamicBridgeWidget/views/WalletsView/WalletsView.js +1 -1
- package/src/lib/widgets/DynamicBridgeWidget/views/WalletsView/components/SecondaryWallets/SecondaryWallets.cjs +1 -1
- package/src/lib/widgets/DynamicBridgeWidget/views/WalletsView/components/SecondaryWallets/SecondaryWallets.js +1 -1
- package/src/lib/widgets/DynamicWidget/components/AccountControl/AccountControl.cjs +18 -3
- package/src/lib/widgets/DynamicWidget/components/AccountControl/AccountControl.js +18 -3
- package/src/lib/widgets/DynamicWidget/components/DynamicWidgetHeader/DynamicWidgetWalletHeader/DynamicWidgetWalletHeader.cjs +9 -1
- package/src/lib/widgets/DynamicWidget/components/DynamicWidgetHeader/DynamicWidgetWalletHeader/DynamicWidgetWalletHeader.d.ts +1 -1
- package/src/lib/widgets/DynamicWidget/components/DynamicWidgetHeader/DynamicWidgetWalletHeader/DynamicWidgetWalletHeader.js +9 -1
- package/src/lib/widgets/DynamicWidget/components/WalletIconWithStatus/WalletIconWithStatus.cjs +2 -2
- package/src/lib/widgets/DynamicWidget/components/WalletIconWithStatus/WalletIconWithStatus.d.ts +2 -2
- package/src/lib/widgets/DynamicWidget/components/WalletIconWithStatus/WalletIconWithStatus.js +2 -2
- package/src/lib/widgets/DynamicWidget/prompts/NoQrNotInstalledModalView/NoQrNotInstalledModalView.cjs +3 -3
- package/src/lib/widgets/DynamicWidget/prompts/NoQrNotInstalledModalView/NoQrNotInstalledModalView.js +3 -3
- package/src/lib/widgets/DynamicWidget/prompts/PendingAccountSwitchModal/PendingAccountSwitchModal.cjs +1 -1
- package/src/lib/widgets/DynamicWidget/prompts/PendingAccountSwitchModal/PendingAccountSwitchModal.js +1 -1
- package/src/lib/widgets/DynamicWidget/prompts/PendingAccountSwitchModal/SwitchOrUseActiveAccountView/SwitchOrUseActiveAccountView.cjs +1 -1
- package/src/lib/widgets/DynamicWidget/prompts/PendingAccountSwitchModal/SwitchOrUseActiveAccountView/SwitchOrUseActiveAccountView.js +1 -1
- package/src/lib/widgets/DynamicWidget/prompts/PendingAccountSwitchToLinkModal/PendingAccountSwitchToLinkModal.cjs +1 -1
- package/src/lib/widgets/DynamicWidget/prompts/PendingAccountSwitchToLinkModal/PendingAccountSwitchToLinkModal.js +1 -1
- package/src/lib/widgets/DynamicWidget/prompts/PendingSignModal/DefaultPendingSignModalContent/DefaultPendingSignModalContent.cjs +1 -1
- package/src/lib/widgets/DynamicWidget/prompts/PendingSignModal/DefaultPendingSignModalContent/DefaultPendingSignModalContent.js +1 -1
- package/src/lib/widgets/DynamicWidget/prompts/PrimaryNotConnectedModal/PrimaryNotConnectedModal.cjs +1 -1
- package/src/lib/widgets/DynamicWidget/prompts/PrimaryNotConnectedModal/PrimaryNotConnectedModal.js +1 -1
- package/src/lib/widgets/DynamicWidget/prompts/QrCodeModalView/QrCodeModalView.cjs +6 -5
- package/src/lib/widgets/DynamicWidget/prompts/QrCodeModalView/QrCodeModalView.js +6 -5
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var _tslib = require('../../../../../_virtual/_tslib.cjs');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var types = require('@dynamic-labs/types');
|
|
8
|
+
var utils = require('@dynamic-labs/utils');
|
|
9
|
+
var useInternalDynamicContext = require('../../../context/DynamicContext/useInternalDynamicContext.cjs');
|
|
10
|
+
var api = require('../../../data/api.cjs');
|
|
11
|
+
var useUpdateUserProfileByJWTCallback = require('../useUpdateUserProfileByJWTCallback/useUpdateUserProfileByJWTCallback.cjs');
|
|
12
|
+
var decodeJwt = require('../../../shared/utils/functions/decodeJwt/decodeJwt.cjs');
|
|
13
|
+
require('@dynamic-labs/iconic');
|
|
14
|
+
require('@dynamic-labs/wallet-connector-core');
|
|
15
|
+
require('react/jsx-runtime');
|
|
16
|
+
var ViewContext = require('../../../context/ViewContext/ViewContext.cjs');
|
|
17
|
+
var logger = require('../../../shared/logger.cjs');
|
|
18
|
+
require('@dynamic-labs/wallet-book');
|
|
19
|
+
require('../../constants/colors.cjs');
|
|
20
|
+
require('../../../shared/utils/classes/storage/localStorage.cjs');
|
|
21
|
+
require('ethers');
|
|
22
|
+
require('../../../shared/consts/index.cjs');
|
|
23
|
+
require('@dynamic-labs/multi-wallet');
|
|
24
|
+
var getAuthToken = require('../../functions/getAuthToken/getAuthToken.cjs');
|
|
25
|
+
require('@dynamic-labs/sdk-api');
|
|
26
|
+
var randomString = require('../../functions/randomString/randomString.cjs');
|
|
27
|
+
var stringifyURIQuery = require('../../functions/stringifyURIQuery/stringifyURIQuery.cjs');
|
|
28
|
+
var digestSHA256 = require('../../functions/digestSHA256/digestSHA256.cjs');
|
|
29
|
+
var encodeBase64URL = require('../../functions/encodeBase64URL/encodeBase64URL.cjs');
|
|
30
|
+
var getRedirectURIOrigin = require('../../functions/getRedirectURIOrigin/getRedirectURIOrigin.cjs');
|
|
31
|
+
var useCreateUserProfileByJWTCallback = require('../useCreateUserProfileByJWTCallback/useCreateUserProfileByJWTCallback.cjs');
|
|
32
|
+
var ErrorContext = require('../../../context/ErrorContext/ErrorContext.cjs');
|
|
33
|
+
|
|
34
|
+
const socialProviders = [
|
|
35
|
+
'discord',
|
|
36
|
+
'facebook',
|
|
37
|
+
'github',
|
|
38
|
+
'google',
|
|
39
|
+
'instagram',
|
|
40
|
+
'twitch',
|
|
41
|
+
'twitter',
|
|
42
|
+
];
|
|
43
|
+
// pkce params are only required for twitter and break if added for other providers, like google
|
|
44
|
+
// so we should only add provider that support pkce to this list
|
|
45
|
+
const providersRequiringPkce = ['twitter', 'github'];
|
|
46
|
+
const providersWithoutWindowOpenerRefence = ['twitter'];
|
|
47
|
+
// Hook to handle common social auth logic (for social linking and social sign in)
|
|
48
|
+
const useSocialAuth = ({ sessionTimeout, authMode, onSettled, onError, }) => {
|
|
49
|
+
var _a;
|
|
50
|
+
const { environmentId, onboardingOnlyJwt, setOnboardingOnlyJwt, setCallback, setShowAuthFlow, setIsVerificationInProgress, } = useInternalDynamicContext.useInternalDynamicContext();
|
|
51
|
+
const { setView } = ViewContext.useViewContext();
|
|
52
|
+
const { setErrorMessage, setError: setContextError } = ErrorContext.useErrorContext();
|
|
53
|
+
const { updateUserProfileByJWT } = useUpdateUserProfileByJWTCallback.useUpdateUserProfileByJWTCallback();
|
|
54
|
+
const { createUserProfileByJWT } = useCreateUserProfileByJWTCallback.useCreateUserProfileByJWTCallback();
|
|
55
|
+
const [isProcessing, setIsProcessing] = React.useState(false);
|
|
56
|
+
const [error, setError] = React.useState();
|
|
57
|
+
const providersWaitingOauthMessages = React.useRef({});
|
|
58
|
+
const authWindowInterval = React.useRef();
|
|
59
|
+
const userJwt = (_a = getAuthToken.getAuthToken()) !== null && _a !== void 0 ? _a : onboardingOnlyJwt;
|
|
60
|
+
const clearError = () => {
|
|
61
|
+
setError(undefined);
|
|
62
|
+
setContextError(undefined);
|
|
63
|
+
};
|
|
64
|
+
const handleError = (code, message) => {
|
|
65
|
+
logger.logger.error(message);
|
|
66
|
+
setIsProcessing(false);
|
|
67
|
+
setError({ code, message });
|
|
68
|
+
setErrorMessage(code);
|
|
69
|
+
onError === null || onError === void 0 ? void 0 : onError();
|
|
70
|
+
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
71
|
+
};
|
|
72
|
+
const addOAuthIFrame = (url) => {
|
|
73
|
+
const container = document.getElementById('oauth-iframe-container');
|
|
74
|
+
let oauthIFrame = document.getElementById('oauth-iframe');
|
|
75
|
+
if (!container || oauthIFrame) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
oauthIFrame = document.createElement('iframe');
|
|
79
|
+
oauthIFrame.setAttribute('id', 'oauth-iframe');
|
|
80
|
+
oauthIFrame.setAttribute('src', url);
|
|
81
|
+
container.appendChild(oauthIFrame);
|
|
82
|
+
};
|
|
83
|
+
const removeOAuthIFrame = () => {
|
|
84
|
+
const oauthIFrame = document.getElementById('oauth-iframe');
|
|
85
|
+
if (oauthIFrame) {
|
|
86
|
+
oauthIFrame.remove();
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
const checkValidProvider = (provider) => {
|
|
90
|
+
if (!provider) {
|
|
91
|
+
handleError(types.SocialOAuthErrorCode.NO_PROVIDER, 'Provider is required');
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
if (!socialProviders.includes(provider)) {
|
|
95
|
+
handleError(types.SocialOAuthErrorCode.INVALID_PROVIDER, `Invalid social provider. Valid providers are: ${socialProviders.join(', ')}`);
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
};
|
|
100
|
+
const linkAccount = (provider, code, verifier, state) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
101
|
+
try {
|
|
102
|
+
const jwt = yield api.verifyOAuth(environmentId, provider, {
|
|
103
|
+
code,
|
|
104
|
+
codeVerifier: verifier,
|
|
105
|
+
state,
|
|
106
|
+
}, String(userJwt));
|
|
107
|
+
if (!jwt) {
|
|
108
|
+
handleError(types.SocialOAuthErrorCode.VERIFICATION_ERROR, `Failed to link social account: ${provider}`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
yield updateUserProfileByJWT(jwt);
|
|
112
|
+
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
if (error instanceof utils.SocialAccountAlreadyExistsError) {
|
|
116
|
+
handleError(types.SocialOAuthErrorCode.ACCOUNT_ALREADY_LINKED_TO_DIFFERENT_PROFILE, `Social account already linked to a different profile: ${provider}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
const signInAccount = (provider, code, verifier, state) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
121
|
+
try {
|
|
122
|
+
const jwt = yield api.signInOAuth(environmentId, provider, {
|
|
123
|
+
code,
|
|
124
|
+
codeVerifier: verifier,
|
|
125
|
+
state,
|
|
126
|
+
});
|
|
127
|
+
if (!jwt) {
|
|
128
|
+
handleError(types.SocialOAuthErrorCode.SIGNIN_ERROR, `Failed to sign-in with social account: ${provider}`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
setIsVerificationInProgress(true);
|
|
132
|
+
const decodedJwt = decodeJwt.decodeJwt(jwt);
|
|
133
|
+
if (decodedJwt === null || decodedJwt === void 0 ? void 0 : decodedJwt.missingFields.length) {
|
|
134
|
+
setOnboardingOnlyJwt(jwt);
|
|
135
|
+
setView('collect-user-data-login-with-email');
|
|
136
|
+
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
setCallback('authSuccess');
|
|
140
|
+
yield createUserProfileByJWT(jwt);
|
|
141
|
+
setShowAuthFlow(false);
|
|
142
|
+
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (error instanceof utils.NoAccessError) {
|
|
146
|
+
setView('no-access');
|
|
147
|
+
}
|
|
148
|
+
handleError(types.SocialOAuthErrorCode.GENERAL_ERROR, error);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
const connectSocialAccount = (provider, validator) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
152
|
+
var _b;
|
|
153
|
+
clearInterval(authWindowInterval.current);
|
|
154
|
+
clearError();
|
|
155
|
+
setIsProcessing(true);
|
|
156
|
+
if (!checkValidProvider(provider)) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// invalid connect request
|
|
160
|
+
if (validator && !validator(provider)) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const state = randomString.randomString(8);
|
|
164
|
+
const verifier = randomString.randomString(43);
|
|
165
|
+
const clearListeners = () => {
|
|
166
|
+
removeOAuthIFrame();
|
|
167
|
+
window.removeEventListener('message', handleAuthWindowMessage);
|
|
168
|
+
providersWaitingOauthMessages.current = Object.assign(Object.assign({}, providersWaitingOauthMessages.current), { [provider]: false });
|
|
169
|
+
};
|
|
170
|
+
const handleAuthWindowMessage = (event) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
171
|
+
var _c;
|
|
172
|
+
const message = event.data;
|
|
173
|
+
const isAuthorizationMessage = (message === null || message === void 0 ? void 0 : message.type) === 'authorization_response';
|
|
174
|
+
if (isAuthorizationMessage) {
|
|
175
|
+
logger.logger.debug('Message received', { data: message });
|
|
176
|
+
}
|
|
177
|
+
const isValidMessage = isAuthorizationMessage && (message === null || message === void 0 ? void 0 : message.provider) === provider;
|
|
178
|
+
// don't process invalid messages for provider
|
|
179
|
+
if (!isValidMessage) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
setIsProcessing(true);
|
|
183
|
+
if (!((_c = providersWaitingOauthMessages.current) === null || _c === void 0 ? void 0 : _c[provider])) {
|
|
184
|
+
handleError(types.SocialOAuthErrorCode.SESSION_TIMEOUT, `Connecting ${provider} account session timeout.`);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
clearListeners();
|
|
188
|
+
const { code, error } = message;
|
|
189
|
+
if (error && error !== 'undefined') {
|
|
190
|
+
handleError(types.SocialOAuthErrorCode.OAUTH_ERROR, `Failed to connect ${provider} social account: ${error}`);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (!code) {
|
|
194
|
+
handleError(types.SocialOAuthErrorCode.NO_AUTH_CODE, `Failed to connect ${provider} social account: no authorization code`);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (authMode === 'signin') {
|
|
198
|
+
yield signInAccount(provider, code, verifier, state);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
yield linkAccount(provider, code, verifier, state);
|
|
202
|
+
}
|
|
203
|
+
setIsProcessing(false);
|
|
204
|
+
});
|
|
205
|
+
const loginUrl = yield api.getOauthLoginUrl(environmentId, provider, String(userJwt));
|
|
206
|
+
if (!loginUrl) {
|
|
207
|
+
handleError(types.SocialOAuthErrorCode.NO_OAUTH_URL, `Failed to get login url to connect social account: ${provider}`);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// we need to use an iframe to be the intermediary in communications between the popup and the sdk
|
|
211
|
+
// because of twitter limitations with accessing the window.opener and BroadcastChannel not working between
|
|
212
|
+
// different origins (our api redirect page and the app where the sdk is running)
|
|
213
|
+
const oauthIFrameUrl = `${getRedirectURIOrigin.getRedirectURIOrigin(loginUrl)}/sdkoauth`;
|
|
214
|
+
addOAuthIFrame(oauthIFrameUrl);
|
|
215
|
+
let oauthLoginUrl = loginUrl;
|
|
216
|
+
if (providersRequiringPkce.includes(provider)) {
|
|
217
|
+
const digest = yield digestSHA256.digestSHA256(verifier);
|
|
218
|
+
const pkceParams = stringifyURIQuery.stringifyURIQuery({
|
|
219
|
+
code_challenge: encodeBase64URL.encodeBase64URL(digest),
|
|
220
|
+
code_challenge_method: 'S256',
|
|
221
|
+
state: state,
|
|
222
|
+
});
|
|
223
|
+
oauthLoginUrl = `${loginUrl}&${pkceParams}`;
|
|
224
|
+
}
|
|
225
|
+
if (!((_b = providersWaitingOauthMessages.current) === null || _b === void 0 ? void 0 : _b[provider])) {
|
|
226
|
+
window.addEventListener('message', handleAuthWindowMessage);
|
|
227
|
+
providersWaitingOauthMessages.current = Object.assign(Object.assign({}, providersWaitingOauthMessages.current), { [provider]: true });
|
|
228
|
+
}
|
|
229
|
+
const authWindow = window.open(oauthLoginUrl, '_blank', 'width=500,height=600');
|
|
230
|
+
if (authWindow === null || typeof authWindow === 'undefined') {
|
|
231
|
+
// Pop-ups are blocked
|
|
232
|
+
handleError(types.SocialOAuthErrorCode.OAUTH_WINDOW_BLOCKED, 'Please allow popups and try again.');
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
if (!providersWithoutWindowOpenerRefence.includes(provider)) {
|
|
236
|
+
// For provider that support window.opener, we need to clear all states/listeners when the window is closed
|
|
237
|
+
authWindowInterval.current = setInterval(() => {
|
|
238
|
+
var _a;
|
|
239
|
+
if (!(authWindow === null || authWindow === void 0 ? void 0 : authWindow.closed)) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
clearInterval(authWindowInterval.current);
|
|
243
|
+
setIsProcessing(false);
|
|
244
|
+
// user didn't complete oauth
|
|
245
|
+
if ((_a = providersWaitingOauthMessages.current) === null || _a === void 0 ? void 0 : _a[provider]) {
|
|
246
|
+
onError === null || onError === void 0 ? void 0 : onError();
|
|
247
|
+
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
248
|
+
}
|
|
249
|
+
}, 2000);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
// For provider that don't support window.opener, we need to use a timeout to try to detect when the
|
|
253
|
+
// window is closed
|
|
254
|
+
authWindowInterval.current = setInterval(() => {
|
|
255
|
+
var _a;
|
|
256
|
+
// user didn't complete oauth
|
|
257
|
+
if ((_a = providersWaitingOauthMessages.current) === null || _a === void 0 ? void 0 : _a[provider]) {
|
|
258
|
+
clearListeners();
|
|
259
|
+
handleError(types.SocialOAuthErrorCode.OAUTH_WINDOW_TIMEOUT, `Connecting ${provider} account window timeout.`);
|
|
260
|
+
}
|
|
261
|
+
clearInterval(authWindowInterval.current);
|
|
262
|
+
setIsProcessing(false);
|
|
263
|
+
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
264
|
+
}, sessionTimeout);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
return {
|
|
268
|
+
checkValidProvider,
|
|
269
|
+
connectSocialAccount,
|
|
270
|
+
error,
|
|
271
|
+
handleError,
|
|
272
|
+
isProcessing,
|
|
273
|
+
setError,
|
|
274
|
+
setIsProcessing,
|
|
275
|
+
};
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
exports.useSocialAuth = useSocialAuth;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { ProviderEnum } from '@dynamic-labs/sdk-api';
|
|
3
|
+
import { SocialOAuthError, SocialOAuthErrorCode } from '@dynamic-labs/types';
|
|
4
|
+
type SocialAuthMode = 'link' | 'signin';
|
|
5
|
+
type UseSocialAuthProps = {
|
|
6
|
+
sessionTimeout: number;
|
|
7
|
+
authMode: SocialAuthMode;
|
|
8
|
+
onSettled?: () => void;
|
|
9
|
+
onError?: () => void;
|
|
10
|
+
};
|
|
11
|
+
export declare const useSocialAuth: ({ sessionTimeout, authMode, onSettled, onError, }: UseSocialAuthProps) => {
|
|
12
|
+
readonly checkValidProvider: (provider: ProviderEnum) => boolean;
|
|
13
|
+
readonly connectSocialAccount: (provider: ProviderEnum, validator?: ((provider: ProviderEnum) => boolean) | undefined) => Promise<void>;
|
|
14
|
+
readonly error: SocialOAuthError | undefined;
|
|
15
|
+
readonly handleError: (code: SocialOAuthErrorCode, message: string) => void;
|
|
16
|
+
readonly isProcessing: boolean;
|
|
17
|
+
readonly setError: import("react").Dispatch<import("react").SetStateAction<SocialOAuthError | undefined>>;
|
|
18
|
+
readonly setIsProcessing: import("react").Dispatch<import("react").SetStateAction<boolean>>;
|
|
19
|
+
};
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { __awaiter } from '../../../../../_virtual/_tslib.js';
|
|
2
|
+
import { useState, useRef } from 'react';
|
|
3
|
+
import { SocialOAuthErrorCode } from '@dynamic-labs/types';
|
|
4
|
+
import { SocialAccountAlreadyExistsError, NoAccessError } from '@dynamic-labs/utils';
|
|
5
|
+
import { useInternalDynamicContext } from '../../../context/DynamicContext/useInternalDynamicContext.js';
|
|
6
|
+
import { getOauthLoginUrl, verifyOAuth, signInOAuth } from '../../../data/api.js';
|
|
7
|
+
import { useUpdateUserProfileByJWTCallback } from '../useUpdateUserProfileByJWTCallback/useUpdateUserProfileByJWTCallback.js';
|
|
8
|
+
import { decodeJwt } from '../../../shared/utils/functions/decodeJwt/decodeJwt.js';
|
|
9
|
+
import '@dynamic-labs/iconic';
|
|
10
|
+
import '@dynamic-labs/wallet-connector-core';
|
|
11
|
+
import 'react/jsx-runtime';
|
|
12
|
+
import { useViewContext } from '../../../context/ViewContext/ViewContext.js';
|
|
13
|
+
import { logger } from '../../../shared/logger.js';
|
|
14
|
+
import '@dynamic-labs/wallet-book';
|
|
15
|
+
import '../../constants/colors.js';
|
|
16
|
+
import '../../../shared/utils/classes/storage/localStorage.js';
|
|
17
|
+
import 'ethers';
|
|
18
|
+
import '../../../shared/consts/index.js';
|
|
19
|
+
import '@dynamic-labs/multi-wallet';
|
|
20
|
+
import { getAuthToken } from '../../functions/getAuthToken/getAuthToken.js';
|
|
21
|
+
import '@dynamic-labs/sdk-api';
|
|
22
|
+
import { randomString } from '../../functions/randomString/randomString.js';
|
|
23
|
+
import { stringifyURIQuery } from '../../functions/stringifyURIQuery/stringifyURIQuery.js';
|
|
24
|
+
import { digestSHA256 } from '../../functions/digestSHA256/digestSHA256.js';
|
|
25
|
+
import { encodeBase64URL } from '../../functions/encodeBase64URL/encodeBase64URL.js';
|
|
26
|
+
import { getRedirectURIOrigin } from '../../functions/getRedirectURIOrigin/getRedirectURIOrigin.js';
|
|
27
|
+
import { useCreateUserProfileByJWTCallback } from '../useCreateUserProfileByJWTCallback/useCreateUserProfileByJWTCallback.js';
|
|
28
|
+
import { useErrorContext } from '../../../context/ErrorContext/ErrorContext.js';
|
|
29
|
+
|
|
30
|
+
const socialProviders = [
|
|
31
|
+
'discord',
|
|
32
|
+
'facebook',
|
|
33
|
+
'github',
|
|
34
|
+
'google',
|
|
35
|
+
'instagram',
|
|
36
|
+
'twitch',
|
|
37
|
+
'twitter',
|
|
38
|
+
];
|
|
39
|
+
// pkce params are only required for twitter and break if added for other providers, like google
|
|
40
|
+
// so we should only add provider that support pkce to this list
|
|
41
|
+
const providersRequiringPkce = ['twitter', 'github'];
|
|
42
|
+
const providersWithoutWindowOpenerRefence = ['twitter'];
|
|
43
|
+
// Hook to handle common social auth logic (for social linking and social sign in)
|
|
44
|
+
const useSocialAuth = ({ sessionTimeout, authMode, onSettled, onError, }) => {
|
|
45
|
+
var _a;
|
|
46
|
+
const { environmentId, onboardingOnlyJwt, setOnboardingOnlyJwt, setCallback, setShowAuthFlow, setIsVerificationInProgress, } = useInternalDynamicContext();
|
|
47
|
+
const { setView } = useViewContext();
|
|
48
|
+
const { setErrorMessage, setError: setContextError } = useErrorContext();
|
|
49
|
+
const { updateUserProfileByJWT } = useUpdateUserProfileByJWTCallback();
|
|
50
|
+
const { createUserProfileByJWT } = useCreateUserProfileByJWTCallback();
|
|
51
|
+
const [isProcessing, setIsProcessing] = useState(false);
|
|
52
|
+
const [error, setError] = useState();
|
|
53
|
+
const providersWaitingOauthMessages = useRef({});
|
|
54
|
+
const authWindowInterval = useRef();
|
|
55
|
+
const userJwt = (_a = getAuthToken()) !== null && _a !== void 0 ? _a : onboardingOnlyJwt;
|
|
56
|
+
const clearError = () => {
|
|
57
|
+
setError(undefined);
|
|
58
|
+
setContextError(undefined);
|
|
59
|
+
};
|
|
60
|
+
const handleError = (code, message) => {
|
|
61
|
+
logger.error(message);
|
|
62
|
+
setIsProcessing(false);
|
|
63
|
+
setError({ code, message });
|
|
64
|
+
setErrorMessage(code);
|
|
65
|
+
onError === null || onError === void 0 ? void 0 : onError();
|
|
66
|
+
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
67
|
+
};
|
|
68
|
+
const addOAuthIFrame = (url) => {
|
|
69
|
+
const container = document.getElementById('oauth-iframe-container');
|
|
70
|
+
let oauthIFrame = document.getElementById('oauth-iframe');
|
|
71
|
+
if (!container || oauthIFrame) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
oauthIFrame = document.createElement('iframe');
|
|
75
|
+
oauthIFrame.setAttribute('id', 'oauth-iframe');
|
|
76
|
+
oauthIFrame.setAttribute('src', url);
|
|
77
|
+
container.appendChild(oauthIFrame);
|
|
78
|
+
};
|
|
79
|
+
const removeOAuthIFrame = () => {
|
|
80
|
+
const oauthIFrame = document.getElementById('oauth-iframe');
|
|
81
|
+
if (oauthIFrame) {
|
|
82
|
+
oauthIFrame.remove();
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const checkValidProvider = (provider) => {
|
|
86
|
+
if (!provider) {
|
|
87
|
+
handleError(SocialOAuthErrorCode.NO_PROVIDER, 'Provider is required');
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
if (!socialProviders.includes(provider)) {
|
|
91
|
+
handleError(SocialOAuthErrorCode.INVALID_PROVIDER, `Invalid social provider. Valid providers are: ${socialProviders.join(', ')}`);
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
return true;
|
|
95
|
+
};
|
|
96
|
+
const linkAccount = (provider, code, verifier, state) => __awaiter(void 0, void 0, void 0, function* () {
|
|
97
|
+
try {
|
|
98
|
+
const jwt = yield verifyOAuth(environmentId, provider, {
|
|
99
|
+
code,
|
|
100
|
+
codeVerifier: verifier,
|
|
101
|
+
state,
|
|
102
|
+
}, String(userJwt));
|
|
103
|
+
if (!jwt) {
|
|
104
|
+
handleError(SocialOAuthErrorCode.VERIFICATION_ERROR, `Failed to link social account: ${provider}`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
yield updateUserProfileByJWT(jwt);
|
|
108
|
+
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error instanceof SocialAccountAlreadyExistsError) {
|
|
112
|
+
handleError(SocialOAuthErrorCode.ACCOUNT_ALREADY_LINKED_TO_DIFFERENT_PROFILE, `Social account already linked to a different profile: ${provider}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
const signInAccount = (provider, code, verifier, state) => __awaiter(void 0, void 0, void 0, function* () {
|
|
117
|
+
try {
|
|
118
|
+
const jwt = yield signInOAuth(environmentId, provider, {
|
|
119
|
+
code,
|
|
120
|
+
codeVerifier: verifier,
|
|
121
|
+
state,
|
|
122
|
+
});
|
|
123
|
+
if (!jwt) {
|
|
124
|
+
handleError(SocialOAuthErrorCode.SIGNIN_ERROR, `Failed to sign-in with social account: ${provider}`);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
setIsVerificationInProgress(true);
|
|
128
|
+
const decodedJwt = decodeJwt(jwt);
|
|
129
|
+
if (decodedJwt === null || decodedJwt === void 0 ? void 0 : decodedJwt.missingFields.length) {
|
|
130
|
+
setOnboardingOnlyJwt(jwt);
|
|
131
|
+
setView('collect-user-data-login-with-email');
|
|
132
|
+
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
setCallback('authSuccess');
|
|
136
|
+
yield createUserProfileByJWT(jwt);
|
|
137
|
+
setShowAuthFlow(false);
|
|
138
|
+
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
if (error instanceof NoAccessError) {
|
|
142
|
+
setView('no-access');
|
|
143
|
+
}
|
|
144
|
+
handleError(SocialOAuthErrorCode.GENERAL_ERROR, error);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
const connectSocialAccount = (provider, validator) => __awaiter(void 0, void 0, void 0, function* () {
|
|
148
|
+
var _b;
|
|
149
|
+
clearInterval(authWindowInterval.current);
|
|
150
|
+
clearError();
|
|
151
|
+
setIsProcessing(true);
|
|
152
|
+
if (!checkValidProvider(provider)) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// invalid connect request
|
|
156
|
+
if (validator && !validator(provider)) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const state = randomString(8);
|
|
160
|
+
const verifier = randomString(43);
|
|
161
|
+
const clearListeners = () => {
|
|
162
|
+
removeOAuthIFrame();
|
|
163
|
+
window.removeEventListener('message', handleAuthWindowMessage);
|
|
164
|
+
providersWaitingOauthMessages.current = Object.assign(Object.assign({}, providersWaitingOauthMessages.current), { [provider]: false });
|
|
165
|
+
};
|
|
166
|
+
const handleAuthWindowMessage = (event) => __awaiter(void 0, void 0, void 0, function* () {
|
|
167
|
+
var _c;
|
|
168
|
+
const message = event.data;
|
|
169
|
+
const isAuthorizationMessage = (message === null || message === void 0 ? void 0 : message.type) === 'authorization_response';
|
|
170
|
+
if (isAuthorizationMessage) {
|
|
171
|
+
logger.debug('Message received', { data: message });
|
|
172
|
+
}
|
|
173
|
+
const isValidMessage = isAuthorizationMessage && (message === null || message === void 0 ? void 0 : message.provider) === provider;
|
|
174
|
+
// don't process invalid messages for provider
|
|
175
|
+
if (!isValidMessage) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
setIsProcessing(true);
|
|
179
|
+
if (!((_c = providersWaitingOauthMessages.current) === null || _c === void 0 ? void 0 : _c[provider])) {
|
|
180
|
+
handleError(SocialOAuthErrorCode.SESSION_TIMEOUT, `Connecting ${provider} account session timeout.`);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
clearListeners();
|
|
184
|
+
const { code, error } = message;
|
|
185
|
+
if (error && error !== 'undefined') {
|
|
186
|
+
handleError(SocialOAuthErrorCode.OAUTH_ERROR, `Failed to connect ${provider} social account: ${error}`);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (!code) {
|
|
190
|
+
handleError(SocialOAuthErrorCode.NO_AUTH_CODE, `Failed to connect ${provider} social account: no authorization code`);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (authMode === 'signin') {
|
|
194
|
+
yield signInAccount(provider, code, verifier, state);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
yield linkAccount(provider, code, verifier, state);
|
|
198
|
+
}
|
|
199
|
+
setIsProcessing(false);
|
|
200
|
+
});
|
|
201
|
+
const loginUrl = yield getOauthLoginUrl(environmentId, provider, String(userJwt));
|
|
202
|
+
if (!loginUrl) {
|
|
203
|
+
handleError(SocialOAuthErrorCode.NO_OAUTH_URL, `Failed to get login url to connect social account: ${provider}`);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
// we need to use an iframe to be the intermediary in communications between the popup and the sdk
|
|
207
|
+
// because of twitter limitations with accessing the window.opener and BroadcastChannel not working between
|
|
208
|
+
// different origins (our api redirect page and the app where the sdk is running)
|
|
209
|
+
const oauthIFrameUrl = `${getRedirectURIOrigin(loginUrl)}/sdkoauth`;
|
|
210
|
+
addOAuthIFrame(oauthIFrameUrl);
|
|
211
|
+
let oauthLoginUrl = loginUrl;
|
|
212
|
+
if (providersRequiringPkce.includes(provider)) {
|
|
213
|
+
const digest = yield digestSHA256(verifier);
|
|
214
|
+
const pkceParams = stringifyURIQuery({
|
|
215
|
+
code_challenge: encodeBase64URL(digest),
|
|
216
|
+
code_challenge_method: 'S256',
|
|
217
|
+
state: state,
|
|
218
|
+
});
|
|
219
|
+
oauthLoginUrl = `${loginUrl}&${pkceParams}`;
|
|
220
|
+
}
|
|
221
|
+
if (!((_b = providersWaitingOauthMessages.current) === null || _b === void 0 ? void 0 : _b[provider])) {
|
|
222
|
+
window.addEventListener('message', handleAuthWindowMessage);
|
|
223
|
+
providersWaitingOauthMessages.current = Object.assign(Object.assign({}, providersWaitingOauthMessages.current), { [provider]: true });
|
|
224
|
+
}
|
|
225
|
+
const authWindow = window.open(oauthLoginUrl, '_blank', 'width=500,height=600');
|
|
226
|
+
if (authWindow === null || typeof authWindow === 'undefined') {
|
|
227
|
+
// Pop-ups are blocked
|
|
228
|
+
handleError(SocialOAuthErrorCode.OAUTH_WINDOW_BLOCKED, 'Please allow popups and try again.');
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (!providersWithoutWindowOpenerRefence.includes(provider)) {
|
|
232
|
+
// For provider that support window.opener, we need to clear all states/listeners when the window is closed
|
|
233
|
+
authWindowInterval.current = setInterval(() => {
|
|
234
|
+
var _a;
|
|
235
|
+
if (!(authWindow === null || authWindow === void 0 ? void 0 : authWindow.closed)) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
clearInterval(authWindowInterval.current);
|
|
239
|
+
setIsProcessing(false);
|
|
240
|
+
// user didn't complete oauth
|
|
241
|
+
if ((_a = providersWaitingOauthMessages.current) === null || _a === void 0 ? void 0 : _a[provider]) {
|
|
242
|
+
onError === null || onError === void 0 ? void 0 : onError();
|
|
243
|
+
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
244
|
+
}
|
|
245
|
+
}, 2000);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
// For provider that don't support window.opener, we need to use a timeout to try to detect when the
|
|
249
|
+
// window is closed
|
|
250
|
+
authWindowInterval.current = setInterval(() => {
|
|
251
|
+
var _a;
|
|
252
|
+
// user didn't complete oauth
|
|
253
|
+
if ((_a = providersWaitingOauthMessages.current) === null || _a === void 0 ? void 0 : _a[provider]) {
|
|
254
|
+
clearListeners();
|
|
255
|
+
handleError(SocialOAuthErrorCode.OAUTH_WINDOW_TIMEOUT, `Connecting ${provider} account window timeout.`);
|
|
256
|
+
}
|
|
257
|
+
clearInterval(authWindowInterval.current);
|
|
258
|
+
setIsProcessing(false);
|
|
259
|
+
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
260
|
+
}, sessionTimeout);
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
return {
|
|
264
|
+
checkValidProvider,
|
|
265
|
+
connectSocialAccount,
|
|
266
|
+
error,
|
|
267
|
+
handleError,
|
|
268
|
+
isProcessing,
|
|
269
|
+
setError,
|
|
270
|
+
setIsProcessing,
|
|
271
|
+
};
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
export { useSocialAuth };
|
|
@@ -38,7 +38,7 @@ const useVerifyWallet = ({ consumeNonce, displaySiweStatement, environmentId, pr
|
|
|
38
38
|
const { setExistentAccountData } = AccountExistsContext.useAccountExistsContext();
|
|
39
39
|
const { setView, goToInitialView } = ViewContext.useViewContext();
|
|
40
40
|
const { setErrorMessage, setError } = ErrorContext.useErrorContext();
|
|
41
|
-
const { setUser, multiWalletWidgetState, debugError, multiWallet: multiWalletEnabled, appName, primaryWalletId, setCallback, setShowAuthFlow, setPrimaryWalletId, siweStatement, connectedWallet, authMode, setOnboardingOnlyJwt, authToken, setAuthMode, removeConnectedWalletsInfo, setIsVerificationInProgress, } = useInternalDynamicContext.useInternalDynamicContext();
|
|
41
|
+
const { setUser, multiWalletWidgetState, debugError, multiWallet: multiWalletEnabled, appName, primaryWalletId, setCallback, setShowAuthFlow, setPrimaryWalletId, siweStatement, connectedWallet, authMode, setOnboardingOnlyJwt, authToken, setAuthMode, removeConnectedWalletsInfo, setIsVerificationInProgress, eventsCallbacks, } = useInternalDynamicContext.useInternalDynamicContext();
|
|
42
42
|
// If the user is not already logged it means that we only need to verify
|
|
43
43
|
// We need this boolean for the part of the logic where we already persisted a new authToken,
|
|
44
44
|
// and need to distinguish between logic for verify or linking.
|
|
@@ -68,7 +68,7 @@ const useVerifyWallet = ({ consumeNonce, displaySiweStatement, environmentId, pr
|
|
|
68
68
|
if (Jwt === undefined)
|
|
69
69
|
throw new utils.DynamicError('Could not obtain a valid JWT');
|
|
70
70
|
// TODO DYN-523: add verification here that the JWT is valid with the publicKey
|
|
71
|
-
return Jwt;
|
|
71
|
+
return { Jwt, verifyArgs };
|
|
72
72
|
});
|
|
73
73
|
// Overrides the stored primary wallet id when the
|
|
74
74
|
// user logs in for the first time.
|
|
@@ -149,13 +149,23 @@ const useVerifyWallet = ({ consumeNonce, displaySiweStatement, environmentId, pr
|
|
|
149
149
|
}
|
|
150
150
|
};
|
|
151
151
|
return ({ walletConnector, fetchPublicAddressOpts, publicWalletAddress, captchaToken, oauth, }) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
152
|
+
var _a;
|
|
152
153
|
const walletProvider = getWalletProvider.getWalletProvider(walletConnector);
|
|
153
154
|
try {
|
|
154
155
|
setIsVerificationInProgress(true);
|
|
155
|
-
const Jwt = yield generateJWT(walletConnector, walletProvider, fetchPublicAddressOpts, publicWalletAddress, captchaToken, oauth);
|
|
156
|
+
const { Jwt, verifyArgs } = yield generateJWT(walletConnector, walletProvider, fetchPublicAddressOpts, publicWalletAddress, captchaToken, oauth);
|
|
156
157
|
const decodedJwt = decodeJwt.decodeJwt(Jwt);
|
|
157
158
|
if (decodedJwt === undefined)
|
|
158
159
|
throw new utils.DynamicError('Invalid token!');
|
|
160
|
+
try {
|
|
161
|
+
(_a = eventsCallbacks === null || eventsCallbacks === void 0 ? void 0 : eventsCallbacks.onSignedMessage) === null || _a === void 0 ? void 0 : _a.call(eventsCallbacks, {
|
|
162
|
+
messageToSign: verifyArgs.messageToSign,
|
|
163
|
+
signedMessage: verifyArgs.signedMessage,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
catch (_b) {
|
|
167
|
+
logger.logger.warn('Error calling onSignedMessage callback');
|
|
168
|
+
}
|
|
159
169
|
const user = yield createUserProfile.createUserProfile(decodedJwt);
|
|
160
170
|
const isKycRequired = decodedJwt.missingFields.length;
|
|
161
171
|
setOnboardingOnlyJwt(Jwt);
|
|
@@ -34,7 +34,7 @@ const useVerifyWallet = ({ consumeNonce, displaySiweStatement, environmentId, pr
|
|
|
34
34
|
const { setExistentAccountData } = useAccountExistsContext();
|
|
35
35
|
const { setView, goToInitialView } = useViewContext();
|
|
36
36
|
const { setErrorMessage, setError } = useErrorContext();
|
|
37
|
-
const { setUser, multiWalletWidgetState, debugError, multiWallet: multiWalletEnabled, appName, primaryWalletId, setCallback, setShowAuthFlow, setPrimaryWalletId, siweStatement, connectedWallet, authMode, setOnboardingOnlyJwt, authToken, setAuthMode, removeConnectedWalletsInfo, setIsVerificationInProgress, } = useInternalDynamicContext();
|
|
37
|
+
const { setUser, multiWalletWidgetState, debugError, multiWallet: multiWalletEnabled, appName, primaryWalletId, setCallback, setShowAuthFlow, setPrimaryWalletId, siweStatement, connectedWallet, authMode, setOnboardingOnlyJwt, authToken, setAuthMode, removeConnectedWalletsInfo, setIsVerificationInProgress, eventsCallbacks, } = useInternalDynamicContext();
|
|
38
38
|
// If the user is not already logged it means that we only need to verify
|
|
39
39
|
// We need this boolean for the part of the logic where we already persisted a new authToken,
|
|
40
40
|
// and need to distinguish between logic for verify or linking.
|
|
@@ -64,7 +64,7 @@ const useVerifyWallet = ({ consumeNonce, displaySiweStatement, environmentId, pr
|
|
|
64
64
|
if (Jwt === undefined)
|
|
65
65
|
throw new DynamicError('Could not obtain a valid JWT');
|
|
66
66
|
// TODO DYN-523: add verification here that the JWT is valid with the publicKey
|
|
67
|
-
return Jwt;
|
|
67
|
+
return { Jwt, verifyArgs };
|
|
68
68
|
});
|
|
69
69
|
// Overrides the stored primary wallet id when the
|
|
70
70
|
// user logs in for the first time.
|
|
@@ -145,13 +145,23 @@ const useVerifyWallet = ({ consumeNonce, displaySiweStatement, environmentId, pr
|
|
|
145
145
|
}
|
|
146
146
|
};
|
|
147
147
|
return ({ walletConnector, fetchPublicAddressOpts, publicWalletAddress, captchaToken, oauth, }) => __awaiter(void 0, void 0, void 0, function* () {
|
|
148
|
+
var _a;
|
|
148
149
|
const walletProvider = getWalletProvider(walletConnector);
|
|
149
150
|
try {
|
|
150
151
|
setIsVerificationInProgress(true);
|
|
151
|
-
const Jwt = yield generateJWT(walletConnector, walletProvider, fetchPublicAddressOpts, publicWalletAddress, captchaToken, oauth);
|
|
152
|
+
const { Jwt, verifyArgs } = yield generateJWT(walletConnector, walletProvider, fetchPublicAddressOpts, publicWalletAddress, captchaToken, oauth);
|
|
152
153
|
const decodedJwt = decodeJwt(Jwt);
|
|
153
154
|
if (decodedJwt === undefined)
|
|
154
155
|
throw new DynamicError('Invalid token!');
|
|
156
|
+
try {
|
|
157
|
+
(_a = eventsCallbacks === null || eventsCallbacks === void 0 ? void 0 : eventsCallbacks.onSignedMessage) === null || _a === void 0 ? void 0 : _a.call(eventsCallbacks, {
|
|
158
|
+
messageToSign: verifyArgs.messageToSign,
|
|
159
|
+
signedMessage: verifyArgs.signedMessage,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch (_b) {
|
|
163
|
+
logger.warn('Error calling onSignedMessage callback');
|
|
164
|
+
}
|
|
155
165
|
const user = yield createUserProfile(decodedJwt);
|
|
156
166
|
const isKycRequired = decodedJwt.missingFields.length;
|
|
157
167
|
setOnboardingOnlyJwt(Jwt);
|