@dynamic-labs/sdk-react-core 2.2.1 → 2.2.3

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 +18 -1
  2. package/package.cjs +1 -1
  3. package/package.js +1 -1
  4. package/package.json +13 -13
  5. package/src/lib/Main.cjs +1 -0
  6. package/src/lib/Main.js +1 -0
  7. package/src/lib/context/DynamicContext/DynamicContext.cjs +2 -1
  8. package/src/lib/context/DynamicContext/DynamicContext.js +2 -1
  9. package/src/lib/context/DynamicContext/hooks/useTieCallbacksToEvents/useTieCallbacksToEvents.cjs +16 -6
  10. package/src/lib/context/DynamicContext/hooks/useTieCallbacksToEvents/useTieCallbacksToEvents.js +16 -6
  11. package/src/lib/context/WidgetRegistry/WidgetRegistryContextProvider.cjs +77 -0
  12. package/src/lib/context/WidgetRegistry/WidgetRegistryContextProvider.d.ts +6 -0
  13. package/src/lib/context/WidgetRegistry/WidgetRegistryContextProvider.js +71 -0
  14. package/src/lib/context/WidgetRegistry/index.d.ts +1 -0
  15. package/src/lib/data/api/wallets/wallets.cjs +2 -1
  16. package/src/lib/data/api/wallets/wallets.d.ts +2 -1
  17. package/src/lib/data/api/wallets/wallets.js +2 -1
  18. package/src/lib/events/dynamicEvents.d.ts +2 -1
  19. package/src/lib/events/multiWallet.d.ts +5 -0
  20. package/src/lib/shared/types/dynamicEventsCallbacks.d.ts +5 -1
  21. package/src/lib/shared/utils/functions/isUserLinkingWallet/isUserLinkingWallet.d.ts +2 -0
  22. package/src/lib/styles/index.shadow.cjs +1 -1
  23. package/src/lib/styles/index.shadow.js +1 -1
  24. package/src/lib/utils/functions/index.d.ts +1 -0
  25. package/src/lib/utils/functions/isPhoneNumberProviderEnabled/index.d.ts +1 -0
  26. package/src/lib/utils/functions/logVerboseTroubleshootingMessage/index.d.ts +1 -0
  27. package/src/lib/utils/functions/logVerboseTroubleshootingMessage/logVerboseTroubleshootingMessage.cjs +27 -0
  28. package/src/lib/utils/functions/logVerboseTroubleshootingMessage/logVerboseTroubleshootingMessage.d.ts +1 -0
  29. package/src/lib/utils/functions/logVerboseTroubleshootingMessage/logVerboseTroubleshootingMessage.js +23 -0
  30. package/src/lib/utils/hooks/events/useDynamicEvents/useDynamicEvents.d.ts +1 -1
  31. package/src/lib/utils/hooks/useHandleUnlinkWallet/useHandleUnlinkWallet.cjs +3 -1
  32. package/src/lib/utils/hooks/useHandleUnlinkWallet/useHandleUnlinkWallet.js +3 -1
  33. package/src/lib/utils/hooks/useMergeUserAccounts/useMergeUserAccounts.cjs +6 -2
  34. package/src/lib/utils/hooks/useMergeUserAccounts/useMergeUserAccounts.js +6 -2
  35. package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.cjs +2 -2
  36. package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.js +2 -2
  37. package/src/lib/utils/hooks/useWalletConnectors/useWalletConnectors.cjs +7 -6
  38. package/src/lib/utils/hooks/useWalletConnectors/useWalletConnectors.js +7 -6
  39. package/src/lib/utils/hooks/useWalletEventListeners/useWalletEventListeners.cjs +44 -27
  40. package/src/lib/utils/hooks/useWalletEventListeners/useWalletEventListeners.js +45 -28
  41. package/src/lib/views/MergeUserAccountsView/MergeUserAccountsView.cjs +4 -14
  42. package/src/lib/views/MergeUserAccountsView/MergeUserAccountsView.js +5 -15
  43. package/src/lib/widgets/DynamicMultiWalletPromptsWidget/DynamicMultiWalletPromptsWidget.cjs +5 -5
  44. package/src/lib/widgets/DynamicMultiWalletPromptsWidget/DynamicMultiWalletPromptsWidget.js +5 -5
  45. package/src/lib/widgets/DynamicWidget/components/DynamicUserProfile/DynamicUserProfile.cjs +4 -1
  46. package/src/lib/widgets/DynamicWidget/components/DynamicUserProfile/DynamicUserProfile.js +4 -1
  47. package/src/lib/widgets/DynamicWidget/prompts/PrimaryNotConnectedModal/PrimaryNotConnectedModal.cjs +1 -1
  48. package/src/lib/widgets/DynamicWidget/prompts/PrimaryNotConnectedModal/PrimaryNotConnectedModal.js +1 -1
@@ -78,3 +78,4 @@ export * from './storeExpiresAt';
78
78
  export * from './getExpiresAt';
79
79
  export * from './getSupportedCountriesForVerificationFromProjectSettings';
80
80
  export * from './getDefaultCountriesIfEmpty';
81
+ export * from './logVerboseTroubleshootingMessage';
@@ -0,0 +1 @@
1
+ export * from './isPhoneNumberProviderEnabled';
@@ -0,0 +1 @@
1
+ export * from './logVerboseTroubleshootingMessage';
@@ -0,0 +1,27 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ require('@dynamic-labs/sdk-api-core');
7
+ var logger = require('../../../shared/logger.cjs');
8
+ require('@dynamic-labs/iconic');
9
+ require('@dynamic-labs/wallet-connector-core');
10
+ require('react/jsx-runtime');
11
+ require('../../../context/ViewContext/ViewContext.cjs');
12
+ require('react');
13
+ require('@dynamic-labs/wallet-book');
14
+ require('../../constants/colors.cjs');
15
+ require('../../constants/values.cjs');
16
+ require('../../../shared/utils/classes/storage/localStorage.cjs');
17
+ require('@dynamic-labs/utils');
18
+ require('../../../shared/consts/index.cjs');
19
+
20
+ // use this in conjuction with dynamic_enableTroubleshootMode to see
21
+ // more verbose logging to help troubleshoot issues
22
+ // i.e: window.dynamic_enableTroubleshootMode = true
23
+ const logVerboseTroubleshootingMessage = (message, ...args) => {
24
+ logger.logger.log(-1, message, ...args);
25
+ };
26
+
27
+ exports.logVerboseTroubleshootingMessage = logVerboseTroubleshootingMessage;
@@ -0,0 +1 @@
1
+ export declare const logVerboseTroubleshootingMessage: (message: string | Error | unknown, ...args: any[]) => void;
@@ -0,0 +1,23 @@
1
+ 'use client'
2
+ import '@dynamic-labs/sdk-api-core';
3
+ import { logger } from '../../../shared/logger.js';
4
+ import '@dynamic-labs/iconic';
5
+ import '@dynamic-labs/wallet-connector-core';
6
+ import 'react/jsx-runtime';
7
+ import '../../../context/ViewContext/ViewContext.js';
8
+ import 'react';
9
+ import '@dynamic-labs/wallet-book';
10
+ import '../../constants/colors.js';
11
+ import '../../constants/values.js';
12
+ import '../../../shared/utils/classes/storage/localStorage.js';
13
+ import '@dynamic-labs/utils';
14
+ import '../../../shared/consts/index.js';
15
+
16
+ // use this in conjuction with dynamic_enableTroubleshootMode to see
17
+ // more verbose logging to help troubleshoot issues
18
+ // i.e: window.dynamic_enableTroubleshootMode = true
19
+ const logVerboseTroubleshootingMessage = (message, ...args) => {
20
+ logger.log(-1, message, ...args);
21
+ };
22
+
23
+ export { logVerboseTroubleshootingMessage };
@@ -2,7 +2,7 @@ import { DynamicEvents } from '../../../../events';
2
2
  import { EventArgs } from '../types';
3
3
  type DynamicEventListener<E extends keyof DynamicEvents> = (...args: EventArgs<DynamicEvents, E>) => void;
4
4
  /** Allows us to subscribe to all dynamicEvents with a hook, even the internal ones */
5
- export declare const useInternalDynamicEvents: <E extends keyof import("../../../../events/auth").AuthEvents | keyof import("../../../../events/ui").UIEvents | keyof import("../../../../events/otp").OTPEvents | keyof import("../../../../events/wallets").WalletEvents | keyof import("../../../../events/passkey").PasskeyEvents | "farcasterConnectCancelled" | keyof import("../../../../events/embeddedWallet").EmbeddedWalletEvents>(event: E, listener: DynamicEventListener<E>) => void;
5
+ export declare const useInternalDynamicEvents: <E extends keyof import("../../../../events/auth").AuthEvents | keyof import("../../../../events/ui").UIEvents | keyof import("../../../../events/otp").OTPEvents | keyof import("../../../../events/wallets").WalletEvents | keyof import("../../../../events/passkey").PasskeyEvents | "farcasterConnectCancelled" | keyof import("../../../../events/embeddedWallet").EmbeddedWalletEvents | "triggerComputePrimaryWalletMultiWalletStateFromAccounts">(event: E, listener: DynamicEventListener<E>) => void;
6
6
  /** Allows subscribing to dynamic events directly inside components with a hook */
7
7
  export declare const useDynamicEvents: <E extends "logout" | "emailVerificationResult" | "walletAdded" | "embeddedWalletCreated">(event: E, listener: DynamicEventListener<E>) => void;
8
8
  export {};
@@ -46,6 +46,9 @@ const useHandleUnlinkWallet = ({ verifiedCredentials, environmentId, primaryWall
46
46
  return;
47
47
  yield wallets.unlinkWallet({
48
48
  environmentId,
49
+ onSuccess: () => {
50
+ removedWalletsIds.current.push(walletId);
51
+ },
49
52
  primaryWalletId: currentPrimaryWalletId,
50
53
  walletId,
51
54
  });
@@ -55,7 +58,6 @@ const useHandleUnlinkWallet = ({ verifiedCredentials, environmentId, primaryWall
55
58
  if (numberOfLinkedWallets === 1) {
56
59
  yield (wallet === null || wallet === void 0 ? void 0 : wallet.connector.endSession());
57
60
  }
58
- removedWalletsIds.current.push(walletId);
59
61
  }), [
60
62
  primaryWalletId,
61
63
  environmentId,
@@ -42,6 +42,9 @@ const useHandleUnlinkWallet = ({ verifiedCredentials, environmentId, primaryWall
42
42
  return;
43
43
  yield unlinkWallet({
44
44
  environmentId,
45
+ onSuccess: () => {
46
+ removedWalletsIds.current.push(walletId);
47
+ },
45
48
  primaryWalletId: currentPrimaryWalletId,
46
49
  walletId,
47
50
  });
@@ -51,7 +54,6 @@ const useHandleUnlinkWallet = ({ verifiedCredentials, environmentId, primaryWall
51
54
  if (numberOfLinkedWallets === 1) {
52
55
  yield (wallet === null || wallet === void 0 ? void 0 : wallet.connector.endSession());
53
56
  }
54
- removedWalletsIds.current.push(walletId);
55
57
  }), [
56
58
  primaryWalletId,
57
59
  environmentId,
@@ -26,7 +26,7 @@ require('@dynamic-labs/store');
26
26
  require('../../../locale/locale.cjs');
27
27
  var user = require('../../../data/api/user/user.cjs');
28
28
  require('../../../context/DynamicContext/DynamicContext.cjs');
29
- require('../../../events/dynamicEvents.cjs');
29
+ var dynamicEvents = require('../../../events/dynamicEvents.cjs');
30
30
  require('../../../context/CaptchaContext/CaptchaContext.cjs');
31
31
  require('../../../context/ErrorContext/ErrorContext.cjs');
32
32
  require('../../../context/AccessDeniedContext/AccessDeniedContext.cjs');
@@ -79,7 +79,7 @@ require('../../../widgets/DynamicWidget/views/ManagePasskeysWidgetView/PasskeyCa
79
79
  var useInternalDynamicContext = require('../../../context/DynamicContext/useDynamicContext/useInternalDynamicContext.cjs');
80
80
 
81
81
  const useMergeUserAccounts = () => {
82
- const { environmentId, setShowAuthFlow } = useInternalDynamicContext.useInternalDynamicContext();
82
+ const { environmentId, setShowAuthFlow, selectedWalletConnector } = useInternalDynamicContext.useInternalDynamicContext();
83
83
  const { addedWalletsIds } = UserWalletsContext.useInternalUserWallets();
84
84
  const mergeUserAccounts = (mergeConflictResolutions) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
85
85
  const user$1 = yield user.verifyMergeUsers(environmentId, mergeConflictResolutions);
@@ -87,6 +87,10 @@ const useMergeUserAccounts = () => {
87
87
  if (walletId) {
88
88
  addedWalletsIds.current.push(walletId);
89
89
  }
90
+ const accounts = yield (selectedWalletConnector === null || selectedWalletConnector === void 0 ? void 0 : selectedWalletConnector.getConnectedAccounts());
91
+ if (accounts === null || accounts === void 0 ? void 0 : accounts.length) {
92
+ dynamicEvents.dynamicEvents.emit('triggerComputePrimaryWalletMultiWalletStateFromAccounts', { accounts });
93
+ }
90
94
  setShowAuthFlow(false);
91
95
  });
92
96
  return {
@@ -22,7 +22,7 @@ import '@dynamic-labs/store';
22
22
  import '../../../locale/locale.js';
23
23
  import { verifyMergeUsers } from '../../../data/api/user/user.js';
24
24
  import '../../../context/DynamicContext/DynamicContext.js';
25
- import '../../../events/dynamicEvents.js';
25
+ import { dynamicEvents } from '../../../events/dynamicEvents.js';
26
26
  import '../../../context/CaptchaContext/CaptchaContext.js';
27
27
  import '../../../context/ErrorContext/ErrorContext.js';
28
28
  import '../../../context/AccessDeniedContext/AccessDeniedContext.js';
@@ -75,7 +75,7 @@ import '../../../widgets/DynamicWidget/views/ManagePasskeysWidgetView/PasskeyCar
75
75
  import { useInternalDynamicContext } from '../../../context/DynamicContext/useDynamicContext/useInternalDynamicContext.js';
76
76
 
77
77
  const useMergeUserAccounts = () => {
78
- const { environmentId, setShowAuthFlow } = useInternalDynamicContext();
78
+ const { environmentId, setShowAuthFlow, selectedWalletConnector } = useInternalDynamicContext();
79
79
  const { addedWalletsIds } = useInternalUserWallets();
80
80
  const mergeUserAccounts = (mergeConflictResolutions) => __awaiter(void 0, void 0, void 0, function* () {
81
81
  const user = yield verifyMergeUsers(environmentId, mergeConflictResolutions);
@@ -83,6 +83,10 @@ const useMergeUserAccounts = () => {
83
83
  if (walletId) {
84
84
  addedWalletsIds.current.push(walletId);
85
85
  }
86
+ const accounts = yield (selectedWalletConnector === null || selectedWalletConnector === void 0 ? void 0 : selectedWalletConnector.getConnectedAccounts());
87
+ if (accounts === null || accounts === void 0 ? void 0 : accounts.length) {
88
+ dynamicEvents.emit('triggerComputePrimaryWalletMultiWalletStateFromAccounts', { accounts });
89
+ }
86
90
  setShowAuthFlow(false);
87
91
  });
88
92
  return {
@@ -107,7 +107,7 @@ const useSocialAccounts = ({ sessionTimeout } = {
107
107
  }, [user === null || user === void 0 ? void 0 : user.verifiedCredentials]);
108
108
  const checkValidOAuthLinking = React.useCallback((provider) => {
109
109
  if (!isSocialKycEnabled.isSocialKycEnabled(projectSettings)) {
110
- handleError(provider, types.SocialOAuthErrorCode.SOCIAL_LINKING_NOT_ENABLED, 'Social linking is not enabled on the dashboard', { raiseAuthFailure: false });
110
+ handleError(provider, types.SocialOAuthErrorCode.SOCIAL_LINKING_NOT_ENABLED, 'Social linking is not enabled in Information Capture on the dashboard', { raiseAuthFailure: false });
111
111
  return false;
112
112
  }
113
113
  const verifiedCredential = verifiedOAuthCredentialsMap[provider];
@@ -118,7 +118,7 @@ const useSocialAccounts = ({ sessionTimeout } = {
118
118
  const oauthProviders = index.getEnabledOAuthProviders(projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers);
119
119
  const oauthProvider = oauthProviders.find((p) => p.provider === provider);
120
120
  if (!oauthProvider) {
121
- handleError(provider, types.SocialOAuthErrorCode.PROVIDER_NOT_ENABLED, `Provider is not enabled on the dashboard: ${provider}`, { raiseAuthFailure: false });
121
+ handleError(provider, types.SocialOAuthErrorCode.PROVIDER_NOT_ENABLED, `Social linking provider is not enabled in Information Capture on the dashboard: ${provider}`, { raiseAuthFailure: false });
122
122
  return false;
123
123
  }
124
124
  return true;
@@ -103,7 +103,7 @@ const useSocialAccounts = ({ sessionTimeout } = {
103
103
  }, [user === null || user === void 0 ? void 0 : user.verifiedCredentials]);
104
104
  const checkValidOAuthLinking = useCallback((provider) => {
105
105
  if (!isSocialKycEnabled(projectSettings)) {
106
- handleError(provider, SocialOAuthErrorCode.SOCIAL_LINKING_NOT_ENABLED, 'Social linking is not enabled on the dashboard', { raiseAuthFailure: false });
106
+ handleError(provider, SocialOAuthErrorCode.SOCIAL_LINKING_NOT_ENABLED, 'Social linking is not enabled in Information Capture on the dashboard', { raiseAuthFailure: false });
107
107
  return false;
108
108
  }
109
109
  const verifiedCredential = verifiedOAuthCredentialsMap[provider];
@@ -114,7 +114,7 @@ const useSocialAccounts = ({ sessionTimeout } = {
114
114
  const oauthProviders = getEnabledOAuthProviders(projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.providers);
115
115
  const oauthProvider = oauthProviders.find((p) => p.provider === provider);
116
116
  if (!oauthProvider) {
117
- handleError(provider, SocialOAuthErrorCode.PROVIDER_NOT_ENABLED, `Provider is not enabled on the dashboard: ${provider}`, { raiseAuthFailure: false });
117
+ handleError(provider, SocialOAuthErrorCode.PROVIDER_NOT_ENABLED, `Social linking provider is not enabled in Information Capture on the dashboard: ${provider}`, { raiseAuthFailure: false });
118
118
  return false;
119
119
  }
120
120
  return true;
@@ -26,6 +26,7 @@ require('viem/chains');
26
26
  require('../../../config/ApiEndpoint.cjs');
27
27
  require('@dynamic-labs/store');
28
28
  require('../../../locale/locale.cjs');
29
+ var logVerboseTroubleshootingMessage = require('../../functions/logVerboseTroubleshootingMessage/logVerboseTroubleshootingMessage.cjs');
29
30
  var useWalletsConnectionState = require('../useWalletsConnectionState/useWalletsConnectionState.cjs');
30
31
  var reconnectSocialWallet = require('./reconnectSocialWallet.cjs');
31
32
  var createLinkedWalletsFromWalletOptions = require('./utils/createLinkedWalletsFromWalletOptions/createLinkedWalletsFromWalletOptions.cjs');
@@ -43,6 +44,7 @@ const useWalletConnectors = ({ authMode, connectedWallets, walletConnectorOption
43
44
  walletConnectorOptions,
44
45
  });
45
46
  }, [user, primaryWalletId, walletConnectorOptions]);
47
+ logVerboseTroubleshootingMessage.logVerboseTroubleshootingMessage('linkedWallets', linkedWallets);
46
48
  const walletsBasedOnAuthMode = React.useMemo(() => {
47
49
  // Before signing the first message we are using connected wallets list
48
50
  // This is because we want the first connected wallet to have events applied by useWalletEventListeners
@@ -62,6 +64,7 @@ const useWalletConnectors = ({ authMode, connectedWallets, walletConnectorOption
62
64
  }
63
65
  return connectedWallets !== null && connectedWallets !== void 0 ? connectedWallets : [];
64
66
  }, [authMode, connectedWallets, linkedWallets, user]);
67
+ logVerboseTroubleshootingMessage.logVerboseTroubleshootingMessage('walletsBasedOnAuthMode', walletsBasedOnAuthMode);
65
68
  /**
66
69
  * This useEffect is temporary.
67
70
  * While the wallet connectors don't use the event emitter, we need to manually
@@ -74,16 +77,14 @@ const useWalletConnectors = ({ authMode, connectedWallets, walletConnectorOption
74
77
  }), [walletsBasedOnAuthMode]);
75
78
  const { connectedWalletsMap, didConnectedStateLoad } = useWalletsConnectionState.useWalletsConnectionState(walletsBasedOnAuthMode);
76
79
  const wallets = React.useMemo(() => walletsBasedOnAuthMode.map((wallet) => (Object.assign(Object.assign({}, wallet), { connected: Boolean(connectedWalletsMap[getWalletIdentifier.getWalletIdentifier(wallet)]) }))), [connectedWalletsMap, walletsBasedOnAuthMode]);
80
+ logVerboseTroubleshootingMessage.logVerboseTroubleshootingMessage('wallets', wallets);
81
+ logVerboseTroubleshootingMessage.logVerboseTroubleshootingMessage('didConnectedStateLoad', didConnectedStateLoad);
77
82
  const { setUserWallets } = UserWalletsContext.useInternalUserWallets();
78
83
  // Keep userWallets in sync whenever linkedWallets changes
79
84
  React.useEffect(() => {
80
- // we don't want to set the user wallets until their connected states have been computed
81
- // but that doesn't matter if the wallets list is empty, and if we return early when
82
- // the wallets list is empty, we'll never set the user wallets correctly after logout
83
- if (!didConnectedStateLoad.current && wallets.length)
84
- return;
85
+ logVerboseTroubleshootingMessage.logVerboseTroubleshootingMessage('[useWalletConnectors] will call setUserWallets', wallets);
85
86
  setUserWallets((userWallets) => updateUserWalletsFromLinkedWallets.updateUserWalletsFromLinkedWallets(userWallets, wallets));
86
- }, [didConnectedStateLoad, setUserWallets, wallets]);
87
+ }, [setUserWallets, wallets]);
87
88
  const primaryWallet = React.useMemo(() => { var _a; return (_a = wallets.find((wallet) => wallet.id === primaryWalletId)) !== null && _a !== void 0 ? _a : null; }, [primaryWalletId, wallets]);
88
89
  const secondaryWallets = React.useMemo(() => canHaveMultipleWalletsConnected
89
90
  ? wallets.filter((wallet) => wallet.id !== primaryWalletId)
@@ -22,6 +22,7 @@ import 'viem/chains';
22
22
  import '../../../config/ApiEndpoint.js';
23
23
  import '@dynamic-labs/store';
24
24
  import '../../../locale/locale.js';
25
+ import { logVerboseTroubleshootingMessage } from '../../functions/logVerboseTroubleshootingMessage/logVerboseTroubleshootingMessage.js';
25
26
  import { useWalletsConnectionState } from '../useWalletsConnectionState/useWalletsConnectionState.js';
26
27
  import { reconnectSocialWallet } from './reconnectSocialWallet.js';
27
28
  import { createLinkedWalletsFromWalletOptions } from './utils/createLinkedWalletsFromWalletOptions/createLinkedWalletsFromWalletOptions.js';
@@ -39,6 +40,7 @@ const useWalletConnectors = ({ authMode, connectedWallets, walletConnectorOption
39
40
  walletConnectorOptions,
40
41
  });
41
42
  }, [user, primaryWalletId, walletConnectorOptions]);
43
+ logVerboseTroubleshootingMessage('linkedWallets', linkedWallets);
42
44
  const walletsBasedOnAuthMode = useMemo(() => {
43
45
  // Before signing the first message we are using connected wallets list
44
46
  // This is because we want the first connected wallet to have events applied by useWalletEventListeners
@@ -58,6 +60,7 @@ const useWalletConnectors = ({ authMode, connectedWallets, walletConnectorOption
58
60
  }
59
61
  return connectedWallets !== null && connectedWallets !== void 0 ? connectedWallets : [];
60
62
  }, [authMode, connectedWallets, linkedWallets, user]);
63
+ logVerboseTroubleshootingMessage('walletsBasedOnAuthMode', walletsBasedOnAuthMode);
61
64
  /**
62
65
  * This useEffect is temporary.
63
66
  * While the wallet connectors don't use the event emitter, we need to manually
@@ -70,16 +73,14 @@ const useWalletConnectors = ({ authMode, connectedWallets, walletConnectorOption
70
73
  }), [walletsBasedOnAuthMode]);
71
74
  const { connectedWalletsMap, didConnectedStateLoad } = useWalletsConnectionState(walletsBasedOnAuthMode);
72
75
  const wallets = useMemo(() => walletsBasedOnAuthMode.map((wallet) => (Object.assign(Object.assign({}, wallet), { connected: Boolean(connectedWalletsMap[getWalletIdentifier(wallet)]) }))), [connectedWalletsMap, walletsBasedOnAuthMode]);
76
+ logVerboseTroubleshootingMessage('wallets', wallets);
77
+ logVerboseTroubleshootingMessage('didConnectedStateLoad', didConnectedStateLoad);
73
78
  const { setUserWallets } = useInternalUserWallets();
74
79
  // Keep userWallets in sync whenever linkedWallets changes
75
80
  useEffect(() => {
76
- // we don't want to set the user wallets until their connected states have been computed
77
- // but that doesn't matter if the wallets list is empty, and if we return early when
78
- // the wallets list is empty, we'll never set the user wallets correctly after logout
79
- if (!didConnectedStateLoad.current && wallets.length)
80
- return;
81
+ logVerboseTroubleshootingMessage('[useWalletConnectors] will call setUserWallets', wallets);
81
82
  setUserWallets((userWallets) => updateUserWalletsFromLinkedWallets(userWallets, wallets));
82
- }, [didConnectedStateLoad, setUserWallets, wallets]);
83
+ }, [setUserWallets, wallets]);
83
84
  const primaryWallet = useMemo(() => { var _a; return (_a = wallets.find((wallet) => wallet.id === primaryWalletId)) !== null && _a !== void 0 ? _a : null; }, [primaryWalletId, wallets]);
84
85
  const secondaryWallets = useMemo(() => canHaveMultipleWalletsConnected
85
86
  ? wallets.filter((wallet) => wallet.id !== primaryWalletId)
@@ -17,7 +17,7 @@ require('../../constants/values.cjs');
17
17
  require('../../../shared/utils/classes/storage/localStorage.cjs');
18
18
  require('@dynamic-labs/utils');
19
19
  require('../../../shared/consts/index.cjs');
20
- require('../../../events/dynamicEvents.cjs');
20
+ var useDynamicEvents = require('../events/useDynamicEvents/useDynamicEvents.cjs');
21
21
  var useWalletConnectorEvent = require('../events/useWalletConnectorEvent/useWalletConnectorEvent.cjs');
22
22
 
23
23
  const useWalletEventListeners = ({ disconnectWallet, handleLogOut, multiWallet, multiWalletWidgetState, primaryWallet, secondaryWallets, selectedWalletConnector, selectedWalletWithAction, setSelectedWalletConnectorKey, setSelectedWalletWithAction, setMultiWalletWidgetState, user, setPrimaryWalletId, authMode, refreshConnectedWallet, }) => {
@@ -32,10 +32,29 @@ const useWalletEventListeners = ({ disconnectWallet, handleLogOut, multiWallet,
32
32
  }
33
33
  refreshConnectedWallet(primaryWallet.id, primaryWallet.connector);
34
34
  });
35
- useWalletConnectorEvent.useWalletConnectorEvent(primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector, 'accountChange', ({ accounts }) => {
36
- logger.logger.debug('primary wallet account change', {
37
- accounts,
38
- });
35
+ const handleAccountChangeWhenAwaitingAccountSwitch = React.useCallback((isPrimaryWallet, newAddress) => {
36
+ const linkedSecondaryWallet = secondaryWallets.find((wallet) => walletConnectorCore.isSameAddress(wallet.address, newAddress, wallet.chain));
37
+ // this means the user is linking a new account, so we need proof of ownership...
38
+ if (!linkedSecondaryWallet) {
39
+ setMultiWalletWidgetState('awaiting_signature', undefined, 'linking_new_wallet');
40
+ if (isPrimaryWallet && primaryWallet) {
41
+ setSelectedWalletConnectorKey(primaryWallet.connector.key);
42
+ }
43
+ return;
44
+ }
45
+ // ...otherwise, the user is switching primary accounts betweeen the same wallet
46
+ setSelectedWalletWithAction(null);
47
+ setPrimaryWalletId(linkedSecondaryWallet.id);
48
+ setMultiWalletWidgetState('idle');
49
+ }, [
50
+ setMultiWalletWidgetState,
51
+ primaryWallet,
52
+ secondaryWallets,
53
+ setSelectedWalletConnectorKey,
54
+ setSelectedWalletWithAction,
55
+ setPrimaryWalletId,
56
+ ]);
57
+ const calculatePrimaryWalletMultiWalletStateFromAccounts = React.useCallback(({ accounts }) => {
39
58
  // change the api here
40
59
  if (!primaryWallet)
41
60
  return;
@@ -74,6 +93,26 @@ const useWalletEventListeners = ({ disconnectWallet, handleLogOut, multiWallet,
74
93
  logger.logger.error(`Unexpected multiWalletWidgetState (${multiWalletWidgetState}) and onAccountChange combination. Resetting state to idle.`);
75
94
  setMultiWalletWidgetState('idle');
76
95
  }
96
+ }, [
97
+ authMode,
98
+ handleAccountChangeWhenAwaitingAccountSwitch,
99
+ multiWallet,
100
+ multiWalletWidgetState,
101
+ primaryWallet,
102
+ refreshConnectedWallet,
103
+ secondaryWallets,
104
+ setMultiWalletWidgetState,
105
+ setPrimaryWalletId,
106
+ setSelectedWalletConnectorKey,
107
+ setSelectedWalletWithAction,
108
+ user,
109
+ ]);
110
+ useDynamicEvents.useInternalDynamicEvents('triggerComputePrimaryWalletMultiWalletStateFromAccounts', calculatePrimaryWalletMultiWalletStateFromAccounts);
111
+ useWalletConnectorEvent.useWalletConnectorEvent(primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector, 'accountChange', ({ accounts }) => {
112
+ logger.logger.debug('primary wallet account change', {
113
+ accounts,
114
+ });
115
+ calculatePrimaryWalletMultiWalletStateFromAccounts({ accounts });
77
116
  });
78
117
  const uniqueNonPrimaryWallets = React.useMemo(() => {
79
118
  const primaryConnector = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector;
@@ -117,28 +156,6 @@ const useWalletEventListeners = ({ disconnectWallet, handleLogOut, multiWallet,
117
156
  }
118
157
  }
119
158
  });
120
- const handleAccountChangeWhenAwaitingAccountSwitch = React.useCallback((isPrimaryWallet, newAddress) => {
121
- const linkedSecondaryWallet = secondaryWallets.find((wallet) => walletConnectorCore.isSameAddress(wallet.address, newAddress, wallet.chain));
122
- // this means the user is linking a new account, so we need proof of ownership...
123
- if (!linkedSecondaryWallet) {
124
- setMultiWalletWidgetState('awaiting_signature', undefined, 'linking_new_wallet');
125
- if (isPrimaryWallet && primaryWallet) {
126
- setSelectedWalletConnectorKey(primaryWallet.connector.key);
127
- }
128
- return;
129
- }
130
- // ...otherwise, the user is switching primary accounts betweeen the same wallet
131
- setSelectedWalletWithAction(null);
132
- setPrimaryWalletId(linkedSecondaryWallet.id);
133
- setMultiWalletWidgetState('idle');
134
- }, [
135
- setMultiWalletWidgetState,
136
- primaryWallet,
137
- secondaryWallets,
138
- setSelectedWalletConnectorKey,
139
- setSelectedWalletWithAction,
140
- setPrimaryWalletId,
141
- ]);
142
159
  };
143
160
 
144
161
  exports.useWalletEventListeners = useWalletEventListeners;
@@ -1,6 +1,6 @@
1
1
  'use client'
2
2
  import { __awaiter } from '../../../../../_virtual/_tslib.js';
3
- import { useMemo, useCallback } from 'react';
3
+ import { useCallback, useMemo } from 'react';
4
4
  import { isSameAddress } from '@dynamic-labs/wallet-connector-core';
5
5
  import '@dynamic-labs/sdk-api-core';
6
6
  import { logger } from '../../../shared/logger.js';
@@ -13,7 +13,7 @@ import '../../constants/values.js';
13
13
  import '../../../shared/utils/classes/storage/localStorage.js';
14
14
  import '@dynamic-labs/utils';
15
15
  import '../../../shared/consts/index.js';
16
- import '../../../events/dynamicEvents.js';
16
+ import { useInternalDynamicEvents } from '../events/useDynamicEvents/useDynamicEvents.js';
17
17
  import { useWalletConnectorEvent } from '../events/useWalletConnectorEvent/useWalletConnectorEvent.js';
18
18
 
19
19
  const useWalletEventListeners = ({ disconnectWallet, handleLogOut, multiWallet, multiWalletWidgetState, primaryWallet, secondaryWallets, selectedWalletConnector, selectedWalletWithAction, setSelectedWalletConnectorKey, setSelectedWalletWithAction, setMultiWalletWidgetState, user, setPrimaryWalletId, authMode, refreshConnectedWallet, }) => {
@@ -28,10 +28,29 @@ const useWalletEventListeners = ({ disconnectWallet, handleLogOut, multiWallet,
28
28
  }
29
29
  refreshConnectedWallet(primaryWallet.id, primaryWallet.connector);
30
30
  });
31
- useWalletConnectorEvent(primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector, 'accountChange', ({ accounts }) => {
32
- logger.debug('primary wallet account change', {
33
- accounts,
34
- });
31
+ const handleAccountChangeWhenAwaitingAccountSwitch = useCallback((isPrimaryWallet, newAddress) => {
32
+ const linkedSecondaryWallet = secondaryWallets.find((wallet) => isSameAddress(wallet.address, newAddress, wallet.chain));
33
+ // this means the user is linking a new account, so we need proof of ownership...
34
+ if (!linkedSecondaryWallet) {
35
+ setMultiWalletWidgetState('awaiting_signature', undefined, 'linking_new_wallet');
36
+ if (isPrimaryWallet && primaryWallet) {
37
+ setSelectedWalletConnectorKey(primaryWallet.connector.key);
38
+ }
39
+ return;
40
+ }
41
+ // ...otherwise, the user is switching primary accounts betweeen the same wallet
42
+ setSelectedWalletWithAction(null);
43
+ setPrimaryWalletId(linkedSecondaryWallet.id);
44
+ setMultiWalletWidgetState('idle');
45
+ }, [
46
+ setMultiWalletWidgetState,
47
+ primaryWallet,
48
+ secondaryWallets,
49
+ setSelectedWalletConnectorKey,
50
+ setSelectedWalletWithAction,
51
+ setPrimaryWalletId,
52
+ ]);
53
+ const calculatePrimaryWalletMultiWalletStateFromAccounts = useCallback(({ accounts }) => {
35
54
  // change the api here
36
55
  if (!primaryWallet)
37
56
  return;
@@ -70,6 +89,26 @@ const useWalletEventListeners = ({ disconnectWallet, handleLogOut, multiWallet,
70
89
  logger.error(`Unexpected multiWalletWidgetState (${multiWalletWidgetState}) and onAccountChange combination. Resetting state to idle.`);
71
90
  setMultiWalletWidgetState('idle');
72
91
  }
92
+ }, [
93
+ authMode,
94
+ handleAccountChangeWhenAwaitingAccountSwitch,
95
+ multiWallet,
96
+ multiWalletWidgetState,
97
+ primaryWallet,
98
+ refreshConnectedWallet,
99
+ secondaryWallets,
100
+ setMultiWalletWidgetState,
101
+ setPrimaryWalletId,
102
+ setSelectedWalletConnectorKey,
103
+ setSelectedWalletWithAction,
104
+ user,
105
+ ]);
106
+ useInternalDynamicEvents('triggerComputePrimaryWalletMultiWalletStateFromAccounts', calculatePrimaryWalletMultiWalletStateFromAccounts);
107
+ useWalletConnectorEvent(primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector, 'accountChange', ({ accounts }) => {
108
+ logger.debug('primary wallet account change', {
109
+ accounts,
110
+ });
111
+ calculatePrimaryWalletMultiWalletStateFromAccounts({ accounts });
73
112
  });
74
113
  const uniqueNonPrimaryWallets = useMemo(() => {
75
114
  const primaryConnector = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector;
@@ -113,28 +152,6 @@ const useWalletEventListeners = ({ disconnectWallet, handleLogOut, multiWallet,
113
152
  }
114
153
  }
115
154
  });
116
- const handleAccountChangeWhenAwaitingAccountSwitch = useCallback((isPrimaryWallet, newAddress) => {
117
- const linkedSecondaryWallet = secondaryWallets.find((wallet) => isSameAddress(wallet.address, newAddress, wallet.chain));
118
- // this means the user is linking a new account, so we need proof of ownership...
119
- if (!linkedSecondaryWallet) {
120
- setMultiWalletWidgetState('awaiting_signature', undefined, 'linking_new_wallet');
121
- if (isPrimaryWallet && primaryWallet) {
122
- setSelectedWalletConnectorKey(primaryWallet.connector.key);
123
- }
124
- return;
125
- }
126
- // ...otherwise, the user is switching primary accounts betweeen the same wallet
127
- setSelectedWalletWithAction(null);
128
- setPrimaryWalletId(linkedSecondaryWallet.id);
129
- setMultiWalletWidgetState('idle');
130
- }, [
131
- setMultiWalletWidgetState,
132
- primaryWallet,
133
- secondaryWallets,
134
- setSelectedWalletConnectorKey,
135
- setSelectedWalletWithAction,
136
- setPrimaryWalletId,
137
- ]);
138
155
  };
139
156
 
140
157
  export { useWalletEventListeners };
@@ -7,22 +7,19 @@ var _tslib = require('../../../../_virtual/_tslib.cjs');
7
7
  var jsxRuntime = require('react/jsx-runtime');
8
8
  var React = require('react');
9
9
  var reactI18next = require('react-i18next');
10
- var walletBook = require('@dynamic-labs/wallet-book');
11
- var iconic = require('@dynamic-labs/iconic');
12
10
  require('../../events/dynamicEvents.cjs');
13
11
  require('@dynamic-labs/utils');
14
12
  require('../../context/DynamicContext/DynamicContext.cjs');
15
13
  require('@dynamic-labs/sdk-api-core');
16
14
  var logger = require('../../shared/logger.cjs');
15
+ require('@dynamic-labs/iconic');
17
16
  require('@dynamic-labs/wallet-connector-core');
18
17
  var ViewContext = require('../../context/ViewContext/ViewContext.cjs');
19
- var add = require('../../shared/assets/add.cjs');
20
- var shortenWalletAddress = require('../../shared/utils/functions/shortenWalletAddress/shortenWalletAddress.cjs');
18
+ require('@dynamic-labs/wallet-book');
21
19
  require('../../utils/constants/colors.cjs');
22
20
  require('../../utils/constants/values.cjs');
23
21
  require('../../shared/utils/classes/storage/localStorage.cjs');
24
22
  require('../../shared/consts/index.cjs');
25
- var useInternalDynamicContext = require('../../context/DynamicContext/useDynamicContext/useInternalDynamicContext.cjs');
26
23
  require('../../context/CaptchaContext/CaptchaContext.cjs');
27
24
  require('../../context/ErrorContext/ErrorContext.cjs');
28
25
  require('@dynamic-labs/multi-wallet');
@@ -83,12 +80,11 @@ require('../../widgets/DynamicWidget/views/ManagePasskeysWidgetView/PasskeyCard/
83
80
  var useMergeUserAccounts = require('../../utils/hooks/useMergeUserAccounts/useMergeUserAccounts.cjs');
84
81
 
85
82
  const MergeUserAccountsView = (props) => {
86
- const { selectedWalletConnector } = useInternalDynamicContext.useInternalDynamicContext();
87
83
  const { setView } = ViewContext.useViewContext();
88
84
  const { mergeUserAccounts } = useMergeUserAccounts.useMergeUserAccounts();
89
85
  const { t } = reactI18next.useTranslation();
90
86
  const [error, setError] = React.useState('');
91
- const { mergeConflicts, walletAddress } = props;
87
+ const { mergeConflicts } = props;
92
88
  const goToConflictsResolutionView = () => {
93
89
  // back button on conflicts resolution view should go back to this view
94
90
  const onConflictsResolutionBackClick = () => {
@@ -112,13 +108,7 @@ const MergeUserAccountsView = (props) => {
112
108
  setError(t('dyn_merge_user_accounts.errors.merge_error'));
113
109
  }
114
110
  });
115
- const renderDuplicatedInfo = () => {
116
- if (walletAddress) {
117
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(walletBook.WalletIcon, { walletKey: selectedWalletConnector === null || selectedWalletConnector === void 0 ? void 0 : selectedWalletConnector.key, className: 'merge-user-accounts__accounts__item__icon' }), jsxRuntime.jsx(Typography.Typography, { variant: 'body_small', weight: 'bold', color: 'secondary', className: 'merge-user-accounts__accounts__item__text', children: shortenWalletAddress.shortenWalletAddress(walletAddress, 3, 3) })] }));
118
- }
119
- return (jsxRuntime.jsx(iconic.UserProfileIcon, { className: 'merge-user-accounts__accounts__item__icon' }));
120
- };
121
- return (jsxRuntime.jsxs("div", { className: 'merge-user-accounts', children: [error && (jsxRuntime.jsx(Alert.Alert, { icon: 'error', variant: 'error', className: 'merge-user-accounts__error', children: error })), jsxRuntime.jsxs("div", { className: 'merge-user-accounts__container', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', weight: 'regular', color: 'secondary', className: 'merge-user-accounts__title', copykey: 'dyn_merge_user_accounts.wallet.content', children: t('dyn_merge_user_accounts.wallet.content') }), jsxRuntime.jsxs("div", { className: 'merge-user-accounts__accounts', children: [jsxRuntime.jsx("div", { className: 'merge-user-accounts__accounts__item', children: renderDuplicatedInfo() }), jsxRuntime.jsxs("div", { className: 'merge-user-accounts__accounts__divider', children: [jsxRuntime.jsx("div", { className: 'merge-user-accounts__accounts__divider__dash' }), jsxRuntime.jsx("div", { className: 'merge-user-accounts__accounts__divider__icon', children: jsxRuntime.jsx(add.ReactComponent, {}) })] }), jsxRuntime.jsx("div", { className: 'merge-user-accounts__accounts__item', children: renderDuplicatedInfo() })] }), jsxRuntime.jsx(TypographyButton.TypographyButton, { onClick: handleMergeConfirm, buttonClassName: 'merge-user-accounts__button', buttonVariant: 'brand-primary', buttonPadding: 'large', typographyProps: {
111
+ return (jsxRuntime.jsxs("div", { className: 'merge-user-accounts', children: [error && (jsxRuntime.jsx(Alert.Alert, { icon: 'error', variant: 'error', className: 'merge-user-accounts__error', children: error })), jsxRuntime.jsxs("div", { className: 'merge-user-accounts__container', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', weight: 'regular', color: 'secondary', className: 'merge-user-accounts__title', copykey: 'dyn_merge_user_accounts.wallet.content', children: t('dyn_merge_user_accounts.wallet.content') }), jsxRuntime.jsx(TypographyButton.TypographyButton, { onClick: handleMergeConfirm, buttonClassName: 'merge-user-accounts__button', buttonVariant: 'brand-primary', buttonPadding: 'large', typographyProps: {
122
112
  color: 'inherit',
123
113
  }, expanded: true, copykey: 'dyn_merge_user_accounts.confirm_button', children: t('dyn_merge_user_accounts.confirm_button') })] })] }));
124
114
  };