@dynamic-labs/sdk-react-core 3.0.3 → 3.1.1

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 (48) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/package.cjs +1 -1
  3. package/package.js +1 -1
  4. package/package.json +11 -11
  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/WalletInformationCard/WalletInformationCard.cjs +1 -1
  8. package/src/lib/components/WalletInformationCard/WalletInformationCard.js +1 -1
  9. package/src/lib/context/ViewContext/types/index.d.ts +1 -1
  10. package/src/lib/data/api/transactions/blockaid.cjs +23 -0
  11. package/src/lib/data/api/transactions/blockaid.js +19 -0
  12. package/src/lib/locale/en/translation.cjs +35 -1
  13. package/src/lib/locale/en/translation.d.ts +34 -0
  14. package/src/lib/locale/en/translation.js +35 -1
  15. package/src/lib/shared/assets/caution-triangle.cjs +54 -0
  16. package/src/lib/shared/assets/caution-triangle.js +30 -0
  17. package/src/lib/shared/assets/exclamation-circle.cjs +54 -0
  18. package/src/lib/shared/assets/exclamation-circle.js +30 -0
  19. package/src/lib/shared/assets/exclamation.cjs +52 -0
  20. package/src/lib/shared/assets/exclamation.js +28 -0
  21. package/src/lib/shared/assets/index.d.ts +5 -0
  22. package/src/lib/shared/assets/warning-orange.cjs +54 -0
  23. package/src/lib/shared/assets/warning-orange.js +30 -0
  24. package/src/lib/shared/assets/warning-red.cjs +54 -0
  25. package/src/lib/shared/assets/warning-red.js +30 -0
  26. package/src/lib/styles/index.shadow.cjs +1 -1
  27. package/src/lib/styles/index.shadow.js +1 -1
  28. package/src/lib/utils/hooks/authenticationHooks/helpers/showPendingConnectView.cjs +1 -1
  29. package/src/lib/utils/hooks/authenticationHooks/helpers/showPendingConnectView.js +1 -1
  30. package/src/lib/utils/hooks/useAuthLayoutChecks/useAuthLayoutChecks.cjs +1 -0
  31. package/src/lib/utils/hooks/useAuthLayoutChecks/useAuthLayoutChecks.js +1 -0
  32. package/src/lib/utils/hooks/useResetCookieLocalStorage/useResetCookieLocalStorage.cjs +8 -1
  33. package/src/lib/utils/hooks/useResetCookieLocalStorage/useResetCookieLocalStorage.js +8 -1
  34. package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.cjs +148 -114
  35. package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.js +151 -117
  36. package/src/lib/views/GlobalWalletMaliciousView/GlobalWalletMaliciousView.cjs +139 -0
  37. package/src/lib/views/GlobalWalletMaliciousView/GlobalWalletMaliciousView.d.ts +11 -0
  38. package/src/lib/views/GlobalWalletMaliciousView/GlobalWalletMaliciousView.js +134 -0
  39. package/src/lib/views/MfaChooseDeviceView/MfaChooseDeviceView.cjs +1 -1
  40. package/src/lib/views/MfaChooseDeviceView/MfaChooseDeviceView.js +1 -1
  41. package/src/lib/views/viewToComponentMap.cjs +2 -0
  42. package/src/lib/views/viewToComponentMap.d.ts +1 -0
  43. package/src/lib/views/viewToComponentMap.js +2 -0
  44. package/src/lib/widgets/DynamicBridgeWidget/DynamicBridgeWidget.cjs +3 -3
  45. package/src/lib/widgets/DynamicBridgeWidget/DynamicBridgeWidget.d.ts +1 -0
  46. package/src/lib/widgets/DynamicBridgeWidget/DynamicBridgeWidget.js +3 -3
  47. package/src/lib/widgets/DynamicWidget/views/GlobalWalletView/GlobalWalletView.cjs +31 -8
  48. package/src/lib/widgets/DynamicWidget/views/GlobalWalletView/GlobalWalletView.js +31 -8
@@ -6,7 +6,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
6
6
  var _tslib = require('../../../../../../_virtual/_tslib.cjs');
7
7
  var getWalletProvider = require('../../../functions/getWalletProvider/getWalletProvider.cjs');
8
8
 
9
- const specialCareWallets = ['bloctoevm', 'perawallet'];
9
+ const specialCareWallets = ['bloctoevm', 'perawallet', 'metamaskstarknet'];
10
10
  const showPendingConnectView = (walletConnector, setView) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
11
11
  const walletProvider = getWalletProvider.getWalletProvider(walletConnector);
12
12
  // We don't want to show the pending connect view for qrCode and walletConnect
@@ -2,7 +2,7 @@
2
2
  import { __awaiter } from '../../../../../../_virtual/_tslib.js';
3
3
  import { getWalletProvider } from '../../../functions/getWalletProvider/getWalletProvider.js';
4
4
 
5
- const specialCareWallets = ['bloctoevm', 'perawallet'];
5
+ const specialCareWallets = ['bloctoevm', 'perawallet', 'metamaskstarknet'];
6
6
  const showPendingConnectView = (walletConnector, setView) => __awaiter(void 0, void 0, void 0, function* () {
7
7
  const walletProvider = getWalletProvider(walletConnector);
8
8
  // We don't want to show the pending connect view for qrCode and walletConnect
@@ -145,6 +145,7 @@ const useAuthLayoutChecks = () => {
145
145
  view.type !== 'wallet-claim-intro' &&
146
146
  view.type !== 'passkey-recovery-add-email' &&
147
147
  view.type !== 'global-wallet-confirm' &&
148
+ view.type !== 'global-wallet-malicious' &&
148
149
  view.type !== 'global-wallet-info' &&
149
150
  view.type !== 'mfa-choose-device' &&
150
151
  view.type !== 'mfa-verification';
@@ -141,6 +141,7 @@ const useAuthLayoutChecks = () => {
141
141
  view.type !== 'wallet-claim-intro' &&
142
142
  view.type !== 'passkey-recovery-add-email' &&
143
143
  view.type !== 'global-wallet-confirm' &&
144
+ view.type !== 'global-wallet-malicious' &&
144
145
  view.type !== 'global-wallet-info' &&
145
146
  view.type !== 'mfa-choose-device' &&
146
147
  view.type !== 'mfa-verification';
@@ -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 {
@@ -131,11 +131,11 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
131
131
  const { generateSessionKey, shouldRegisterSessionKeysOnSignin } = useEmbeddedWalletSessionKeys.useEmbeddedWalletSessionKeys(environmentId);
132
132
  const [isProcessing, setIsProcessing] = React.useState(false);
133
133
  const [error, setError] = React.useState();
134
- const clearError = () => {
134
+ const clearError = React.useCallback(() => {
135
135
  setError(undefined);
136
136
  setContextError(undefined);
137
- };
138
- const onFailed = (provider, reason, options) => {
137
+ }, [setContextError]);
138
+ const onFailed = React.useCallback((provider, reason, options) => {
139
139
  setIsProcessing(false);
140
140
  onError === null || onError === void 0 ? void 0 : onError();
141
141
  onSettled === null || onSettled === void 0 ? void 0 : onSettled();
@@ -145,15 +145,15 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
145
145
  provider,
146
146
  type: 'social',
147
147
  }, reason);
148
- };
149
- const handleError = (provider, code, message, options) => {
148
+ }, [onError, onSettled]);
149
+ const handleError = React.useCallback((provider, code, message, options) => {
150
150
  const error = { code, message };
151
151
  logger.logger.error(message);
152
152
  setError(error);
153
153
  setErrorMessage(code);
154
154
  onFailed(provider, { error }, options);
155
- };
156
- const checkValidProvider = (provider, authMode) => {
155
+ }, [onFailed, setErrorMessage]);
156
+ const checkValidProvider = React.useCallback((provider, authMode) => {
157
157
  if (!provider) {
158
158
  handleError(provider, types.SocialOAuthErrorCode.NO_PROVIDER, 'Provider is required', { raiseAuthFailure: authMode === 'signin' });
159
159
  return false;
@@ -163,8 +163,8 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
163
163
  return false;
164
164
  }
165
165
  return true;
166
- };
167
- const linkAccount = (provider, apiCall) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
166
+ }, [handleError]);
167
+ const linkAccount = React.useCallback((provider, apiCall) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
168
168
  try {
169
169
  const response = yield apiCall();
170
170
  if (!response) {
@@ -178,112 +178,16 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
178
178
  handleError(provider, types.SocialOAuthErrorCode.ACCOUNT_ALREADY_LINKED_TO_DIFFERENT_PROFILE, `Social account already linked to a different profile: ${provider}`, { raiseAuthFailure: false });
179
179
  }
180
180
  }
181
- });
182
- const signInAccount = (provider, apiCall) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
181
+ }), [handleError, onSettled]);
182
+ const signInAccount = React.useCallback((provider, apiCall) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
183
183
  yield initAuth({
184
184
  onError: () => handleError(provider, types.SocialOAuthErrorCode.SIGNIN_ERROR, `Failed to sign-in with social account: ${provider}`, { raiseAuthFailure: true }),
185
185
  onSettled,
186
186
  options: { provider },
187
187
  verifyFunction: () => apiCall(),
188
188
  });
189
- });
190
- const connectSocialAccount = (_a) => _tslib.__awaiter(void 0, [_a], void 0, function* ({ authMode, provider, validator, captchaToken, redirectUrl, telegramAuthToken, }) {
191
- var _b, _c;
192
- clearError();
193
- setIsProcessing(true);
194
- if (!authMode) {
195
- logger.logger.error('Auth mode is required. Please use either "link" or "signin"');
196
- return;
197
- }
198
- if (!checkValidProvider(provider, authMode)) {
199
- return;
200
- }
201
- // invalid connect request
202
- if (validator && !validator(provider)) {
203
- return;
204
- }
205
- dynamicEvents.dynamicEvents.emit('authInit', {
206
- option: provider,
207
- provider,
208
- type: 'social',
209
- });
210
- if (provider === sdkApiCore.ProviderEnum.Farcaster) {
211
- return connectWithFarcaster(authMode, {
212
- captchaToken,
213
- redirectUrl,
214
- });
215
- }
216
- const state = randomString.randomString(32);
217
- const verifier = randomString.randomString(43);
218
- // Whether we will use PKCE (code verifier/challenge) for this provider
219
- const usingPkce = providersRequiringPkce.includes(provider);
220
- socialStorage.setSocialStorageFor(provider, {
221
- captchaToken,
222
- codeVerifier: usingPkce ? verifier : undefined,
223
- state,
224
- });
225
- const loginUrlString = getOauthLoginUrl.getOauthLoginUrl((_b = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _b !== void 0 ? _b : [], provider);
226
- if (!loginUrlString) {
227
- handleError(provider, types.SocialOAuthErrorCode.NO_OAUTH_URL, `Failed to get login url to connect social account: ${provider}`, { raiseAuthFailure: authMode === 'signin' });
228
- return;
229
- }
230
- const oauthLoginUrl = new URL(loginUrlString);
231
- oauthLoginUrl.searchParams.set('state', state);
232
- // only add pkce params for providers that support/require it
233
- if (usingPkce) {
234
- const digest = yield digestSHA256.digestSHA256(verifier);
235
- oauthLoginUrl.searchParams.set('code_challenge', encodeBase64URL.encodeBase64URL(digest));
236
- oauthLoginUrl.searchParams.set('code_challenge_method', 'S256');
237
- }
238
- const isMobile = utils.isMobile();
239
- try {
240
- const authCode = yield utils.Oauth2Service.getOauthCode({
241
- apiProvider: getProviderByType.getProviderByType((_c = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _c !== void 0 ? _c : [], provider),
242
- getOAuthResultFromApi: () => oauth.getOAuthResult(environmentId, provider, {
243
- state,
244
- }),
245
- initWebAuth: ({ redirectUrl } = {}) => oauth.initAuth(environmentId, provider, {
246
- redirectUrl: redirectUrl
247
- ? removeDynamicOauthParamsFromUrl(redirectUrl)
248
- : undefined,
249
- state,
250
- }),
251
- isMobile,
252
- oauthLoginUrl,
253
- onSettled,
254
- provider,
255
- redirectUrl: redirectUrl !== null && redirectUrl !== void 0 ? redirectUrl : defaultRedirectUrl,
256
- sessionTimeout,
257
- setIsProcessing,
258
- state,
259
- strategy,
260
- });
261
- yield completeConnection({
262
- authCode,
263
- authMode,
264
- captchaToken,
265
- provider,
266
- state,
267
- telegramAuthToken,
268
- verifier,
269
- });
270
- }
271
- catch (error) {
272
- if (!utils.Oauth2Service.isGetOauthCodeError(error)) {
273
- logger.logger.error('Social connection failed with unexpected error:', error);
274
- onFailed(provider, { error }, { raiseAuthFailure: authMode === 'signin' });
275
- return;
276
- }
277
- if (error === 'user-cancelled')
278
- onFailed(provider, 'user-cancelled');
279
- else {
280
- handleError(provider, error.code, error.message, {
281
- raiseAuthFailure: authMode === 'signin',
282
- });
283
- }
284
- }
285
- });
286
- const completeConnection = (_d) => _tslib.__awaiter(void 0, [_d], void 0, function* ({ authMode, provider, state, authCode, captchaToken, verifier, telegramAuthToken, }) {
189
+ }), [handleError, initAuth, onSettled]);
190
+ const completeConnection = React.useCallback((_a) => _tslib.__awaiter(void 0, [_a], void 0, function* ({ authMode, provider, state, authCode, captchaToken, verifier, telegramAuthToken, }) {
287
191
  try {
288
192
  let sessionPublicKey = undefined;
289
193
  if (shouldRegisterSessionKeysOnSignin()) {
@@ -339,8 +243,15 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
339
243
  logger.logger.error('Social connection failed with unexpected error:', error);
340
244
  onFailed(provider, { error }, { raiseAuthFailure: authMode === 'signin' });
341
245
  }
342
- });
343
- const connectWithFarcaster = (authMode_1, _e) => _tslib.__awaiter(void 0, [authMode_1, _e], void 0, function* (authMode, { captchaToken, redirectUrl }) {
246
+ }), [
247
+ environmentId,
248
+ generateSessionKey,
249
+ linkAccount,
250
+ onFailed,
251
+ shouldRegisterSessionKeysOnSignin,
252
+ signInAccount,
253
+ ]);
254
+ const connectWithFarcaster = React.useCallback((authMode_1, _b) => _tslib.__awaiter(void 0, [authMode_1, _b], void 0, function* (authMode, { captchaToken, redirectUrl }) {
344
255
  const dynamicNonce = consumeNonce();
345
256
  const domain = utils.PlatformService.getHost();
346
257
  const data = yield farcaster.connect({
@@ -412,8 +323,124 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
412
323
  setShowAuthFlow(false, { clearErrors: false });
413
324
  }
414
325
  setIsProcessing(false);
415
- });
416
- return {
326
+ }), [
327
+ consumeNonce,
328
+ defaultRedirectUrl,
329
+ environmentId,
330
+ generateSessionKey,
331
+ handleError,
332
+ linkAccount,
333
+ onFarcasterUrl,
334
+ setShowAuthFlow,
335
+ shouldRegisterSessionKeysOnSignin,
336
+ signInAccount,
337
+ ]);
338
+ const connectSocialAccount = React.useCallback((_c) => _tslib.__awaiter(void 0, [_c], void 0, function* ({ authMode, provider, validator, captchaToken, redirectUrl, telegramAuthToken, }) {
339
+ var _d, _e;
340
+ clearError();
341
+ setIsProcessing(true);
342
+ if (!authMode) {
343
+ logger.logger.error('Auth mode is required. Please use either "link" or "signin"');
344
+ return;
345
+ }
346
+ if (!checkValidProvider(provider, authMode)) {
347
+ return;
348
+ }
349
+ // invalid connect request
350
+ if (validator && !validator(provider)) {
351
+ return;
352
+ }
353
+ dynamicEvents.dynamicEvents.emit('authInit', {
354
+ option: provider,
355
+ provider,
356
+ type: 'social',
357
+ });
358
+ if (provider === sdkApiCore.ProviderEnum.Farcaster) {
359
+ return connectWithFarcaster(authMode, {
360
+ captchaToken,
361
+ redirectUrl,
362
+ });
363
+ }
364
+ const state = randomString.randomString(32);
365
+ const verifier = randomString.randomString(43);
366
+ // Whether we will use PKCE (code verifier/challenge) for this provider
367
+ const usingPkce = providersRequiringPkce.includes(provider);
368
+ socialStorage.setSocialStorageFor(provider, {
369
+ captchaToken,
370
+ codeVerifier: usingPkce ? verifier : undefined,
371
+ state,
372
+ });
373
+ const loginUrlString = getOauthLoginUrl.getOauthLoginUrl((_d = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _d !== void 0 ? _d : [], provider);
374
+ if (!loginUrlString) {
375
+ handleError(provider, types.SocialOAuthErrorCode.NO_OAUTH_URL, `Failed to get login url to connect social account: ${provider}`, { raiseAuthFailure: authMode === 'signin' });
376
+ return;
377
+ }
378
+ const oauthLoginUrl = new URL(loginUrlString);
379
+ oauthLoginUrl.searchParams.set('state', state);
380
+ // only add pkce params for providers that support/require it
381
+ if (usingPkce) {
382
+ const digest = yield digestSHA256.digestSHA256(verifier);
383
+ oauthLoginUrl.searchParams.set('code_challenge', encodeBase64URL.encodeBase64URL(digest));
384
+ oauthLoginUrl.searchParams.set('code_challenge_method', 'S256');
385
+ }
386
+ const isMobile = utils.isMobile();
387
+ try {
388
+ const authCode = yield utils.Oauth2Service.getOauthCode({
389
+ apiProvider: getProviderByType.getProviderByType((_e = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers) !== null && _e !== void 0 ? _e : [], provider),
390
+ getOAuthResultFromApi: () => oauth.getOAuthResult(environmentId, provider, {
391
+ state,
392
+ }),
393
+ initWebAuth: ({ redirectUrl } = {}) => oauth.initAuth(environmentId, provider, {
394
+ redirectUrl: redirectUrl
395
+ ? removeDynamicOauthParamsFromUrl(redirectUrl)
396
+ : undefined,
397
+ state,
398
+ }),
399
+ isMobile,
400
+ oauthLoginUrl,
401
+ onSettled,
402
+ provider,
403
+ redirectUrl: redirectUrl !== null && redirectUrl !== void 0 ? redirectUrl : defaultRedirectUrl,
404
+ sessionTimeout,
405
+ setIsProcessing,
406
+ state,
407
+ strategy,
408
+ });
409
+ yield completeConnection({
410
+ authCode,
411
+ authMode,
412
+ captchaToken,
413
+ provider,
414
+ state,
415
+ telegramAuthToken,
416
+ verifier,
417
+ });
418
+ }
419
+ catch (error) {
420
+ if (utils.Oauth2Service.isGetOauthCodeError(error)) {
421
+ handleError(provider, error.code, error.message, {
422
+ raiseAuthFailure: authMode === 'signin',
423
+ });
424
+ return;
425
+ }
426
+ logger.logger.error('Social connection failed with unexpected error:', error);
427
+ onFailed(provider, { error }, { raiseAuthFailure: authMode === 'signin' });
428
+ }
429
+ }), [
430
+ checkValidProvider,
431
+ clearError,
432
+ completeConnection,
433
+ connectWithFarcaster,
434
+ defaultRedirectUrl,
435
+ environmentId,
436
+ handleError,
437
+ onFailed,
438
+ onSettled,
439
+ projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers,
440
+ sessionTimeout,
441
+ strategy,
442
+ ]);
443
+ return React.useMemo(() => ({
417
444
  checkValidProvider,
418
445
  completeConnection,
419
446
  connectSocialAccount,
@@ -422,7 +449,14 @@ const useSocialAuth = ({ sessionTimeout, onSettled, onError, onFarcasterUrl, })
422
449
  isProcessing,
423
450
  setError,
424
451
  setIsProcessing,
425
- };
452
+ }), [
453
+ checkValidProvider,
454
+ completeConnection,
455
+ connectSocialAccount,
456
+ error,
457
+ handleError,
458
+ isProcessing,
459
+ ]);
426
460
  };
427
461
  const removeDynamicOauthParamsFromUrl = (url) => {
428
462
  const urlObject = new URL(url);