@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.
Files changed (41) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/package.cjs +2 -2
  3. package/package.js +2 -2
  4. package/package.json +12 -12
  5. package/src/lib/components/QRCode/QRCode.cjs +2 -2
  6. package/src/lib/components/QRCode/QRCode.js +2 -2
  7. package/src/lib/components/SendBalanceForm/SendBalanceForm.cjs +5 -1
  8. package/src/lib/components/SendBalanceForm/SendBalanceForm.js +5 -1
  9. package/src/lib/components/TransactionConfirmationPageLayout/utils.cjs +5 -6
  10. package/src/lib/components/TransactionConfirmationPageLayout/utils.js +5 -6
  11. package/src/lib/context/DynamicContext/DynamicContext.cjs +14 -16
  12. package/src/lib/context/DynamicContext/DynamicContext.js +14 -16
  13. package/src/lib/data/api/oauth/oauth.cjs +14 -0
  14. package/src/lib/data/api/oauth/oauth.d.ts +1 -0
  15. package/src/lib/data/api/oauth/oauth.js +14 -1
  16. package/src/lib/store/internalImplementation/utils/clearExpiredData/clearExpiredData.cjs +1 -6
  17. package/src/lib/store/internalImplementation/utils/clearExpiredData/clearExpiredData.js +1 -6
  18. package/src/lib/store/stateConfig.cjs +0 -5
  19. package/src/lib/store/stateConfig.js +0 -5
  20. package/src/lib/store/types.d.ts +1 -6
  21. package/src/lib/styles/index.shadow.cjs +1 -1
  22. package/src/lib/styles/index.shadow.js +1 -1
  23. package/src/lib/utils/hooks/useNetworkConfigurationsFromProjectSettings/index.d.ts +1 -0
  24. package/src/lib/utils/hooks/useNetworkConfigurationsFromProjectSettings/useNetworkConfigurationsFromProjectSettings.cjs +63 -0
  25. package/src/lib/utils/hooks/useNetworkConfigurationsFromProjectSettings/useNetworkConfigurationsFromProjectSettings.d.ts +9 -0
  26. package/src/lib/utils/hooks/useNetworkConfigurationsFromProjectSettings/useNetworkConfigurationsFromProjectSettings.js +59 -0
  27. package/src/lib/utils/hooks/useResetCookieLocalStorage/useResetCookieLocalStorage.cjs +8 -1
  28. package/src/lib/utils/hooks/useResetCookieLocalStorage/useResetCookieLocalStorage.js +8 -1
  29. package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.cjs +148 -114
  30. package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.js +151 -117
  31. package/src/lib/utils/hooks/useTelegramLogin/useTelegramLogin.cjs +20 -7
  32. package/src/lib/utils/hooks/useTelegramLogin/useTelegramLogin.d.ts +1 -0
  33. package/src/lib/utils/hooks/useTelegramLogin/useTelegramLogin.js +20 -7
  34. package/src/lib/views/MfaChooseDeviceView/MfaChooseDeviceView.cjs +1 -1
  35. package/src/lib/views/MfaChooseDeviceView/MfaChooseDeviceView.js +1 -1
  36. package/src/lib/views/WalletList/data.cjs +6 -1
  37. package/src/lib/views/WalletList/data.js +6 -1
  38. package/src/lib/store/state/networkConfigurations/index.d.ts +0 -1
  39. package/src/lib/store/state/networkConfigurations/networkConfigurations.cjs +0 -169
  40. package/src/lib/store/state/networkConfigurations/networkConfigurations.d.ts +0 -10
  41. 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 connectSocialAccount = (_a) => _tslib.__awaiter(void 0, [_a], void 0, function* ({ authMode, provider, validator, captchaToken, redirectUrl, telegramAuthToken, }) {
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
- const connectWithFarcaster = (authMode_1, _e) => _tslib.__awaiter(void 0, [authMode_1, _e], void 0, function* (authMode, { captchaToken, redirectUrl }) {
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
- return {
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);