@dynamic-labs/sdk-react-core 4.0.0-alpha.2 → 4.0.0-alpha.4
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 +21 -0
- package/package.cjs +2 -2
- package/package.js +2 -2
- package/package.json +12 -12
- package/src/lib/components/QRCode/QRCode.cjs +2 -2
- package/src/lib/components/QRCode/QRCode.js +2 -2
- package/src/lib/components/SendBalanceForm/SendBalanceForm.cjs +5 -1
- package/src/lib/components/SendBalanceForm/SendBalanceForm.js +5 -1
- package/src/lib/components/TransactionConfirmationPageLayout/utils.cjs +5 -6
- package/src/lib/components/TransactionConfirmationPageLayout/utils.js +5 -6
- package/src/lib/context/DynamicContext/DynamicContext.cjs +14 -16
- package/src/lib/context/DynamicContext/DynamicContext.js +14 -16
- package/src/lib/data/api/oauth/oauth.cjs +14 -0
- package/src/lib/data/api/oauth/oauth.d.ts +1 -0
- package/src/lib/data/api/oauth/oauth.js +14 -1
- package/src/lib/store/internalImplementation/utils/clearExpiredData/clearExpiredData.cjs +1 -6
- package/src/lib/store/internalImplementation/utils/clearExpiredData/clearExpiredData.js +1 -6
- package/src/lib/store/stateConfig.cjs +0 -5
- package/src/lib/store/stateConfig.js +0 -5
- package/src/lib/store/types.d.ts +1 -6
- package/src/lib/styles/index.shadow.cjs +1 -1
- package/src/lib/styles/index.shadow.js +1 -1
- package/src/lib/utils/hooks/useNetworkConfigurationsFromProjectSettings/index.d.ts +1 -0
- package/src/lib/utils/hooks/useNetworkConfigurationsFromProjectSettings/useNetworkConfigurationsFromProjectSettings.cjs +63 -0
- package/src/lib/utils/hooks/useNetworkConfigurationsFromProjectSettings/useNetworkConfigurationsFromProjectSettings.d.ts +9 -0
- package/src/lib/utils/hooks/useNetworkConfigurationsFromProjectSettings/useNetworkConfigurationsFromProjectSettings.js +59 -0
- package/src/lib/utils/hooks/useResetCookieLocalStorage/useResetCookieLocalStorage.cjs +8 -1
- package/src/lib/utils/hooks/useResetCookieLocalStorage/useResetCookieLocalStorage.js +8 -1
- package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.cjs +148 -114
- package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.js +151 -117
- package/src/lib/utils/hooks/useTelegramLogin/useTelegramLogin.cjs +20 -7
- package/src/lib/utils/hooks/useTelegramLogin/useTelegramLogin.d.ts +1 -0
- package/src/lib/utils/hooks/useTelegramLogin/useTelegramLogin.js +20 -7
- package/src/lib/views/MfaChooseDeviceView/MfaChooseDeviceView.cjs +1 -1
- package/src/lib/views/MfaChooseDeviceView/MfaChooseDeviceView.js +1 -1
- package/src/lib/views/WalletList/data.cjs +6 -1
- package/src/lib/views/WalletList/data.js +6 -1
- package/src/lib/store/state/networkConfigurations/index.d.ts +0 -1
- package/src/lib/store/state/networkConfigurations/networkConfigurations.cjs +0 -169
- package/src/lib/store/state/networkConfigurations/networkConfigurations.d.ts +0 -10
- package/src/lib/store/state/networkConfigurations/networkConfigurations.js +0 -161
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useNetworkConfigurationsFromProjectSettings } from './useNetworkConfigurationsFromProjectSettings';
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
var React = require('react');
|
|
7
|
+
|
|
8
|
+
const useNetworkConfigurationsFromProjectSettings = ({ projectSettings, cosmosNetworkOverrides, evmNetworksOverrides, }) => React.useMemo(() => {
|
|
9
|
+
var _a, _b, _c, _d;
|
|
10
|
+
const networks = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.networks;
|
|
11
|
+
if (!networks)
|
|
12
|
+
return {};
|
|
13
|
+
const evm = networks.find((configurations) => configurations.chainName === 'evm');
|
|
14
|
+
const solana = networks.find((configurations) => configurations.chainName === 'solana');
|
|
15
|
+
const cosmos = networks.find((configurations) => configurations.chainName === 'cosmos');
|
|
16
|
+
const starknet = networks.find((configurations) => configurations.chainName === 'starknet');
|
|
17
|
+
let cosmosNetworks = (_a = cosmos === null || cosmos === void 0 ? void 0 : cosmos.networks) === null || _a === void 0 ? void 0 : _a.map((net) => createNetwork(net, parseInt));
|
|
18
|
+
cosmosNetworks = overrideNetworks(cosmosNetworkOverrides, cosmosNetworks);
|
|
19
|
+
let evmNetworks = (_b = evm === null || evm === void 0 ? void 0 : evm.networks) === null || _b === void 0 ? void 0 : _b.map((net) => createNetwork(net, parseInt));
|
|
20
|
+
evmNetworks = overrideNetworks(evmNetworksOverrides, evmNetworks);
|
|
21
|
+
const starknetNetworks = (_c = starknet === null || starknet === void 0 ? void 0 : starknet.networks) === null || _c === void 0 ? void 0 : _c.map((net) => createNetwork(net));
|
|
22
|
+
const solanaNetworks = (_d = solana === null || solana === void 0 ? void 0 : solana.networks) === null || _d === void 0 ? void 0 : _d.map((net) => createNetwork(net));
|
|
23
|
+
if (evmNetworksOverrides) {
|
|
24
|
+
if (Array.isArray(evmNetworksOverrides)) {
|
|
25
|
+
evmNetworks = evmNetworksOverrides;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
evmNetworks = evmNetworksOverrides(evmNetworks !== null && evmNetworks !== void 0 ? evmNetworks : []);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const networkConfigurations = {
|
|
32
|
+
cosmos: cosmosNetworks,
|
|
33
|
+
evm: evmNetworks,
|
|
34
|
+
solana: solanaNetworks,
|
|
35
|
+
starknet: starknetNetworks,
|
|
36
|
+
};
|
|
37
|
+
return networkConfigurations;
|
|
38
|
+
}, [projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.networks, cosmosNetworkOverrides, evmNetworksOverrides]);
|
|
39
|
+
const createNetwork = (network, parser = (input) => input) => ({
|
|
40
|
+
blockExplorerUrls: network.blockExplorerUrls,
|
|
41
|
+
chainId: parser(network.chainId),
|
|
42
|
+
iconUrls: network.iconUrls,
|
|
43
|
+
lcdUrl: network.lcdUrl,
|
|
44
|
+
name: network.name,
|
|
45
|
+
nativeCurrency: network.nativeCurrency,
|
|
46
|
+
networkId: parser(network.networkId),
|
|
47
|
+
privateCustomerRpcUrls: network.privateCustomerRpcUrls,
|
|
48
|
+
rpcUrls: network.rpcUrls,
|
|
49
|
+
vanityName: network.vanityName,
|
|
50
|
+
});
|
|
51
|
+
const overrideNetworks = (networkOverrides, networks) => {
|
|
52
|
+
if (!networkOverrides) {
|
|
53
|
+
return networks;
|
|
54
|
+
}
|
|
55
|
+
if (Array.isArray(networkOverrides)) {
|
|
56
|
+
return networkOverrides;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
return networkOverrides(networks !== null && networks !== void 0 ? networks : []);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
exports.useNetworkConfigurationsFromProjectSettings = useNetworkConfigurationsFromProjectSettings;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ProjectSettings } from '@dynamic-labs/sdk-api-core';
|
|
2
|
+
import { NetworksOverrides } from '../../../context/DynamicContext';
|
|
3
|
+
type UseNetworkConfigurationsFromProjectSettingsProps = {
|
|
4
|
+
projectSettings: ProjectSettings | undefined;
|
|
5
|
+
evmNetworksOverrides?: NetworksOverrides;
|
|
6
|
+
cosmosNetworkOverrides?: NetworksOverrides;
|
|
7
|
+
};
|
|
8
|
+
export declare const useNetworkConfigurationsFromProjectSettings: ({ projectSettings, cosmosNetworkOverrides, evmNetworksOverrides, }: UseNetworkConfigurationsFromProjectSettingsProps) => {};
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
|
|
4
|
+
const useNetworkConfigurationsFromProjectSettings = ({ projectSettings, cosmosNetworkOverrides, evmNetworksOverrides, }) => useMemo(() => {
|
|
5
|
+
var _a, _b, _c, _d;
|
|
6
|
+
const networks = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.networks;
|
|
7
|
+
if (!networks)
|
|
8
|
+
return {};
|
|
9
|
+
const evm = networks.find((configurations) => configurations.chainName === 'evm');
|
|
10
|
+
const solana = networks.find((configurations) => configurations.chainName === 'solana');
|
|
11
|
+
const cosmos = networks.find((configurations) => configurations.chainName === 'cosmos');
|
|
12
|
+
const starknet = networks.find((configurations) => configurations.chainName === 'starknet');
|
|
13
|
+
let cosmosNetworks = (_a = cosmos === null || cosmos === void 0 ? void 0 : cosmos.networks) === null || _a === void 0 ? void 0 : _a.map((net) => createNetwork(net, parseInt));
|
|
14
|
+
cosmosNetworks = overrideNetworks(cosmosNetworkOverrides, cosmosNetworks);
|
|
15
|
+
let evmNetworks = (_b = evm === null || evm === void 0 ? void 0 : evm.networks) === null || _b === void 0 ? void 0 : _b.map((net) => createNetwork(net, parseInt));
|
|
16
|
+
evmNetworks = overrideNetworks(evmNetworksOverrides, evmNetworks);
|
|
17
|
+
const starknetNetworks = (_c = starknet === null || starknet === void 0 ? void 0 : starknet.networks) === null || _c === void 0 ? void 0 : _c.map((net) => createNetwork(net));
|
|
18
|
+
const solanaNetworks = (_d = solana === null || solana === void 0 ? void 0 : solana.networks) === null || _d === void 0 ? void 0 : _d.map((net) => createNetwork(net));
|
|
19
|
+
if (evmNetworksOverrides) {
|
|
20
|
+
if (Array.isArray(evmNetworksOverrides)) {
|
|
21
|
+
evmNetworks = evmNetworksOverrides;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
evmNetworks = evmNetworksOverrides(evmNetworks !== null && evmNetworks !== void 0 ? evmNetworks : []);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const networkConfigurations = {
|
|
28
|
+
cosmos: cosmosNetworks,
|
|
29
|
+
evm: evmNetworks,
|
|
30
|
+
solana: solanaNetworks,
|
|
31
|
+
starknet: starknetNetworks,
|
|
32
|
+
};
|
|
33
|
+
return networkConfigurations;
|
|
34
|
+
}, [projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.networks, cosmosNetworkOverrides, evmNetworksOverrides]);
|
|
35
|
+
const createNetwork = (network, parser = (input) => input) => ({
|
|
36
|
+
blockExplorerUrls: network.blockExplorerUrls,
|
|
37
|
+
chainId: parser(network.chainId),
|
|
38
|
+
iconUrls: network.iconUrls,
|
|
39
|
+
lcdUrl: network.lcdUrl,
|
|
40
|
+
name: network.name,
|
|
41
|
+
nativeCurrency: network.nativeCurrency,
|
|
42
|
+
networkId: parser(network.networkId),
|
|
43
|
+
privateCustomerRpcUrls: network.privateCustomerRpcUrls,
|
|
44
|
+
rpcUrls: network.rpcUrls,
|
|
45
|
+
vanityName: network.vanityName,
|
|
46
|
+
});
|
|
47
|
+
const overrideNetworks = (networkOverrides, networks) => {
|
|
48
|
+
if (!networkOverrides) {
|
|
49
|
+
return networks;
|
|
50
|
+
}
|
|
51
|
+
if (Array.isArray(networkOverrides)) {
|
|
52
|
+
return networkOverrides;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
return networkOverrides(networks !== null && networks !== void 0 ? networks : []);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export { useNetworkConfigurationsFromProjectSettings };
|
|
@@ -24,10 +24,17 @@ var user = require('../../../store/state/user/user.cjs');
|
|
|
24
24
|
require('../../../locale/locale.cjs');
|
|
25
25
|
var user$1 = require('../../../data/api/user/user.cjs');
|
|
26
26
|
var isCookieEnabled = require('../../functions/isCookieEnabled/isCookieEnabled.cjs');
|
|
27
|
+
var useDynamicEvents = require('../events/useDynamicEvents/useDynamicEvents.cjs');
|
|
27
28
|
|
|
28
29
|
const useResetCookieLocalStorage = ({ environmentId, projectSettings, setPrimaryWalletId, }) => {
|
|
29
30
|
const didRefreshUserRef = React.useRef(false);
|
|
30
31
|
const user$2 = user.getUser();
|
|
32
|
+
/**
|
|
33
|
+
* As an extra layer of safety, we must explicitly prevent the refresh from being called
|
|
34
|
+
* after a logout
|
|
35
|
+
*/
|
|
36
|
+
const hasLoggedOut = React.useRef(false);
|
|
37
|
+
useDynamicEvents.useInternalDynamicEvents('logout', () => (hasLoggedOut.current = true));
|
|
31
38
|
/**
|
|
32
39
|
* run this effect every time the user or project settings change
|
|
33
40
|
* but not when the process was already done.
|
|
@@ -48,7 +55,7 @@ const useResetCookieLocalStorage = ({ environmentId, projectSettings, setPrimary
|
|
|
48
55
|
* so attempt to set it here.
|
|
49
56
|
*/
|
|
50
57
|
const maybeInitUserRefresh = () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
51
|
-
if (!user$2 && isCookieEnabled.isCookieEnabled()) {
|
|
58
|
+
if (!user$2 && isCookieEnabled.isCookieEnabled() && !hasLoggedOut.current) {
|
|
52
59
|
// Disable all next calls to this method
|
|
53
60
|
didRefreshUserRef.current = true;
|
|
54
61
|
try {
|
|
@@ -20,10 +20,17 @@ import { getUser } from '../../../store/state/user/user.js';
|
|
|
20
20
|
import '../../../locale/locale.js';
|
|
21
21
|
import { refreshUserJwt } from '../../../data/api/user/user.js';
|
|
22
22
|
import { isCookieEnabled } from '../../functions/isCookieEnabled/isCookieEnabled.js';
|
|
23
|
+
import { useInternalDynamicEvents } from '../events/useDynamicEvents/useDynamicEvents.js';
|
|
23
24
|
|
|
24
25
|
const useResetCookieLocalStorage = ({ environmentId, projectSettings, setPrimaryWalletId, }) => {
|
|
25
26
|
const didRefreshUserRef = useRef(false);
|
|
26
27
|
const user = getUser();
|
|
28
|
+
/**
|
|
29
|
+
* As an extra layer of safety, we must explicitly prevent the refresh from being called
|
|
30
|
+
* after a logout
|
|
31
|
+
*/
|
|
32
|
+
const hasLoggedOut = useRef(false);
|
|
33
|
+
useInternalDynamicEvents('logout', () => (hasLoggedOut.current = true));
|
|
27
34
|
/**
|
|
28
35
|
* run this effect every time the user or project settings change
|
|
29
36
|
* but not when the process was already done.
|
|
@@ -44,7 +51,7 @@ const useResetCookieLocalStorage = ({ environmentId, projectSettings, setPrimary
|
|
|
44
51
|
* so attempt to set it here.
|
|
45
52
|
*/
|
|
46
53
|
const maybeInitUserRefresh = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
47
|
-
if (!user && isCookieEnabled()) {
|
|
54
|
+
if (!user && isCookieEnabled() && !hasLoggedOut.current) {
|
|
48
55
|
// Disable all next calls to this method
|
|
49
56
|
didRefreshUserRef.current = true;
|
|
50
57
|
try {
|
|
@@ -134,11 +134,11 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
|
|
|
134
134
|
});
|
|
135
135
|
const [isProcessing, setIsProcessing] = React.useState(false);
|
|
136
136
|
const [error, setError] = React.useState();
|
|
137
|
-
const clearError = () => {
|
|
137
|
+
const clearError = React.useCallback(() => {
|
|
138
138
|
setError(undefined);
|
|
139
139
|
setContextError(undefined);
|
|
140
|
-
};
|
|
141
|
-
const onFailed = (provider, reason, options) => {
|
|
140
|
+
}, [setContextError]);
|
|
141
|
+
const onFailed = React.useCallback((provider, reason, options) => {
|
|
142
142
|
setIsProcessing(false);
|
|
143
143
|
onError === null || onError === void 0 ? void 0 : onError();
|
|
144
144
|
onSettled === null || onSettled === void 0 ? void 0 : onSettled();
|
|
@@ -148,15 +148,15 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
|
|
|
148
148
|
provider,
|
|
149
149
|
type: 'social',
|
|
150
150
|
}, reason);
|
|
151
|
-
};
|
|
152
|
-
const handleError = (provider, code, message, options) => {
|
|
151
|
+
}, [onError, onSettled]);
|
|
152
|
+
const handleError = React.useCallback((provider, code, message, options) => {
|
|
153
153
|
const error = { code, message };
|
|
154
154
|
logger.logger.error(message);
|
|
155
155
|
setError(error);
|
|
156
156
|
setErrorMessage(code);
|
|
157
157
|
onFailed(provider, { error }, options);
|
|
158
|
-
};
|
|
159
|
-
const checkValidProvider = (provider, authMode) => {
|
|
158
|
+
}, [onFailed, setErrorMessage]);
|
|
159
|
+
const checkValidProvider = React.useCallback((provider, authMode) => {
|
|
160
160
|
if (!provider) {
|
|
161
161
|
handleError(provider, types.SocialOAuthErrorCode.NO_PROVIDER, 'Provider is required', { raiseAuthFailure: authMode === 'signin' });
|
|
162
162
|
return false;
|
|
@@ -166,8 +166,8 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
|
|
|
166
166
|
return false;
|
|
167
167
|
}
|
|
168
168
|
return true;
|
|
169
|
-
};
|
|
170
|
-
const linkAccount = (provider, apiCall) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
169
|
+
}, [handleError]);
|
|
170
|
+
const linkAccount = React.useCallback((provider, apiCall) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
171
171
|
try {
|
|
172
172
|
const response = yield apiCall();
|
|
173
173
|
if (!response) {
|
|
@@ -181,112 +181,16 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
|
|
|
181
181
|
handleError(provider, types.SocialOAuthErrorCode.ACCOUNT_ALREADY_LINKED_TO_DIFFERENT_PROFILE, `Social account already linked to a different profile: ${provider}`, { raiseAuthFailure: false });
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
|
-
});
|
|
185
|
-
const signInAccount = (provider, apiCall) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
184
|
+
}), [handleError, onSettled]);
|
|
185
|
+
const signInAccount = React.useCallback((provider, apiCall) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
|
|
186
186
|
yield initAuth({
|
|
187
187
|
onError: () => handleError(provider, types.SocialOAuthErrorCode.SIGNIN_ERROR, `Failed to sign-in with social account: ${provider}`, { raiseAuthFailure: true }),
|
|
188
188
|
onSettled,
|
|
189
189
|
options: { provider },
|
|
190
190
|
verifyFunction: () => apiCall(),
|
|
191
191
|
});
|
|
192
|
-
});
|
|
193
|
-
const
|
|
194
|
-
var _b, _c;
|
|
195
|
-
clearError();
|
|
196
|
-
setIsProcessing(true);
|
|
197
|
-
if (!authMode) {
|
|
198
|
-
logger.logger.error('Auth mode is required. Please use either "link" or "signin"');
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
if (!checkValidProvider(provider, authMode)) {
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
// invalid connect request
|
|
205
|
-
if (validator && !validator(provider)) {
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
dynamicEvents.dynamicEvents.emit('authInit', {
|
|
209
|
-
option: provider,
|
|
210
|
-
provider,
|
|
211
|
-
type: 'social',
|
|
212
|
-
});
|
|
213
|
-
if (provider === sdkApiCore.ProviderEnum.Farcaster) {
|
|
214
|
-
return connectWithFarcaster(authMode, {
|
|
215
|
-
captchaToken,
|
|
216
|
-
redirectUrl,
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
const state = randomString.randomString(32);
|
|
220
|
-
const verifier = randomString.randomString(43);
|
|
221
|
-
// Whether we will use PKCE (code verifier/challenge) for this provider
|
|
222
|
-
const usingPkce = providersRequiringPkce.includes(provider);
|
|
223
|
-
socialStorage.setSocialStorageFor(provider, {
|
|
224
|
-
captchaToken,
|
|
225
|
-
codeVerifier: usingPkce ? verifier : undefined,
|
|
226
|
-
state,
|
|
227
|
-
});
|
|
228
|
-
const loginUrlString = getOauthLoginUrl.getOauthLoginUrl((_b = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _b !== void 0 ? _b : [], provider);
|
|
229
|
-
if (!loginUrlString) {
|
|
230
|
-
handleError(provider, types.SocialOAuthErrorCode.NO_OAUTH_URL, `Failed to get login url to connect social account: ${provider}`, { raiseAuthFailure: authMode === 'signin' });
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
const oauthLoginUrl = new URL(loginUrlString);
|
|
234
|
-
oauthLoginUrl.searchParams.set('state', state);
|
|
235
|
-
// only add pkce params for providers that support/require it
|
|
236
|
-
if (usingPkce) {
|
|
237
|
-
const digest = yield digestSHA256.digestSHA256(verifier);
|
|
238
|
-
oauthLoginUrl.searchParams.set('code_challenge', encodeBase64URL.encodeBase64URL(digest));
|
|
239
|
-
oauthLoginUrl.searchParams.set('code_challenge_method', 'S256');
|
|
240
|
-
}
|
|
241
|
-
const isMobile = utils.isMobile();
|
|
242
|
-
try {
|
|
243
|
-
const authCode = yield utils.Oauth2Service.getOauthCode({
|
|
244
|
-
apiProvider: getProviderByType.getProviderByType((_c = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _c !== void 0 ? _c : [], provider),
|
|
245
|
-
getOAuthResultFromApi: () => oauth.getOAuthResult(environmentId, provider, {
|
|
246
|
-
state,
|
|
247
|
-
}),
|
|
248
|
-
initWebAuth: ({ redirectUrl } = {}) => oauth.initAuth(environmentId, provider, {
|
|
249
|
-
redirectUrl: redirectUrl
|
|
250
|
-
? removeDynamicOauthParamsFromUrl(redirectUrl)
|
|
251
|
-
: undefined,
|
|
252
|
-
state,
|
|
253
|
-
}),
|
|
254
|
-
isMobile,
|
|
255
|
-
oauthLoginUrl,
|
|
256
|
-
onSettled,
|
|
257
|
-
provider,
|
|
258
|
-
redirectUrl: redirectUrl !== null && redirectUrl !== void 0 ? redirectUrl : defaultRedirectUrl,
|
|
259
|
-
sessionTimeout,
|
|
260
|
-
setIsProcessing,
|
|
261
|
-
state,
|
|
262
|
-
strategy,
|
|
263
|
-
});
|
|
264
|
-
yield completeConnection({
|
|
265
|
-
authCode,
|
|
266
|
-
authMode,
|
|
267
|
-
captchaToken,
|
|
268
|
-
provider,
|
|
269
|
-
state,
|
|
270
|
-
telegramAuthToken,
|
|
271
|
-
verifier,
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
catch (error) {
|
|
275
|
-
if (!utils.Oauth2Service.isGetOauthCodeError(error)) {
|
|
276
|
-
logger.logger.error('Social connection failed with unexpected error:', error);
|
|
277
|
-
onFailed(provider, { error }, { raiseAuthFailure: authMode === 'signin' });
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
if (error === 'user-cancelled')
|
|
281
|
-
onFailed(provider, 'user-cancelled');
|
|
282
|
-
else {
|
|
283
|
-
handleError(provider, error.code, error.message, {
|
|
284
|
-
raiseAuthFailure: authMode === 'signin',
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
});
|
|
289
|
-
const completeConnection = (_d) => _tslib.__awaiter(void 0, [_d], void 0, function* ({ authMode, provider, state, authCode, captchaToken, verifier, telegramAuthToken, forceCreateUser = false, }) {
|
|
192
|
+
}), [handleError, initAuth, onSettled]);
|
|
193
|
+
const completeConnection = React.useCallback((_a) => _tslib.__awaiter(void 0, [_a], void 0, function* ({ authMode, provider, state, authCode, captchaToken, verifier, telegramAuthToken, forceCreateUser = false, }) {
|
|
290
194
|
try {
|
|
291
195
|
let sessionPublicKey = undefined;
|
|
292
196
|
if (shouldRegisterSessionKeysOnSignin()) {
|
|
@@ -343,8 +247,15 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
|
|
|
343
247
|
logger.logger.error('Social connection failed with unexpected error:', error);
|
|
344
248
|
onFailed(provider, { error }, { raiseAuthFailure: authMode === 'signin' });
|
|
345
249
|
}
|
|
346
|
-
})
|
|
347
|
-
|
|
250
|
+
}), [
|
|
251
|
+
environmentId,
|
|
252
|
+
generateSessionKey,
|
|
253
|
+
linkAccount,
|
|
254
|
+
onFailed,
|
|
255
|
+
shouldRegisterSessionKeysOnSignin,
|
|
256
|
+
signInAccount,
|
|
257
|
+
]);
|
|
258
|
+
const connectWithFarcaster = React.useCallback((authMode_1, _b) => _tslib.__awaiter(void 0, [authMode_1, _b], void 0, function* (authMode, { captchaToken, redirectUrl }) {
|
|
348
259
|
const dynamicNonce = consumeNonce();
|
|
349
260
|
const domain = utils.PlatformService.getHost();
|
|
350
261
|
const data = yield farcaster.connect({
|
|
@@ -416,8 +327,124 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
|
|
|
416
327
|
setShowAuthFlow(false, { clearErrors: false });
|
|
417
328
|
}
|
|
418
329
|
setIsProcessing(false);
|
|
419
|
-
})
|
|
420
|
-
|
|
330
|
+
}), [
|
|
331
|
+
consumeNonce,
|
|
332
|
+
defaultRedirectUrl,
|
|
333
|
+
environmentId,
|
|
334
|
+
generateSessionKey,
|
|
335
|
+
handleError,
|
|
336
|
+
linkAccount,
|
|
337
|
+
onFarcasterUrl,
|
|
338
|
+
setShowAuthFlow,
|
|
339
|
+
shouldRegisterSessionKeysOnSignin,
|
|
340
|
+
signInAccount,
|
|
341
|
+
]);
|
|
342
|
+
const connectSocialAccount = React.useCallback((_c) => _tslib.__awaiter(void 0, [_c], void 0, function* ({ authMode, provider, validator, captchaToken, redirectUrl, telegramAuthToken, }) {
|
|
343
|
+
var _d, _e;
|
|
344
|
+
clearError();
|
|
345
|
+
setIsProcessing(true);
|
|
346
|
+
if (!authMode) {
|
|
347
|
+
logger.logger.error('Auth mode is required. Please use either "link" or "signin"');
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (!checkValidProvider(provider, authMode)) {
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
// invalid connect request
|
|
354
|
+
if (validator && !validator(provider)) {
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
dynamicEvents.dynamicEvents.emit('authInit', {
|
|
358
|
+
option: provider,
|
|
359
|
+
provider,
|
|
360
|
+
type: 'social',
|
|
361
|
+
});
|
|
362
|
+
if (provider === sdkApiCore.ProviderEnum.Farcaster) {
|
|
363
|
+
return connectWithFarcaster(authMode, {
|
|
364
|
+
captchaToken,
|
|
365
|
+
redirectUrl,
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
const state = randomString.randomString(32);
|
|
369
|
+
const verifier = randomString.randomString(43);
|
|
370
|
+
// Whether we will use PKCE (code verifier/challenge) for this provider
|
|
371
|
+
const usingPkce = providersRequiringPkce.includes(provider);
|
|
372
|
+
socialStorage.setSocialStorageFor(provider, {
|
|
373
|
+
captchaToken,
|
|
374
|
+
codeVerifier: usingPkce ? verifier : undefined,
|
|
375
|
+
state,
|
|
376
|
+
});
|
|
377
|
+
const loginUrlString = getOauthLoginUrl.getOauthLoginUrl((_d = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _d !== void 0 ? _d : [], provider);
|
|
378
|
+
if (!loginUrlString) {
|
|
379
|
+
handleError(provider, types.SocialOAuthErrorCode.NO_OAUTH_URL, `Failed to get login url to connect social account: ${provider}`, { raiseAuthFailure: authMode === 'signin' });
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
const oauthLoginUrl = new URL(loginUrlString);
|
|
383
|
+
oauthLoginUrl.searchParams.set('state', state);
|
|
384
|
+
// only add pkce params for providers that support/require it
|
|
385
|
+
if (usingPkce) {
|
|
386
|
+
const digest = yield digestSHA256.digestSHA256(verifier);
|
|
387
|
+
oauthLoginUrl.searchParams.set('code_challenge', encodeBase64URL.encodeBase64URL(digest));
|
|
388
|
+
oauthLoginUrl.searchParams.set('code_challenge_method', 'S256');
|
|
389
|
+
}
|
|
390
|
+
const isMobile = utils.isMobile();
|
|
391
|
+
try {
|
|
392
|
+
const authCode = yield utils.Oauth2Service.getOauthCode({
|
|
393
|
+
apiProvider: getProviderByType.getProviderByType((_e = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _e !== void 0 ? _e : [], provider),
|
|
394
|
+
getOAuthResultFromApi: () => oauth.getOAuthResult(environmentId, provider, {
|
|
395
|
+
state,
|
|
396
|
+
}),
|
|
397
|
+
initWebAuth: ({ redirectUrl } = {}) => oauth.initAuth(environmentId, provider, {
|
|
398
|
+
redirectUrl: redirectUrl
|
|
399
|
+
? removeDynamicOauthParamsFromUrl(redirectUrl)
|
|
400
|
+
: undefined,
|
|
401
|
+
state,
|
|
402
|
+
}),
|
|
403
|
+
isMobile,
|
|
404
|
+
oauthLoginUrl,
|
|
405
|
+
onSettled,
|
|
406
|
+
provider,
|
|
407
|
+
redirectUrl: redirectUrl !== null && redirectUrl !== void 0 ? redirectUrl : defaultRedirectUrl,
|
|
408
|
+
sessionTimeout,
|
|
409
|
+
setIsProcessing,
|
|
410
|
+
state,
|
|
411
|
+
strategy,
|
|
412
|
+
});
|
|
413
|
+
yield completeConnection({
|
|
414
|
+
authCode,
|
|
415
|
+
authMode,
|
|
416
|
+
captchaToken,
|
|
417
|
+
provider,
|
|
418
|
+
state,
|
|
419
|
+
telegramAuthToken,
|
|
420
|
+
verifier,
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
catch (error) {
|
|
424
|
+
if (utils.Oauth2Service.isGetOauthCodeError(error)) {
|
|
425
|
+
handleError(provider, error.code, error.message, {
|
|
426
|
+
raiseAuthFailure: authMode === 'signin',
|
|
427
|
+
});
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
logger.logger.error('Social connection failed with unexpected error:', error);
|
|
431
|
+
onFailed(provider, { error }, { raiseAuthFailure: authMode === 'signin' });
|
|
432
|
+
}
|
|
433
|
+
}), [
|
|
434
|
+
checkValidProvider,
|
|
435
|
+
clearError,
|
|
436
|
+
completeConnection,
|
|
437
|
+
connectWithFarcaster,
|
|
438
|
+
defaultRedirectUrl,
|
|
439
|
+
environmentId,
|
|
440
|
+
handleError,
|
|
441
|
+
onFailed,
|
|
442
|
+
onSettled,
|
|
443
|
+
projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers,
|
|
444
|
+
sessionTimeout,
|
|
445
|
+
strategy,
|
|
446
|
+
]);
|
|
447
|
+
return React.useMemo(() => ({
|
|
421
448
|
checkValidProvider,
|
|
422
449
|
completeConnection,
|
|
423
450
|
connectSocialAccount,
|
|
@@ -426,7 +453,14 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
|
|
|
426
453
|
isProcessing,
|
|
427
454
|
setError,
|
|
428
455
|
setIsProcessing,
|
|
429
|
-
}
|
|
456
|
+
}), [
|
|
457
|
+
checkValidProvider,
|
|
458
|
+
completeConnection,
|
|
459
|
+
connectSocialAccount,
|
|
460
|
+
error,
|
|
461
|
+
handleError,
|
|
462
|
+
isProcessing,
|
|
463
|
+
]);
|
|
430
464
|
};
|
|
431
465
|
const removeDynamicOauthParamsFromUrl = (url) => {
|
|
432
466
|
const urlObject = new URL(url);
|