@dynamic-labs/sdk-react-core 1.0.5 → 1.0.7

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 (99) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/package.cjs +3 -3
  3. package/package.js +3 -3
  4. package/package.json +12 -12
  5. package/src/index.cjs +11 -9
  6. package/src/index.js +6 -5
  7. package/src/lib/Main.cjs +25 -10
  8. package/src/lib/Main.js +25 -10
  9. package/src/lib/components/IconWithSpinner/IconWithSpinner.cjs +1 -1
  10. package/src/lib/components/IconWithSpinner/IconWithSpinner.js +1 -1
  11. package/src/lib/components/IconWithSpinner/Spinner/Spinner.cjs +1 -1
  12. package/src/lib/components/IconWithSpinner/Spinner/Spinner.js +1 -1
  13. package/src/lib/components/IconWithStatus/IconWithStatus.cjs +1 -1
  14. package/src/lib/components/IconWithStatus/IconWithStatus.js +1 -1
  15. package/src/lib/components/MenuList/Dropdown/Dropdown.cjs +1 -1
  16. package/src/lib/components/MenuList/Dropdown/Dropdown.js +1 -1
  17. package/src/lib/components/NetworkPicker/components/EvmNetworkControl/EvmNetworkControl.cjs +4 -1
  18. package/src/lib/components/NetworkPicker/components/EvmNetworkControl/EvmNetworkControl.js +4 -1
  19. package/src/lib/components/SendBalanceForm/SendBalanceForm.cjs +1 -1
  20. package/src/lib/components/SendBalanceForm/SendBalanceForm.js +1 -1
  21. package/src/lib/components/SyncPasskeyFlow/SyncPasskeyFlow.cjs +2 -2
  22. package/src/lib/components/SyncPasskeyFlow/SyncPasskeyFlow.js +2 -2
  23. package/src/lib/components/UserProfileForm/UserProfileForm.cjs +1 -1
  24. package/src/lib/components/UserProfileForm/UserProfileForm.js +1 -1
  25. package/src/lib/context/DynamicContext/DynamicContext.cjs +4 -2
  26. package/src/lib/context/DynamicContext/DynamicContext.js +4 -2
  27. package/src/lib/context/DynamicContext/hooks/useEmailLoginState/useEmailLoginState.cjs +1 -1
  28. package/src/lib/context/DynamicContext/hooks/useEmailLoginState/useEmailLoginState.js +1 -1
  29. package/src/lib/data/api.cjs +2 -2
  30. package/src/lib/data/api.d.ts +1 -0
  31. package/src/lib/data/api.js +2 -2
  32. package/src/lib/shared/utils/hooks/index.d.ts +5 -4
  33. package/src/lib/shared/utils/hooks/useThrottle/index.d.ts +1 -0
  34. package/src/lib/shared/utils/hooks/useThrottle/useThrottle.cjs +29 -0
  35. package/src/lib/shared/utils/hooks/useThrottle/useThrottle.d.ts +8 -0
  36. package/src/lib/shared/utils/hooks/useThrottle/useThrottle.js +25 -0
  37. package/src/lib/utils/functions/getWalletIdentifier/getWalletIdentifier.cjs +7 -0
  38. package/src/lib/utils/functions/getWalletIdentifier/getWalletIdentifier.d.ts +2 -0
  39. package/src/lib/utils/functions/getWalletIdentifier/getWalletIdentifier.js +3 -0
  40. package/src/lib/utils/functions/getWalletIdentifier/index.d.ts +1 -0
  41. package/src/lib/utils/functions/index.d.ts +5 -3
  42. package/src/lib/utils/hooks/multiWallet/useSyncPrimaryWallet/useSyncPrimaryWallet.cjs +13 -2
  43. package/src/lib/utils/hooks/multiWallet/useSyncPrimaryWallet/useSyncPrimaryWallet.js +13 -2
  44. package/src/lib/utils/hooks/useColorSchemePreference/useColorSchemePreference.cjs +1 -1
  45. package/src/lib/utils/hooks/useColorSchemePreference/useColorSchemePreference.js +1 -1
  46. package/src/lib/utils/hooks/useConnectedWalletsNetworkValidation/useConnectedWalletsNetworkValidation.cjs +1 -1
  47. package/src/lib/utils/hooks/useConnectedWalletsNetworkValidation/useConnectedWalletsNetworkValidation.js +1 -1
  48. package/src/lib/utils/hooks/useEmailProvider/useEmailProvider.cjs +1 -1
  49. package/src/lib/utils/hooks/useEmailProvider/useEmailProvider.js +1 -1
  50. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.cjs +14 -6
  51. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.js +14 -6
  52. package/src/lib/utils/hooks/useFetchProjectSettings/useFetchProjectSettings.cjs +15 -1
  53. package/src/lib/utils/hooks/useFetchProjectSettings/useFetchProjectSettings.js +16 -2
  54. package/src/lib/utils/hooks/useHandleUnlinkWallet/useHandleUnlinkWallet.cjs +7 -1
  55. package/src/lib/utils/hooks/useHandleUnlinkWallet/useHandleUnlinkWallet.d.ts +4 -2
  56. package/src/lib/utils/hooks/useHandleUnlinkWallet/useHandleUnlinkWallet.js +7 -1
  57. package/src/lib/utils/hooks/useKYCFlag/useKYCFlag.cjs +1 -1
  58. package/src/lib/utils/hooks/useKYCFlag/useKYCFlag.js +1 -1
  59. package/src/lib/utils/hooks/usePasskeyRecovery/usePasskeyRecovery.cjs +1 -1
  60. package/src/lib/utils/hooks/usePasskeyRecovery/usePasskeyRecovery.js +1 -1
  61. package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.cjs +1 -1
  62. package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.js +1 -1
  63. package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.cjs +1 -1
  64. package/src/lib/utils/hooks/useSocialAuth/useSocialAuth.js +1 -1
  65. package/src/lib/utils/hooks/useVerifyWallet/useVerifyWallet.cjs +2 -1
  66. package/src/lib/utils/hooks/useVerifyWallet/useVerifyWallet.js +2 -1
  67. package/src/lib/utils/hooks/useWalletConnectorOptions/utils/verifyMagicIsSetup/verifyMagicIsSetup.cjs +1 -1
  68. package/src/lib/utils/hooks/useWalletConnectorOptions/utils/verifyMagicIsSetup/verifyMagicIsSetup.js +1 -1
  69. package/src/lib/utils/hooks/useWalletConnectorOptions/utils/verifyZeroDevIsSetup/verifyZeroDevIsSetup.cjs +1 -1
  70. package/src/lib/utils/hooks/useWalletConnectorOptions/utils/verifyZeroDevIsSetup/verifyZeroDevIsSetup.js +1 -1
  71. package/src/lib/utils/hooks/useWalletConnectors/useWalletConnectors.cjs +8 -4
  72. package/src/lib/utils/hooks/useWalletConnectors/useWalletConnectors.js +8 -4
  73. package/src/lib/utils/hooks/useWalletEventListeners/useWalletEventListeners.cjs +4 -3
  74. package/src/lib/utils/hooks/useWalletEventListeners/useWalletEventListeners.js +4 -3
  75. package/src/lib/utils/hooks/useWalletItemActions/useWalletItemActions.cjs +1 -1
  76. package/src/lib/utils/hooks/useWalletItemActions/useWalletItemActions.js +1 -1
  77. package/src/lib/utils/hooks/useWalletsConnectionState/useWalletsConnectionState.cjs +67 -43
  78. package/src/lib/utils/hooks/useWalletsConnectionState/useWalletsConnectionState.d.ts +5 -7
  79. package/src/lib/utils/hooks/useWalletsConnectionState/useWalletsConnectionState.js +68 -44
  80. package/src/lib/views/LoginView/sections/SocialSignInSection/SocialSignInSection.cjs +1 -1
  81. package/src/lib/views/LoginView/sections/SocialSignInSection/SocialSignInSection.js +1 -1
  82. package/src/lib/views/LoginView/useLoginView.cjs +1 -1
  83. package/src/lib/views/LoginView/useLoginView.js +1 -1
  84. package/src/lib/views/Passkey/PasskeyIntroView/PasskeyIntroView.cjs +1 -1
  85. package/src/lib/views/Passkey/PasskeyIntroView/PasskeyIntroView.js +1 -1
  86. package/src/lib/views/Passkey/PasskeyRecovery/BundleValidation/PasskeyBundleRecovery.cjs +1 -1
  87. package/src/lib/views/Passkey/PasskeyRecovery/BundleValidation/PasskeyBundleRecovery.js +1 -1
  88. package/src/lib/views/Passkey/PasskeyRecovery/CompleteRecovery/PasskeyCompleteRecovery.cjs +2 -2
  89. package/src/lib/views/Passkey/PasskeyRecovery/CompleteRecovery/PasskeyCompleteRecovery.js +2 -2
  90. package/src/lib/views/Passkey/PasskeyRecovery/InitRecovery/PasskeyInitRecovery.cjs +1 -1
  91. package/src/lib/views/Passkey/PasskeyRecovery/InitRecovery/PasskeyInitRecovery.js +1 -1
  92. package/src/lib/views/QrCodeView/QrCodeView.cjs +1 -1
  93. package/src/lib/views/QrCodeView/QrCodeView.js +1 -1
  94. package/src/lib/widgets/DynamicWidget/components/ActiveWalletInformation/ActiveWalletInformation.cjs +2 -2
  95. package/src/lib/widgets/DynamicWidget/components/ActiveWalletInformation/ActiveWalletInformation.js +2 -2
  96. package/src/lib/widgets/DynamicWidget/components/WalletIconWithStatus/WalletIconWithStatus.cjs +1 -1
  97. package/src/lib/widgets/DynamicWidget/components/WalletIconWithStatus/WalletIconWithStatus.js +1 -1
  98. package/src/lib/widgets/DynamicWidget/prompts/UnlinkWalletPopUp/UnlinkWalletPopUp.cjs +1 -6
  99. package/src/lib/widgets/DynamicWidget/prompts/UnlinkWalletPopUp/UnlinkWalletPopUp.js +1 -6
@@ -1,12 +1,14 @@
1
1
  import { Dispatch, SetStateAction } from 'react';
2
2
  import { JwtVerifiedCredential } from '@dynamic-labs/sdk-api';
3
- import { UserProfile, Wallet } from '../../../shared';
3
+ import { DynamicEventsCallbacks, UserProfile, Wallet } from '../../../shared';
4
4
  type UseHandleUnlinkProps = {
5
5
  environmentId: string;
6
6
  primaryWalletId: string | undefined;
7
7
  secondaryWallets: Wallet[];
8
8
  setUser: Dispatch<SetStateAction<UserProfile | undefined>>;
9
9
  verifiedCredentials: JwtVerifiedCredential[];
10
+ eventsCallbacks: DynamicEventsCallbacks | undefined;
11
+ user: UserProfile | undefined;
10
12
  };
11
- export declare const useHandleUnlinkWallet: ({ verifiedCredentials, environmentId, primaryWalletId, secondaryWallets, setUser, }: UseHandleUnlinkProps) => (walletId: string) => Promise<void>;
13
+ export declare const useHandleUnlinkWallet: ({ verifiedCredentials, environmentId, primaryWalletId, secondaryWallets, setUser, user, eventsCallbacks, }: UseHandleUnlinkProps) => (walletId: string) => Promise<void>;
12
14
  export {};
@@ -16,7 +16,7 @@ import '../../../shared/consts/index.js';
16
16
  import { handleUnlinkHelper } from '../../functions/handleUnlinkHelper/handleUnlinkHelper.js';
17
17
  import { isSameWalletName } from '../../functions/isSameWalletName/isSameWalletName.js';
18
18
 
19
- const useHandleUnlinkWallet = ({ verifiedCredentials, environmentId, primaryWalletId, secondaryWallets, setUser, }) => {
19
+ const useHandleUnlinkWallet = ({ verifiedCredentials, environmentId, primaryWalletId, secondaryWallets, setUser, user, eventsCallbacks, }) => {
20
20
  const callback = useCallback((walletId) => __awaiter(void 0, void 0, void 0, function* () {
21
21
  var _a;
22
22
  // when we call handleUnlinkWallet on the same execution stack as setPrimaryWallet, the value of
@@ -31,6 +31,7 @@ const useHandleUnlinkWallet = ({ verifiedCredentials, environmentId, primaryWall
31
31
  const currentPrimaryWalletId = (_a = LocalStorage.getFromLS(PRIMARY_WALLET_ID)) !== null && _a !== void 0 ? _a : primaryWalletId;
32
32
  if (walletId === currentPrimaryWalletId)
33
33
  return;
34
+ const vcWalletFromId = user === null || user === void 0 ? void 0 : user.verifiedCredentials.find((wallet) => wallet.id === walletId);
34
35
  const newUser = yield handleUnlinkHelper({
35
36
  environmentId,
36
37
  primaryWalletId: currentPrimaryWalletId,
@@ -46,12 +47,17 @@ const useHandleUnlinkWallet = ({ verifiedCredentials, environmentId, primaryWall
46
47
  if (numberOfLinkedWallets === 1) {
47
48
  yield (wallet === null || wallet === void 0 ? void 0 : wallet.connector.endSession());
48
49
  }
50
+ if (vcWalletFromId && (eventsCallbacks === null || eventsCallbacks === void 0 ? void 0 : eventsCallbacks.onUnlinkSuccess)) {
51
+ eventsCallbacks.onUnlinkSuccess(vcWalletFromId);
52
+ }
49
53
  }), [
50
54
  primaryWalletId,
51
55
  environmentId,
52
56
  secondaryWallets,
53
57
  setUser,
54
58
  verifiedCredentials,
59
+ eventsCallbacks,
60
+ user,
55
61
  ]);
56
62
  return callback;
57
63
  };
@@ -5,10 +5,10 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var useInternalDynamicContext = require('../../../context/DynamicContext/useInternalDynamicContext.cjs');
6
6
  var useOnlyConnectedMode = require('../useOnlyConnectedMode/useOnlyConnectedMode.cjs');
7
7
  var getUserProfileFields = require('../../functions/getUserProfileFields/getUserProfileFields.cjs');
8
+ require('@dynamic-labs/wallet-connector-core');
8
9
  require('@dynamic-labs/sdk-api');
9
10
  require('../../../shared/logger.cjs');
10
11
  require('@dynamic-labs/iconic');
11
- require('@dynamic-labs/wallet-connector-core');
12
12
  require('react/jsx-runtime');
13
13
  require('../../../context/ViewContext/ViewContext.cjs');
14
14
  require('react');
@@ -1,10 +1,10 @@
1
1
  import { useInternalDynamicContext } from '../../../context/DynamicContext/useInternalDynamicContext.js';
2
2
  import { useOnlyConnectedMode } from '../useOnlyConnectedMode/useOnlyConnectedMode.js';
3
3
  import { getUserProfileFields } from '../../functions/getUserProfileFields/getUserProfileFields.js';
4
+ import '@dynamic-labs/wallet-connector-core';
4
5
  import '@dynamic-labs/sdk-api';
5
6
  import '../../../shared/logger.js';
6
7
  import '@dynamic-labs/iconic';
7
- import '@dynamic-labs/wallet-connector-core';
8
8
  import 'react/jsx-runtime';
9
9
  import '../../../context/ViewContext/ViewContext.js';
10
10
  import 'react';
@@ -7,10 +7,10 @@ var React = require('react');
7
7
  var useInternalDynamicContext = require('../../../context/DynamicContext/useInternalDynamicContext.cjs');
8
8
  var ViewContext = require('../../../context/ViewContext/ViewContext.cjs');
9
9
  var constants = require('../../../views/Passkey/PasskeyRecovery/constants.cjs');
10
+ require('@dynamic-labs/wallet-connector-core');
10
11
  require('@dynamic-labs/sdk-api');
11
12
  require('../../../shared/logger.cjs');
12
13
  require('@dynamic-labs/iconic');
13
- require('@dynamic-labs/wallet-connector-core');
14
14
  require('react/jsx-runtime');
15
15
  require('@dynamic-labs/wallet-book');
16
16
  require('../../constants/colors.cjs');
@@ -3,10 +3,10 @@ import { useCallback } from 'react';
3
3
  import { useInternalDynamicContext } from '../../../context/DynamicContext/useInternalDynamicContext.js';
4
4
  import { useViewContext } from '../../../context/ViewContext/ViewContext.js';
5
5
  import { iframeContainerId } from '../../../views/Passkey/PasskeyRecovery/constants.js';
6
+ import '@dynamic-labs/wallet-connector-core';
6
7
  import '@dynamic-labs/sdk-api';
7
8
  import '../../../shared/logger.js';
8
9
  import '@dynamic-labs/iconic';
9
- import '@dynamic-labs/wallet-connector-core';
10
10
  import 'react/jsx-runtime';
11
11
  import '@dynamic-labs/wallet-book';
12
12
  import '../../constants/colors.js';
@@ -8,10 +8,10 @@ var types = require('@dynamic-labs/types');
8
8
  var useInternalDynamicContext = require('../../../context/DynamicContext/useInternalDynamicContext.cjs');
9
9
  var api = require('../../../data/api.cjs');
10
10
  var useUpdateUserProfileByJWTCallback = require('../useUpdateUserProfileByJWTCallback/useUpdateUserProfileByJWTCallback.cjs');
11
+ require('@dynamic-labs/wallet-connector-core');
11
12
  require('@dynamic-labs/sdk-api');
12
13
  require('../../../shared/logger.cjs');
13
14
  require('@dynamic-labs/iconic');
14
- require('@dynamic-labs/wallet-connector-core');
15
15
  require('react/jsx-runtime');
16
16
  require('../../../context/ViewContext/ViewContext.cjs');
17
17
  require('@dynamic-labs/wallet-book');
@@ -4,10 +4,10 @@ import { SocialOAuthErrorCode } from '@dynamic-labs/types';
4
4
  import { useInternalDynamicContext } from '../../../context/DynamicContext/useInternalDynamicContext.js';
5
5
  import { unlinkOAuth } from '../../../data/api.js';
6
6
  import { useUpdateUserProfileByJWTCallback } from '../useUpdateUserProfileByJWTCallback/useUpdateUserProfileByJWTCallback.js';
7
+ import '@dynamic-labs/wallet-connector-core';
7
8
  import '@dynamic-labs/sdk-api';
8
9
  import '../../../shared/logger.js';
9
10
  import '@dynamic-labs/iconic';
10
- import '@dynamic-labs/wallet-connector-core';
11
11
  import 'react/jsx-runtime';
12
12
  import '../../../context/ViewContext/ViewContext.js';
13
13
  import '@dynamic-labs/wallet-book';
@@ -10,11 +10,11 @@ var utils = require('@dynamic-labs/utils');
10
10
  var useInternalDynamicContext = require('../../../context/DynamicContext/useInternalDynamicContext.cjs');
11
11
  var api = require('../../../data/api.cjs');
12
12
  var useUpdateUserProfileByJWTCallback = require('../useUpdateUserProfileByJWTCallback/useUpdateUserProfileByJWTCallback.cjs');
13
+ require('@dynamic-labs/wallet-connector-core');
13
14
  var digestSHA256 = require('../../functions/digestSHA256/digestSHA256.cjs');
14
15
  var encodeBase64URL = require('../../functions/encodeBase64URL/encodeBase64URL.cjs');
15
16
  var decodeJwt = require('../../../shared/utils/functions/decodeJwt/decodeJwt.cjs');
16
17
  require('@dynamic-labs/iconic');
17
- require('@dynamic-labs/wallet-connector-core');
18
18
  require('react/jsx-runtime');
19
19
  var ViewContext = require('../../../context/ViewContext/ViewContext.cjs');
20
20
  var logger = require('../../../shared/logger.cjs');
@@ -6,11 +6,11 @@ import { isMobile, SocialAccountAlreadyExistsError, NoAccessError } from '@dynam
6
6
  import { useInternalDynamicContext } from '../../../context/DynamicContext/useInternalDynamicContext.js';
7
7
  import { getOAuthResult, verifyOAuth, signInOAuth } from '../../../data/api.js';
8
8
  import { useUpdateUserProfileByJWTCallback } from '../useUpdateUserProfileByJWTCallback/useUpdateUserProfileByJWTCallback.js';
9
+ import '@dynamic-labs/wallet-connector-core';
9
10
  import { digestSHA256 } from '../../functions/digestSHA256/digestSHA256.js';
10
11
  import { encodeBase64URL } from '../../functions/encodeBase64URL/encodeBase64URL.js';
11
12
  import { decodeJwt } from '../../../shared/utils/functions/decodeJwt/decodeJwt.js';
12
13
  import '@dynamic-labs/iconic';
13
- import '@dynamic-labs/wallet-connector-core';
14
14
  import 'react/jsx-runtime';
15
15
  import { useViewContext } from '../../../context/ViewContext/ViewContext.js';
16
16
  import { logger } from '../../../shared/logger.js';
@@ -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, connectedWallets, authMode, setOnboardingOnlyJwt, authToken, setAuthMode, removeConnectedWalletsInfo, setIsVerificationInProgress, eventsCallbacks, primaryWallet, } = useInternalDynamicContext.useInternalDynamicContext();
41
+ const { setUser, multiWalletWidgetState, debugError, multiWallet: multiWalletEnabled, appName, primaryWalletId, setCallback, setShowAuthFlow, setPrimaryWalletId, siweStatement, connectedWallets, authMode, setOnboardingOnlyJwt, authToken, setAuthMode, removeConnectedWalletsInfo, setIsVerificationInProgress, eventsCallbacks, primaryWallet, setMultiWalletWidgetState, } = 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.
@@ -179,6 +179,7 @@ const useVerifyWallet = ({ consumeNonce, displaySiweStatement, environmentId, pr
179
179
  }
180
180
  index.storeAuthToken(Jwt);
181
181
  setOnboardingOnlyJwt(undefined);
182
+ setMultiWalletWidgetState('idle');
182
183
  setUser(user); // The user should only be set if no KYC is needed.
183
184
  setShowAuthFlow(false);
184
185
  /* istanbul ignore else */
@@ -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, connectedWallets, authMode, setOnboardingOnlyJwt, authToken, setAuthMode, removeConnectedWalletsInfo, setIsVerificationInProgress, eventsCallbacks, primaryWallet, } = useInternalDynamicContext();
37
+ const { setUser, multiWalletWidgetState, debugError, multiWallet: multiWalletEnabled, appName, primaryWalletId, setCallback, setShowAuthFlow, setPrimaryWalletId, siweStatement, connectedWallets, authMode, setOnboardingOnlyJwt, authToken, setAuthMode, removeConnectedWalletsInfo, setIsVerificationInProgress, eventsCallbacks, primaryWallet, setMultiWalletWidgetState, } = 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.
@@ -175,6 +175,7 @@ const useVerifyWallet = ({ consumeNonce, displaySiweStatement, environmentId, pr
175
175
  }
176
176
  storeAuthToken(Jwt);
177
177
  setOnboardingOnlyJwt(undefined);
178
+ setMultiWalletWidgetState('idle');
178
179
  setUser(user); // The user should only be set if no KYC is needed.
179
180
  setShowAuthFlow(false);
180
181
  /* istanbul ignore else */
@@ -3,9 +3,9 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var sdkApi = require('@dynamic-labs/sdk-api');
6
+ require('@dynamic-labs/wallet-connector-core');
6
7
  require('../../../../../shared/logger.cjs');
7
8
  require('@dynamic-labs/iconic');
8
- require('@dynamic-labs/wallet-connector-core');
9
9
  require('react/jsx-runtime');
10
10
  require('../../../../../context/ViewContext/ViewContext.cjs');
11
11
  require('react');
@@ -1,7 +1,7 @@
1
1
  import { ProviderEnum } from '@dynamic-labs/sdk-api';
2
+ import '@dynamic-labs/wallet-connector-core';
2
3
  import '../../../../../shared/logger.js';
3
4
  import '@dynamic-labs/iconic';
4
- import '@dynamic-labs/wallet-connector-core';
5
5
  import 'react/jsx-runtime';
6
6
  import '../../../../../context/ViewContext/ViewContext.js';
7
7
  import 'react';
@@ -3,9 +3,9 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var sdkApi = require('@dynamic-labs/sdk-api');
6
+ require('@dynamic-labs/wallet-connector-core');
6
7
  require('../../../../../shared/logger.cjs');
7
8
  require('@dynamic-labs/iconic');
8
- require('@dynamic-labs/wallet-connector-core');
9
9
  require('react/jsx-runtime');
10
10
  require('../../../../../context/ViewContext/ViewContext.cjs');
11
11
  require('react');
@@ -1,7 +1,7 @@
1
1
  import { ProviderEnum } from '@dynamic-labs/sdk-api';
2
+ import '@dynamic-labs/wallet-connector-core';
2
3
  import '../../../../../shared/logger.js';
3
4
  import '@dynamic-labs/iconic';
4
- import '@dynamic-labs/wallet-connector-core';
5
5
  import 'react/jsx-runtime';
6
6
  import '../../../../../context/ViewContext/ViewContext.js';
7
7
  import 'react';
@@ -17,6 +17,8 @@ require('../../constants/colors.cjs');
17
17
  require('../../../shared/utils/classes/storage/localStorage.cjs');
18
18
  require('viem');
19
19
  require('../../../shared/consts/index.cjs');
20
+ require('@dynamic-labs/multi-wallet');
21
+ var getWalletIdentifier = require('../../functions/getWalletIdentifier/getWalletIdentifier.cjs');
20
22
  var isSameWalletName = require('../../functions/isSameWalletName/isSameWalletName.cjs');
21
23
  var useWalletsConnectionState = require('../useWalletsConnectionState/useWalletsConnectionState.cjs');
22
24
  var reconnectSocialWallet = require('./reconnectSocialWallet.cjs');
@@ -64,13 +66,15 @@ const useWalletConnectors = ({ authMode, authToken, connectedWallets, walletConn
64
66
  React.useEffect(() => walletsBasedOnAuthMode.forEach((wallet) => {
65
67
  wallet.connector.initEventListener();
66
68
  }), [walletsBasedOnAuthMode]);
67
- const { connectedWalletMap, didConnectedStateLoad } = useWalletsConnectionState.useWalletsConnectionState(walletsBasedOnAuthMode);
68
- const wallets = React.useMemo(() => walletsBasedOnAuthMode.map((wallet) => (Object.assign(Object.assign({}, wallet), { connected: Boolean(connectedWalletMap[wallet.id]) }))), [connectedWalletMap, walletsBasedOnAuthMode]);
69
+ const { connectedWalletsMap, didConnectedStateLoad } = useWalletsConnectionState.useWalletsConnectionState(walletsBasedOnAuthMode);
70
+ const wallets = React.useMemo(() => walletsBasedOnAuthMode.map((wallet) => (Object.assign(Object.assign({}, wallet), { connected: Boolean(connectedWalletsMap[getWalletIdentifier.getWalletIdentifier(wallet)]) }))), [connectedWalletsMap, walletsBasedOnAuthMode]);
69
71
  const { setUserWallets } = UserWalletsContext.useInternalUserWallets();
70
72
  // Keep userWallets in sync whenever linkedWallets changes
71
73
  React.useEffect(() => {
74
+ if (!didConnectedStateLoad.current)
75
+ return;
72
76
  setUserWallets((userWallets) => updateUserWalletsFromLinkedWallets.updateUserWalletsFromLinkedWallets(userWallets, wallets));
73
- }, [setUserWallets, wallets]);
77
+ }, [didConnectedStateLoad, setUserWallets, wallets]);
74
78
  const primaryWallet = React.useMemo(() => { var _a; return (_a = wallets.find((wallet) => wallet.id === primaryWalletId)) !== null && _a !== void 0 ? _a : null; }, [primaryWalletId, wallets]);
75
79
  const secondaryWallets = React.useMemo(() => canHaveMultipleWalletsConnected
76
80
  ? wallets.filter((wallet) => wallet.id !== primaryWalletId)
@@ -169,7 +173,7 @@ const useWalletConnectors = ({ authMode, authToken, connectedWallets, walletConn
169
173
  setQrcodeUri,
170
174
  ]);
171
175
  return {
172
- didConnectedStateLoad,
176
+ didConnectedStateLoad: didConnectedStateLoad.current,
173
177
  primaryWallet,
174
178
  secondaryWallets,
175
179
  setPrimaryWallet,
@@ -13,6 +13,8 @@ import '../../constants/colors.js';
13
13
  import '../../../shared/utils/classes/storage/localStorage.js';
14
14
  import 'viem';
15
15
  import '../../../shared/consts/index.js';
16
+ import '@dynamic-labs/multi-wallet';
17
+ import { getWalletIdentifier } from '../../functions/getWalletIdentifier/getWalletIdentifier.js';
16
18
  import { isSameWalletName } from '../../functions/isSameWalletName/isSameWalletName.js';
17
19
  import { useWalletsConnectionState } from '../useWalletsConnectionState/useWalletsConnectionState.js';
18
20
  import { reconnectSocialWallet } from './reconnectSocialWallet.js';
@@ -60,13 +62,15 @@ const useWalletConnectors = ({ authMode, authToken, connectedWallets, walletConn
60
62
  useEffect(() => walletsBasedOnAuthMode.forEach((wallet) => {
61
63
  wallet.connector.initEventListener();
62
64
  }), [walletsBasedOnAuthMode]);
63
- const { connectedWalletMap, didConnectedStateLoad } = useWalletsConnectionState(walletsBasedOnAuthMode);
64
- const wallets = useMemo(() => walletsBasedOnAuthMode.map((wallet) => (Object.assign(Object.assign({}, wallet), { connected: Boolean(connectedWalletMap[wallet.id]) }))), [connectedWalletMap, walletsBasedOnAuthMode]);
65
+ const { connectedWalletsMap, didConnectedStateLoad } = useWalletsConnectionState(walletsBasedOnAuthMode);
66
+ const wallets = useMemo(() => walletsBasedOnAuthMode.map((wallet) => (Object.assign(Object.assign({}, wallet), { connected: Boolean(connectedWalletsMap[getWalletIdentifier(wallet)]) }))), [connectedWalletsMap, walletsBasedOnAuthMode]);
65
67
  const { setUserWallets } = useInternalUserWallets();
66
68
  // Keep userWallets in sync whenever linkedWallets changes
67
69
  useEffect(() => {
70
+ if (!didConnectedStateLoad.current)
71
+ return;
68
72
  setUserWallets((userWallets) => updateUserWalletsFromLinkedWallets(userWallets, wallets));
69
- }, [setUserWallets, wallets]);
73
+ }, [didConnectedStateLoad, setUserWallets, wallets]);
70
74
  const primaryWallet = useMemo(() => { var _a; return (_a = wallets.find((wallet) => wallet.id === primaryWalletId)) !== null && _a !== void 0 ? _a : null; }, [primaryWalletId, wallets]);
71
75
  const secondaryWallets = useMemo(() => canHaveMultipleWalletsConnected
72
76
  ? wallets.filter((wallet) => wallet.id !== primaryWalletId)
@@ -165,7 +169,7 @@ const useWalletConnectors = ({ authMode, authToken, connectedWallets, walletConn
165
169
  setQrcodeUri,
166
170
  ]);
167
171
  return {
168
- didConnectedStateLoad,
172
+ didConnectedStateLoad: didConnectedStateLoad.current,
169
173
  primaryWallet,
170
174
  secondaryWallets,
171
175
  setPrimaryWallet,
@@ -65,12 +65,13 @@ const useWalletEventListeners = ({ handleLogOut, multiWallet, multiWalletWidgetS
65
65
  if (!primaryWallet)
66
66
  return;
67
67
  const [newAddress] = accounts;
68
- const newWallet = secondaryWallets.find((wallet) => walletConnectorCore.isSameAddress(wallet.address, newAddress, wallet.chain));
69
- if (authMode === 'connect-only') {
68
+ const changedAddress = !walletConnectorCore.isSameAddress(newAddress, primaryWallet.address, primaryWallet.chain);
69
+ if (changedAddress && authMode === 'connect-only') {
70
70
  refreshConnectedWallet(primaryWallet.id, primaryWallet.connector);
71
71
  return;
72
72
  }
73
- if (walletConnectorCore.isSameAddress(newAddress, primaryWallet.address, primaryWallet.chain)) {
73
+ const newWallet = secondaryWallets.find((wallet) => walletConnectorCore.isSameAddress(wallet.address, newAddress, wallet.chain));
74
+ if (!changedAddress) {
74
75
  setMultiWalletWidgetState('idle');
75
76
  }
76
77
  else if (!multiWallet) {
@@ -61,12 +61,13 @@ const useWalletEventListeners = ({ handleLogOut, multiWallet, multiWalletWidgetS
61
61
  if (!primaryWallet)
62
62
  return;
63
63
  const [newAddress] = accounts;
64
- const newWallet = secondaryWallets.find((wallet) => isSameAddress(wallet.address, newAddress, wallet.chain));
65
- if (authMode === 'connect-only') {
64
+ const changedAddress = !isSameAddress(newAddress, primaryWallet.address, primaryWallet.chain);
65
+ if (changedAddress && authMode === 'connect-only') {
66
66
  refreshConnectedWallet(primaryWallet.id, primaryWallet.connector);
67
67
  return;
68
68
  }
69
- if (isSameAddress(newAddress, primaryWallet.address, primaryWallet.chain)) {
69
+ const newWallet = secondaryWallets.find((wallet) => isSameAddress(wallet.address, newAddress, wallet.chain));
70
+ if (!changedAddress) {
70
71
  setMultiWalletWidgetState('idle');
71
72
  }
72
73
  else if (!multiWallet) {
@@ -8,10 +8,10 @@ var useInternalDynamicContext = require('../../../context/DynamicContext/useInte
8
8
  var ErrorContext = require('../../../context/ErrorContext/ErrorContext.cjs');
9
9
  var MockContext = require('../../../context/MockContext/MockContext.cjs');
10
10
  var ViewContext = require('../../../context/ViewContext/ViewContext.cjs');
11
+ require('@dynamic-labs/wallet-connector-core');
11
12
  require('@dynamic-labs/sdk-api');
12
13
  require('../../../shared/logger.cjs');
13
14
  require('@dynamic-labs/iconic');
14
- require('@dynamic-labs/wallet-connector-core');
15
15
  require('react/jsx-runtime');
16
16
  require('react');
17
17
  require('@dynamic-labs/wallet-book');
@@ -4,10 +4,10 @@ import { useInternalDynamicContext } from '../../../context/DynamicContext/useIn
4
4
  import { useErrorContext } from '../../../context/ErrorContext/ErrorContext.js';
5
5
  import { useMockContext } from '../../../context/MockContext/MockContext.js';
6
6
  import { useViewContext } from '../../../context/ViewContext/ViewContext.js';
7
+ import '@dynamic-labs/wallet-connector-core';
7
8
  import '@dynamic-labs/sdk-api';
8
9
  import '../../../shared/logger.js';
9
10
  import '@dynamic-labs/iconic';
10
- import '@dynamic-labs/wallet-connector-core';
11
11
  import 'react/jsx-runtime';
12
12
  import 'react';
13
13
  import '@dynamic-labs/wallet-book';
@@ -4,10 +4,10 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var _tslib = require('../../../../../_virtual/_tslib.cjs');
6
6
  var React = require('react');
7
+ var walletConnectorCore = require('@dynamic-labs/wallet-connector-core');
7
8
  require('@dynamic-labs/sdk-api');
8
- var logger = require('../../../shared/logger.cjs');
9
+ require('../../../shared/logger.cjs');
9
10
  require('@dynamic-labs/iconic');
10
- require('@dynamic-labs/wallet-connector-core');
11
11
  require('react/jsx-runtime');
12
12
  require('../../../context/ViewContext/ViewContext.cjs');
13
13
  require('@dynamic-labs/wallet-book');
@@ -15,68 +15,92 @@ require('../../constants/colors.cjs');
15
15
  require('../../../shared/utils/classes/storage/localStorage.cjs');
16
16
  require('viem');
17
17
  require('@dynamic-labs/utils');
18
+ var useThrottle = require('../../../shared/utils/hooks/useThrottle/useThrottle.cjs');
18
19
  require('../../../shared/consts/index.cjs');
19
- var useWalletConnectorEvent = require('../useWalletConnectorEvent/useWalletConnectorEvent.cjs');
20
20
  require('@dynamic-labs/multi-wallet');
21
+ var getWalletIdentifier = require('../../functions/getWalletIdentifier/getWalletIdentifier.cjs');
21
22
  var isWalletConnected = require('../../functions/isWalletConnected/isWalletConnected.cjs');
22
23
  var useEventListener = require('../useEventListener/useEventListener.cjs');
24
+ var useWalletConnectorEvent = require('../useWalletConnectorEvent/useWalletConnectorEvent.cjs');
23
25
 
24
- const connectedWalletStateReducer = (state, connectedWalletsMap) => {
25
- const isConnectedWalletsMapEmpty = Object.values(connectedWalletsMap).length === 0;
26
- if (isConnectedWalletsMapEmpty && state.didLoad === false) {
27
- return state;
28
- }
29
- return Object.assign(Object.assign({}, state), { connectedWalletsMap, didLoad: true });
30
- };
26
+ /**
27
+ * For the given wallet array, this returns an object mapping from each wallet's
28
+ * identifier to whether its connector recognizes it as currently connected or not.
29
+ */
30
+ const getConnectedWalletsMap = (wallets) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
31
+ const newMap = {};
32
+ yield Promise.all(wallets.map((wallet) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
33
+ newMap[getWalletIdentifier.getWalletIdentifier(wallet)] = yield isWalletConnected.isWalletConnected(wallet);
34
+ })));
35
+ return newMap;
36
+ });
31
37
  const useWalletsConnectionState = (wallets) => {
32
- const [state, setState] = React.useReducer(connectedWalletStateReducer, {
33
- connectedWalletsMap: {},
34
- didLoad: false,
35
- });
36
- const refreshKey = wallets.map(({ id }) => id).join('-');
37
- const connectors = wallets.map(({ connector }) => connector);
38
- const lastCallTimestamp = React.useRef(0);
38
+ const [connectedWalletsMap, setConnectedWalletsMap] = React.useState({});
39
+ /**
40
+ * Whether the connection map has been loaded off of the current wallet array.
41
+ * Always false for empty wallet arrays.
42
+ */
43
+ const didConnectedStateLoad = React.useRef(false);
44
+ /**
45
+ * When an accountChanged event is raised, we store the incoming wallet here
46
+ * until it is finally reflected in the wallets prop.
47
+ * During this time we do not update the connectedWalletsMap.
48
+ * This way, we avoid setting the connected state of the primary wallet
49
+ * to false due to a state transition delay.
50
+ */
51
+ const incomingWalletSwitchAddress = React.useRef(undefined);
39
52
  const computeConnectedStateForWallets = React.useCallback(() => _tslib.__awaiter(void 0, void 0, void 0, function* () {
40
- const connectedWalletsMap = {};
41
- yield Promise.all(wallets.map((wallet) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
42
- connectedWalletsMap[wallet.id] = yield isWalletConnected.isWalletConnected(wallet);
43
- })));
44
- setState(connectedWalletsMap);
45
- }), [wallets]);
46
- const handleOnEventUpdate = React.useCallback(() => _tslib.__awaiter(void 0, void 0, void 0, function* () {
47
- if (!wallets.length)
48
- return;
49
- const callTimestamp = new Date().getTime();
50
- const diffFromLastCall = callTimestamp - lastCallTimestamp.current;
51
- lastCallTimestamp.current = callTimestamp;
52
- // getConnectedAccounts trigger accountChanged event for Phantom EVM wallets
53
- // which causes a loop of calls to this function
54
- if (diffFromLastCall < 1000) {
55
- logger.logger.warn('computeConnectedStateForWallets: skipping due too many calls.');
53
+ didConnectedStateLoad.current = false;
54
+ const newMap = yield getConnectedWalletsMap(wallets);
55
+ if (Object.values(newMap).length === 0) {
56
+ setConnectedWalletsMap({});
56
57
  return;
57
58
  }
58
- computeConnectedStateForWallets();
59
- }), [computeConnectedStateForWallets, wallets.length]);
60
- useWalletConnectorEvent.useWalletConnectorEvent(connectors, 'accountChange', handleOnEventUpdate);
61
- useWalletConnectorEvent.useWalletConnectorEvent(connectors, 'disconnect', handleOnEventUpdate);
62
- useWalletConnectorEvent.useWalletConnectorEvent(connectors, 'chainChange', handleOnEventUpdate);
59
+ didConnectedStateLoad.current = true;
60
+ // If there is an incoming account switch and it isn't yet finished,
61
+ // we don't change the map to avoid setting it to a misleading state
62
+ if (incomingWalletSwitchAddress.current) {
63
+ const accountSwitchIsComplete = wallets.some((wallet) => walletConnectorCore.isSameAddress(incomingWalletSwitchAddress.current, wallet.address, wallet.chain));
64
+ if (accountSwitchIsComplete)
65
+ incomingWalletSwitchAddress.current = undefined;
66
+ else
67
+ return;
68
+ }
69
+ setConnectedWalletsMap(newMap);
70
+ }), [wallets]);
71
+ /** A string that is unique for each possible value of the wallets prop */
72
+ const walletsHash = wallets.map(getWalletIdentifier.getWalletIdentifier).join('-');
73
+ const connectors = wallets.map(({ connector }) => connector);
74
+ // getConnectedAccounts trigger accountChanged event for Phantom EVM wallets
75
+ // which causes a loop of calls to this function, so we throttle it
76
+ const handleEvent = useThrottle.useThrottle(() => {
77
+ if (walletsHash)
78
+ computeConnectedStateForWallets();
79
+ }, 1000);
80
+ const onAccountChange = ({ accounts }) => {
81
+ incomingWalletSwitchAddress.current = accounts[0];
82
+ handleEvent();
83
+ };
84
+ useWalletConnectorEvent.useWalletConnectorEvent(connectors, 'accountChange', onAccountChange);
85
+ useWalletConnectorEvent.useWalletConnectorEvent(connectors, 'disconnect', handleEvent);
86
+ useWalletConnectorEvent.useWalletConnectorEvent(connectors, 'chainChange', handleEvent);
63
87
  React.useEffect(() => {
64
88
  computeConnectedStateForWallets();
65
89
  },
66
90
  /**
67
- * This is using a custom key to force the useEffect to run only when a connector is
68
- * added or removed from the connectors list.
91
+ * This is using a custom key to force the useEffect to run only when the ids of the
92
+ * wallets change.
69
93
  */
70
94
  // eslint-disable-next-line react-hooks/exhaustive-deps
71
- [refreshKey]);
95
+ [walletsHash]);
72
96
  /**
73
97
  * This is a workaround to detect when the user switches to another tab/extension
74
98
  * and then comes back to the dapp.
75
99
  */
76
100
  useEventListener.useEventListener('focus', computeConnectedStateForWallets);
77
101
  return {
78
- connectedWalletMap: state.connectedWalletsMap,
79
- didConnectedStateLoad: state.didLoad,
102
+ connectedWalletsMap,
103
+ didConnectedStateLoad,
80
104
  };
81
105
  };
82
106
 
@@ -1,13 +1,11 @@
1
+ import { MutableRefObject } from 'react';
1
2
  import { Wallet } from '../../../shared';
2
- type ConnectedState = {
3
- didLoad: boolean;
4
- connectedWalletsMap: {
5
- [address: string]: boolean;
6
- };
3
+ type ConnectedWalletsMap = {
4
+ [address: string]: boolean;
7
5
  };
8
6
  type WalletsConnectionStateHook = (wallets: Wallet[]) => {
9
- connectedWalletMap: ConnectedState['connectedWalletsMap'];
10
- didConnectedStateLoad: ConnectedState['didLoad'];
7
+ connectedWalletsMap: ConnectedWalletsMap;
8
+ didConnectedStateLoad: MutableRefObject<boolean>;
11
9
  };
12
10
  export declare const useWalletsConnectionState: WalletsConnectionStateHook;
13
11
  export {};