@dynamic-labs/sdk-react-core 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/package.cjs +3 -3
  3. package/package.js +3 -3
  4. package/package.json +12 -12
  5. package/src/index.cjs +10 -8
  6. package/src/index.js +5 -4
  7. package/src/lib/Main.cjs +1 -1
  8. package/src/lib/Main.js +1 -1
  9. package/src/lib/components/InlineWidget/components/InlineWidgetButton/InlineWidgetButton.d.ts +2 -1
  10. package/src/lib/components/MenuList/Dropdown/Dropdown.cjs +1 -1
  11. package/src/lib/components/MenuList/Dropdown/Dropdown.js +1 -1
  12. package/src/lib/components/SyncPasskeyFlow/SyncPasskeyFlow.cjs +2 -2
  13. package/src/lib/components/SyncPasskeyFlow/SyncPasskeyFlow.js +2 -2
  14. package/src/lib/components/WalletInformationCard/WalletInformationCard.cjs +3 -1
  15. package/src/lib/components/WalletInformationCard/WalletInformationCard.d.ts +2 -1
  16. package/src/lib/components/WalletInformationCard/WalletInformationCard.js +3 -1
  17. package/src/lib/context/DynamicContext/DynamicContext.cjs +2 -2
  18. package/src/lib/context/DynamicContext/DynamicContext.js +2 -2
  19. package/src/lib/data/api.cjs +2 -2
  20. package/src/lib/data/api.d.ts +1 -0
  21. package/src/lib/data/api.js +2 -2
  22. package/src/lib/locale/en/translation.cjs +34 -0
  23. package/src/lib/locale/en/translation.d.ts +34 -0
  24. package/src/lib/locale/en/translation.js +34 -0
  25. package/src/lib/shared/utils/hooks/index.d.ts +5 -4
  26. package/src/lib/shared/utils/hooks/useThrottle/index.d.ts +1 -0
  27. package/src/lib/shared/utils/hooks/useThrottle/useThrottle.cjs +29 -0
  28. package/src/lib/shared/utils/hooks/useThrottle/useThrottle.d.ts +8 -0
  29. package/src/lib/shared/utils/hooks/useThrottle/useThrottle.js +25 -0
  30. package/src/lib/utils/functions/getWalletIdentifier/getWalletIdentifier.cjs +1 -1
  31. package/src/lib/utils/functions/getWalletIdentifier/getWalletIdentifier.d.ts +1 -1
  32. package/src/lib/utils/functions/getWalletIdentifier/getWalletIdentifier.js +1 -1
  33. package/src/lib/utils/hooks/multiWallet/useSyncPrimaryWallet/useSyncPrimaryWallet.cjs +13 -2
  34. package/src/lib/utils/hooks/multiWallet/useSyncPrimaryWallet/useSyncPrimaryWallet.js +13 -2
  35. package/src/lib/utils/hooks/useColorSchemePreference/useColorSchemePreference.cjs +1 -1
  36. package/src/lib/utils/hooks/useColorSchemePreference/useColorSchemePreference.js +1 -1
  37. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.cjs +14 -6
  38. package/src/lib/utils/hooks/useEmbeddedWallet/useEmbeddedWallet.js +14 -6
  39. package/src/lib/utils/hooks/useFetchProjectSettings/useFetchProjectSettings.cjs +15 -1
  40. package/src/lib/utils/hooks/useFetchProjectSettings/useFetchProjectSettings.js +16 -2
  41. package/src/lib/utils/hooks/useWalletConnectors/useWalletConnectors.cjs +8 -8
  42. package/src/lib/utils/hooks/useWalletConnectors/useWalletConnectors.js +8 -8
  43. package/src/lib/utils/hooks/useWalletEventListeners/useWalletEventListeners.cjs +4 -3
  44. package/src/lib/utils/hooks/useWalletEventListeners/useWalletEventListeners.js +4 -3
  45. package/src/lib/utils/hooks/useWalletsConnectionState/useWalletsConnectionState.cjs +65 -45
  46. package/src/lib/utils/hooks/useWalletsConnectionState/useWalletsConnectionState.d.ts +5 -7
  47. package/src/lib/utils/hooks/useWalletsConnectionState/useWalletsConnectionState.js +66 -46
  48. package/src/lib/widgets/DynamicBridgeWidget/DynamicBridgeWidget.cjs +3 -2
  49. package/src/lib/widgets/DynamicBridgeWidget/DynamicBridgeWidget.js +3 -2
  50. package/src/lib/widgets/DynamicBridgeWidget/components/DynamicBridgeWalletCard/DynamicBridgeWalletCard.cjs +10 -5
  51. package/src/lib/widgets/DynamicBridgeWidget/components/DynamicBridgeWalletCard/DynamicBridgeWalletCard.js +11 -6
  52. package/src/lib/widgets/DynamicBridgeWidget/components/DynamicBridgeWalletCardBody/DynamicBridgeWalletCardBody.cjs +6 -5
  53. package/src/lib/widgets/DynamicBridgeWidget/components/DynamicBridgeWalletCardBody/DynamicBridgeWalletCardBody.js +6 -5
  54. package/src/lib/widgets/DynamicBridgeWidget/components/DynamicBridgeWidgetEmptyCard/DynamicBridgeWidgetEmptyCard.cjs +5 -2
  55. package/src/lib/widgets/DynamicBridgeWidget/components/DynamicBridgeWidgetEmptyCard/DynamicBridgeWidgetEmptyCard.js +5 -2
  56. package/src/lib/widgets/DynamicBridgeWidget/views/ProfileView/ProfileView.cjs +3 -1
  57. package/src/lib/widgets/DynamicBridgeWidget/views/ProfileView/ProfileView.js +3 -1
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+
7
+ /**
8
+ * useThrottle hook to throttle a callback function.
9
+ *
10
+ * @param callback - The callback function to be throttled. It must return void.
11
+ * @param delay - The time in milliseconds to wait before the next call.
12
+ * @returns A throttled version of the callback function.
13
+ */
14
+ const useThrottle = (callback, delay) => {
15
+ const isThrottled = React.useRef(false);
16
+ const savedCallback = React.useRef(callback);
17
+ // Remember the latest callback if it changes.
18
+ savedCallback.current = callback;
19
+ return React.useCallback((...args) => {
20
+ if (!isThrottled.current) {
21
+ savedCallback.current(...args);
22
+ isThrottled.current = true;
23
+ // Set the throttle off after the delay
24
+ setTimeout(() => (isThrottled.current = false), delay);
25
+ }
26
+ }, [delay]);
27
+ };
28
+
29
+ exports.useThrottle = useThrottle;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * useThrottle hook to throttle a callback function.
3
+ *
4
+ * @param callback - The callback function to be throttled. It must return void.
5
+ * @param delay - The time in milliseconds to wait before the next call.
6
+ * @returns A throttled version of the callback function.
7
+ */
8
+ export declare const useThrottle: <T extends (...args: unknown[]) => void>(callback: T, delay: number) => (...args: Parameters<T>) => void;
@@ -0,0 +1,25 @@
1
+ import { useRef, useCallback } from 'react';
2
+
3
+ /**
4
+ * useThrottle hook to throttle a callback function.
5
+ *
6
+ * @param callback - The callback function to be throttled. It must return void.
7
+ * @param delay - The time in milliseconds to wait before the next call.
8
+ * @returns A throttled version of the callback function.
9
+ */
10
+ const useThrottle = (callback, delay) => {
11
+ const isThrottled = useRef(false);
12
+ const savedCallback = useRef(callback);
13
+ // Remember the latest callback if it changes.
14
+ savedCallback.current = callback;
15
+ return useCallback((...args) => {
16
+ if (!isThrottled.current) {
17
+ savedCallback.current(...args);
18
+ isThrottled.current = true;
19
+ // Set the throttle off after the delay
20
+ setTimeout(() => (isThrottled.current = false), delay);
21
+ }
22
+ }, [delay]);
23
+ };
24
+
25
+ export { useThrottle };
@@ -2,6 +2,6 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- const getWalletIdentifier = ({ address, connector }) => `${address}+${connector.key}`;
5
+ const getWalletIdentifier = ({ address, connector, }) => `${address}+${connector.key}`;
6
6
 
7
7
  exports.getWalletIdentifier = getWalletIdentifier;
@@ -1,2 +1,2 @@
1
1
  import { Wallet } from '../../../shared';
2
- export declare const getWalletIdentifier: ({ address, connector }: Wallet) => `${string}+${string}`;
2
+ export declare const getWalletIdentifier: ({ address, connector, }: Pick<Wallet, 'address' | 'connector'>) => `${string}+${string}`;
@@ -1,3 +1,3 @@
1
- const getWalletIdentifier = ({ address, connector }) => `${address}+${connector.key}`;
1
+ const getWalletIdentifier = ({ address, connector, }) => `${address}+${connector.key}`;
2
2
 
3
3
  export { getWalletIdentifier };
@@ -9,6 +9,15 @@ var isWalletLinked = require('../../../functions/isWalletLinked/isWalletLinked.c
9
9
  var ViewContext = require('../../../../context/ViewContext/ViewContext.cjs');
10
10
  var useInternalDynamicContext = require('../../../../context/DynamicContext/useInternalDynamicContext.cjs');
11
11
  var errors = require('../../../constants/errors.cjs');
12
+ require('@dynamic-labs/sdk-api');
13
+ var logger = require('../../../../shared/logger.cjs');
14
+ require('@dynamic-labs/iconic');
15
+ require('react/jsx-runtime');
16
+ require('@dynamic-labs/wallet-book');
17
+ require('../../../constants/colors.cjs');
18
+ require('../../../../shared/utils/classes/storage/localStorage.cjs');
19
+ require('viem');
20
+ require('../../../../shared/consts/index.cjs');
12
21
 
13
22
  const useSyncPrimaryWallet = (canSync = true) => {
14
23
  const { setShowAuthFlow, isAuthenticated, authMode, connectWallet, handleLogOut, multiWalletWidgetState, primaryWallet, secondaryWallets, setMultiWalletWidgetState, setPrimaryWallet, setShowWidgetStatePopup, showLockedWalletView, showWidgetStatePopup, setSelectedWalletWithAction, } = useInternalDynamicContext.useInternalDynamicContext();
@@ -76,6 +85,10 @@ const useSyncPrimaryWallet = (canSync = true) => {
76
85
  primaryWallet.connector
77
86
  .getConnectedAccounts()
78
87
  .then((accounts) => {
88
+ logger.logger.debug('Sync primary wallet - getConnectedAccounts', {
89
+ accounts,
90
+ primaryWalletAddress: primaryWallet.address,
91
+ });
79
92
  const [connectedAddress] = accounts;
80
93
  if (!connectedAddress) {
81
94
  throw new utils.DynamicError('Missing wallet address', errors.MISSING_ADDRESS_ERROR);
@@ -100,9 +113,7 @@ const useSyncPrimaryWallet = (canSync = true) => {
100
113
  if (showLockedWalletView) {
101
114
  setShowAuthFlow(true);
102
115
  setView('wallet-locked-view');
103
- return;
104
116
  }
105
- handleLogOut();
106
117
  }
107
118
  });
108
119
  }, [
@@ -5,6 +5,15 @@ import { isWalletLinked } from '../../../functions/isWalletLinked/isWalletLinked
5
5
  import { useViewContext } from '../../../../context/ViewContext/ViewContext.js';
6
6
  import { useInternalDynamicContext } from '../../../../context/DynamicContext/useInternalDynamicContext.js';
7
7
  import { MISSING_ADDRESS_ERROR } from '../../../constants/errors.js';
8
+ import '@dynamic-labs/sdk-api';
9
+ import { logger } from '../../../../shared/logger.js';
10
+ import '@dynamic-labs/iconic';
11
+ import 'react/jsx-runtime';
12
+ import '@dynamic-labs/wallet-book';
13
+ import '../../../constants/colors.js';
14
+ import '../../../../shared/utils/classes/storage/localStorage.js';
15
+ import 'viem';
16
+ import '../../../../shared/consts/index.js';
8
17
 
9
18
  const useSyncPrimaryWallet = (canSync = true) => {
10
19
  const { setShowAuthFlow, isAuthenticated, authMode, connectWallet, handleLogOut, multiWalletWidgetState, primaryWallet, secondaryWallets, setMultiWalletWidgetState, setPrimaryWallet, setShowWidgetStatePopup, showLockedWalletView, showWidgetStatePopup, setSelectedWalletWithAction, } = useInternalDynamicContext();
@@ -72,6 +81,10 @@ const useSyncPrimaryWallet = (canSync = true) => {
72
81
  primaryWallet.connector
73
82
  .getConnectedAccounts()
74
83
  .then((accounts) => {
84
+ logger.debug('Sync primary wallet - getConnectedAccounts', {
85
+ accounts,
86
+ primaryWalletAddress: primaryWallet.address,
87
+ });
75
88
  const [connectedAddress] = accounts;
76
89
  if (!connectedAddress) {
77
90
  throw new DynamicError('Missing wallet address', MISSING_ADDRESS_ERROR);
@@ -96,9 +109,7 @@ const useSyncPrimaryWallet = (canSync = true) => {
96
109
  if (showLockedWalletView) {
97
110
  setShowAuthFlow(true);
98
111
  setView('wallet-locked-view');
99
- return;
100
112
  }
101
- handleLogOut();
102
113
  }
103
114
  });
104
115
  }, [
@@ -13,8 +13,8 @@ require('@dynamic-labs/wallet-book');
13
13
  require('../../constants/colors.cjs');
14
14
  require('../../../shared/utils/classes/storage/localStorage.cjs');
15
15
  require('viem');
16
- require('@dynamic-labs/utils');
17
16
  var useMediaQuery = require('../../../shared/utils/hooks/useMediaQuery/useMediaQuery.cjs');
17
+ require('@dynamic-labs/utils');
18
18
  require('../../../shared/consts/index.cjs');
19
19
 
20
20
  const useColorSchemePreference = () => {
@@ -9,8 +9,8 @@ import '@dynamic-labs/wallet-book';
9
9
  import '../../constants/colors.js';
10
10
  import '../../../shared/utils/classes/storage/localStorage.js';
11
11
  import 'viem';
12
- import '@dynamic-labs/utils';
13
12
  import { useMediaQuery } from '../../../shared/utils/hooks/useMediaQuery/useMediaQuery.js';
13
+ import '@dynamic-labs/utils';
14
14
  import '../../../shared/consts/index.js';
15
15
 
16
16
  const useColorSchemePreference = () => {
@@ -61,7 +61,7 @@ const useEmbeddedWallet = () => {
61
61
  internalSetShowAuthFlow,
62
62
  internalEvents,
63
63
  ]);
64
- const startEmbeddedWalletCreationFlow = () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
64
+ const startEmbeddedWalletCreationFlow = React.useCallback(() => _tslib.__awaiter(void 0, void 0, void 0, function* () {
65
65
  internalSetShowAuthFlow(true);
66
66
  setView('passkey-intro');
67
67
  return new Promise((resolve, reject) => {
@@ -70,15 +70,16 @@ const useEmbeddedWallet = () => {
70
70
  // when creating a passkey, if user cancels the passkey modal more than once
71
71
  // it will throw this DOMException, but we don't want to let user to have access
72
72
  // to the app before they've a passkey correctly setup
73
- if (error instanceof DOMException && error.name === 'NotAllowedError') {
73
+ if (error instanceof DOMException &&
74
+ error.name === 'NotAllowedError') {
74
75
  logger.logger.error('User cancelled the passkey creation.', error);
75
76
  return;
76
77
  }
77
78
  reject(error);
78
79
  });
79
80
  });
80
- });
81
- const returnEmbeddedWallet = (jwt, embeddedWalletVerifiedCredential) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
81
+ }), [internalEvents, internalSetShowAuthFlow, setView]);
82
+ const returnEmbeddedWallet = React.useCallback((jwt, embeddedWalletVerifiedCredential) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
82
83
  var _a, _b, _c, _d;
83
84
  const decodedJwt = decodeJwt.decodeJwt(jwt);
84
85
  const turnkeyWallet = findTurnkeyWallet.findTurnkeyWallet(walletConnectorOptions);
@@ -109,7 +110,7 @@ const useEmbeddedWallet = () => {
109
110
  id: embeddedWalletVerifiedCredential.id,
110
111
  };
111
112
  return Promise.resolve(passkeyWallet);
112
- });
113
+ }), [setPrimaryWalletId, walletConnectorOptions]);
113
114
  const createEmbeddedWallet = React.useCallback(() => _tslib.__awaiter(void 0, void 0, void 0, function* () {
114
115
  var _e, _f, _g;
115
116
  const jwt = (_e = getAuthToken.getAuthToken()) !== null && _e !== void 0 ? _e : onboardingOnlyJwt;
@@ -132,14 +133,21 @@ const useEmbeddedWallet = () => {
132
133
  const embeddedWalletVerifiedCredential = findEmbeddedWalletFromVerifiedCredentials.findEmbeddedWalletFromVerifiedCredentials(jwt);
133
134
  // if user logged in with MM for example, just continue the flow
134
135
  if (!embeddedWalletVerifiedCredential) {
136
+ // user logged in through an email linked to a third party wallet
137
+ // at this point primary wallet is still undefined and we need to set it
138
+ if (!primaryWallet) {
139
+ setPrimaryWalletId(userWaletsCredentials[0].id);
140
+ }
135
141
  return Promise.resolve(primaryWallet);
136
142
  }
137
143
  // if user already has embedded wallet, returns it
138
144
  return returnEmbeddedWallet(jwt, embeddedWalletVerifiedCredential);
139
145
  }), [
140
- internalSetShowAuthFlow,
141
146
  onboardingOnlyJwt,
142
147
  projectSettings,
148
+ internalSetShowAuthFlow,
149
+ returnEmbeddedWallet,
150
+ startEmbeddedWalletCreationFlow,
143
151
  startPregeneratedWalletCreationFlow,
144
152
  primaryWallet,
145
153
  ]);
@@ -57,7 +57,7 @@ const useEmbeddedWallet = () => {
57
57
  internalSetShowAuthFlow,
58
58
  internalEvents,
59
59
  ]);
60
- const startEmbeddedWalletCreationFlow = () => __awaiter(void 0, void 0, void 0, function* () {
60
+ const startEmbeddedWalletCreationFlow = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
61
61
  internalSetShowAuthFlow(true);
62
62
  setView('passkey-intro');
63
63
  return new Promise((resolve, reject) => {
@@ -66,15 +66,16 @@ const useEmbeddedWallet = () => {
66
66
  // when creating a passkey, if user cancels the passkey modal more than once
67
67
  // it will throw this DOMException, but we don't want to let user to have access
68
68
  // to the app before they've a passkey correctly setup
69
- if (error instanceof DOMException && error.name === 'NotAllowedError') {
69
+ if (error instanceof DOMException &&
70
+ error.name === 'NotAllowedError') {
70
71
  logger.error('User cancelled the passkey creation.', error);
71
72
  return;
72
73
  }
73
74
  reject(error);
74
75
  });
75
76
  });
76
- });
77
- const returnEmbeddedWallet = (jwt, embeddedWalletVerifiedCredential) => __awaiter(void 0, void 0, void 0, function* () {
77
+ }), [internalEvents, internalSetShowAuthFlow, setView]);
78
+ const returnEmbeddedWallet = useCallback((jwt, embeddedWalletVerifiedCredential) => __awaiter(void 0, void 0, void 0, function* () {
78
79
  var _a, _b, _c, _d;
79
80
  const decodedJwt = decodeJwt(jwt);
80
81
  const turnkeyWallet = findTurnkeyWallet(walletConnectorOptions);
@@ -105,7 +106,7 @@ const useEmbeddedWallet = () => {
105
106
  id: embeddedWalletVerifiedCredential.id,
106
107
  };
107
108
  return Promise.resolve(passkeyWallet);
108
- });
109
+ }), [setPrimaryWalletId, walletConnectorOptions]);
109
110
  const createEmbeddedWallet = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
110
111
  var _e, _f, _g;
111
112
  const jwt = (_e = getAuthToken()) !== null && _e !== void 0 ? _e : onboardingOnlyJwt;
@@ -128,14 +129,21 @@ const useEmbeddedWallet = () => {
128
129
  const embeddedWalletVerifiedCredential = findEmbeddedWalletFromVerifiedCredentials(jwt);
129
130
  // if user logged in with MM for example, just continue the flow
130
131
  if (!embeddedWalletVerifiedCredential) {
132
+ // user logged in through an email linked to a third party wallet
133
+ // at this point primary wallet is still undefined and we need to set it
134
+ if (!primaryWallet) {
135
+ setPrimaryWalletId(userWaletsCredentials[0].id);
136
+ }
131
137
  return Promise.resolve(primaryWallet);
132
138
  }
133
139
  // if user already has embedded wallet, returns it
134
140
  return returnEmbeddedWallet(jwt, embeddedWalletVerifiedCredential);
135
141
  }), [
136
- internalSetShowAuthFlow,
137
142
  onboardingOnlyJwt,
138
143
  projectSettings,
144
+ internalSetShowAuthFlow,
145
+ returnEmbeddedWallet,
146
+ startEmbeddedWalletCreationFlow,
139
147
  startPregeneratedWalletCreationFlow,
140
148
  primaryWallet,
141
149
  ]);
@@ -16,8 +16,8 @@ var localStorage = require('../../constants/localStorage.cjs');
16
16
  require('../../constants/colors.cjs');
17
17
  var localStorage$1 = require('../../../shared/utils/classes/storage/localStorage.cjs');
18
18
  require('viem');
19
- var useLocalStorage = require('../../../shared/utils/hooks/useLocalStorage/useLocalStorage.cjs');
20
19
  var useEffectOnce = require('../../../shared/utils/hooks/useEffectOnce/useEffectOnce.cjs');
20
+ var useLocalStorage = require('../../../shared/utils/hooks/useLocalStorage/useLocalStorage.cjs');
21
21
  require('../../../shared/consts/index.cjs');
22
22
  var validators = require('../../../context/DynamicContext/validators.cjs');
23
23
 
@@ -61,6 +61,7 @@ const useFetchProjectSettings = ({ authToken, environmentId, maxRetries = 2, dyn
61
61
  const serializedDynamicContextProps = Object.assign(Object.assign({}, updatedDynamicProps), { settings: Object.assign(Object.assign({}, updatedDynamicProps.settings), { eventsCallbacks: serializedEventsCallbacks, walletConnectors: serializedWalletConnectors }) });
62
62
  api.sendDynamicProps(environmentId, {
63
63
  dynamicContextProps: serializedDynamicContextProps,
64
+ frameworkSettings: getFrameworkSettings(),
64
65
  });
65
66
  api.fetchProjectSettings(environmentId)
66
67
  .then((response) => {
@@ -123,6 +124,19 @@ const serializeWalletConnectors = (walletConnectors) => {
123
124
  return undefined;
124
125
  }
125
126
  };
127
+ const getFrameworkSettings = () => {
128
+ var _a;
129
+ return ({
130
+ nextJs: {
131
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
132
+ // @ts-ignore
133
+ version: (_a = window.next) === null || _a === void 0 ? void 0 : _a.version,
134
+ },
135
+ react: {
136
+ version: React.version,
137
+ },
138
+ });
139
+ };
126
140
 
127
141
  exports.serializeEventsCallbacks = serializeEventsCallbacks;
128
142
  exports.serializeWalletConnectors = serializeWalletConnectors;
@@ -1,4 +1,4 @@
1
- import { useState, useEffect, useMemo } from 'react';
1
+ import { useState, useEffect, useMemo, version } from 'react';
2
2
  import { DynamicError } from '@dynamic-labs/utils';
3
3
  import { sendDynamicProps, fetchProjectSettings } from '../../../data/api.js';
4
4
  import '@dynamic-labs/sdk-api';
@@ -12,8 +12,8 @@ import { PROJECT_SETTINGS_STORAGE_KEY, CONNECTED_WALLETS_INFO } from '../../cons
12
12
  import '../../constants/colors.js';
13
13
  import { LocalStorage } from '../../../shared/utils/classes/storage/localStorage.js';
14
14
  import 'viem';
15
- import { useLocalStorage } from '../../../shared/utils/hooks/useLocalStorage/useLocalStorage.js';
16
15
  import { useEffectOnce } from '../../../shared/utils/hooks/useEffectOnce/useEffectOnce.js';
16
+ import { useLocalStorage } from '../../../shared/utils/hooks/useLocalStorage/useLocalStorage.js';
17
17
  import '../../../shared/consts/index.js';
18
18
  import { validateLocalStorageExpiry } from '../../../context/DynamicContext/validators.js';
19
19
 
@@ -57,6 +57,7 @@ const useFetchProjectSettings = ({ authToken, environmentId, maxRetries = 2, dyn
57
57
  const serializedDynamicContextProps = Object.assign(Object.assign({}, updatedDynamicProps), { settings: Object.assign(Object.assign({}, updatedDynamicProps.settings), { eventsCallbacks: serializedEventsCallbacks, walletConnectors: serializedWalletConnectors }) });
58
58
  sendDynamicProps(environmentId, {
59
59
  dynamicContextProps: serializedDynamicContextProps,
60
+ frameworkSettings: getFrameworkSettings(),
60
61
  });
61
62
  fetchProjectSettings(environmentId)
62
63
  .then((response) => {
@@ -119,5 +120,18 @@ const serializeWalletConnectors = (walletConnectors) => {
119
120
  return undefined;
120
121
  }
121
122
  };
123
+ const getFrameworkSettings = () => {
124
+ var _a;
125
+ return ({
126
+ nextJs: {
127
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
128
+ // @ts-ignore
129
+ version: (_a = window.next) === null || _a === void 0 ? void 0 : _a.version,
130
+ },
131
+ react: {
132
+ version,
133
+ },
134
+ });
135
+ };
122
136
 
123
137
  export { serializeEventsCallbacks, serializeWalletConnectors, useFetchProjectSettings };
@@ -17,10 +17,10 @@ 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
- var isSameWalletName = require('../../functions/isSameWalletName/isSameWalletName.cjs');
21
- var useWalletsConnectionState = require('../useWalletsConnectionState/useWalletsConnectionState.cjs');
22
20
  require('@dynamic-labs/multi-wallet');
23
21
  var getWalletIdentifier = require('../../functions/getWalletIdentifier/getWalletIdentifier.cjs');
22
+ var isSameWalletName = require('../../functions/isSameWalletName/isSameWalletName.cjs');
23
+ var useWalletsConnectionState = require('../useWalletsConnectionState/useWalletsConnectionState.cjs');
24
24
  var reconnectSocialWallet = require('./reconnectSocialWallet.cjs');
25
25
  var createLinkedWalletsFromWalletOptions = require('./utils/createLinkedWalletsFromWalletOptions/createLinkedWalletsFromWalletOptions.cjs');
26
26
  var updateUserWalletsFromLinkedWallets = require('./utils/updateUserWalletsFromLinkedWallets/updateUserWalletsFromLinkedWallets.cjs');
@@ -66,14 +66,14 @@ const useWalletConnectors = ({ authMode, authToken, connectedWallets, walletConn
66
66
  React.useEffect(() => walletsBasedOnAuthMode.forEach((wallet) => {
67
67
  wallet.connector.initEventListener();
68
68
  }), [walletsBasedOnAuthMode]);
69
- const { connectedWalletMap, didConnectedStateLoad } = useWalletsConnectionState.useWalletsConnectionState(walletsBasedOnAuthMode);
70
- const wallets = React.useMemo(() => walletsBasedOnAuthMode.map((wallet) => (Object.assign(Object.assign({}, wallet), { connected: Boolean(connectedWalletMap[getWalletIdentifier.getWalletIdentifier(wallet)]) }))), [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]);
71
71
  const { setUserWallets } = UserWalletsContext.useInternalUserWallets();
72
72
  // Keep userWallets in sync whenever linkedWallets changes
73
73
  React.useEffect(() => {
74
- setUserWallets((userWallets) => didConnectedStateLoad
75
- ? updateUserWalletsFromLinkedWallets.updateUserWalletsFromLinkedWallets(userWallets, wallets)
76
- : userWallets);
74
+ if (!didConnectedStateLoad.current)
75
+ return;
76
+ setUserWallets((userWallets) => updateUserWalletsFromLinkedWallets.updateUserWalletsFromLinkedWallets(userWallets, wallets));
77
77
  }, [didConnectedStateLoad, setUserWallets, wallets]);
78
78
  const primaryWallet = React.useMemo(() => { var _a; return (_a = wallets.find((wallet) => wallet.id === primaryWalletId)) !== null && _a !== void 0 ? _a : null; }, [primaryWalletId, wallets]);
79
79
  const secondaryWallets = React.useMemo(() => canHaveMultipleWalletsConnected
@@ -173,7 +173,7 @@ const useWalletConnectors = ({ authMode, authToken, connectedWallets, walletConn
173
173
  setQrcodeUri,
174
174
  ]);
175
175
  return {
176
- didConnectedStateLoad,
176
+ didConnectedStateLoad: didConnectedStateLoad.current,
177
177
  primaryWallet,
178
178
  secondaryWallets,
179
179
  setPrimaryWallet,
@@ -13,10 +13,10 @@ 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 { isSameWalletName } from '../../functions/isSameWalletName/isSameWalletName.js';
17
- import { useWalletsConnectionState } from '../useWalletsConnectionState/useWalletsConnectionState.js';
18
16
  import '@dynamic-labs/multi-wallet';
19
17
  import { getWalletIdentifier } from '../../functions/getWalletIdentifier/getWalletIdentifier.js';
18
+ import { isSameWalletName } from '../../functions/isSameWalletName/isSameWalletName.js';
19
+ import { useWalletsConnectionState } from '../useWalletsConnectionState/useWalletsConnectionState.js';
20
20
  import { reconnectSocialWallet } from './reconnectSocialWallet.js';
21
21
  import { createLinkedWalletsFromWalletOptions } from './utils/createLinkedWalletsFromWalletOptions/createLinkedWalletsFromWalletOptions.js';
22
22
  import { updateUserWalletsFromLinkedWallets } from './utils/updateUserWalletsFromLinkedWallets/updateUserWalletsFromLinkedWallets.js';
@@ -62,14 +62,14 @@ const useWalletConnectors = ({ authMode, authToken, connectedWallets, walletConn
62
62
  useEffect(() => walletsBasedOnAuthMode.forEach((wallet) => {
63
63
  wallet.connector.initEventListener();
64
64
  }), [walletsBasedOnAuthMode]);
65
- const { connectedWalletMap, didConnectedStateLoad } = useWalletsConnectionState(walletsBasedOnAuthMode);
66
- const wallets = useMemo(() => walletsBasedOnAuthMode.map((wallet) => (Object.assign(Object.assign({}, wallet), { connected: Boolean(connectedWalletMap[getWalletIdentifier(wallet)]) }))), [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]);
67
67
  const { setUserWallets } = useInternalUserWallets();
68
68
  // Keep userWallets in sync whenever linkedWallets changes
69
69
  useEffect(() => {
70
- setUserWallets((userWallets) => didConnectedStateLoad
71
- ? updateUserWalletsFromLinkedWallets(userWallets, wallets)
72
- : userWallets);
70
+ if (!didConnectedStateLoad.current)
71
+ return;
72
+ setUserWallets((userWallets) => updateUserWalletsFromLinkedWallets(userWallets, wallets));
73
73
  }, [didConnectedStateLoad, setUserWallets, wallets]);
74
74
  const primaryWallet = useMemo(() => { var _a; return (_a = wallets.find((wallet) => wallet.id === primaryWalletId)) !== null && _a !== void 0 ? _a : null; }, [primaryWalletId, wallets]);
75
75
  const secondaryWallets = useMemo(() => canHaveMultipleWalletsConnected
@@ -169,7 +169,7 @@ const useWalletConnectors = ({ authMode, authToken, connectedWallets, walletConn
169
169
  setQrcodeUri,
170
170
  ]);
171
171
  return {
172
- didConnectedStateLoad,
172
+ didConnectedStateLoad: didConnectedStateLoad.current,
173
173
  primaryWallet,
174
174
  secondaryWallets,
175
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) {