@dynamic-labs/sdk-react-core 0.18.0-beta.28 → 0.18.0-beta.30

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 (26) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/package.cjs +1 -1
  3. package/package.js +1 -1
  4. package/package.json +9 -8
  5. package/src/lib/context/DynamicContext/DynamicContext.cjs +8 -8
  6. package/src/lib/context/DynamicContext/DynamicContext.d.ts +0 -2
  7. package/src/lib/context/DynamicContext/DynamicContext.js +8 -8
  8. package/src/lib/utils/hooks/authenticationHooks/useConnectAndSign/useConnectAndSign.cjs +6 -4
  9. package/src/lib/utils/hooks/authenticationHooks/useConnectAndSign/useConnectAndSign.d.ts +3 -1
  10. package/src/lib/utils/hooks/authenticationHooks/useConnectAndSign/useConnectAndSign.js +6 -4
  11. package/src/lib/utils/hooks/index.d.ts +1 -0
  12. package/src/lib/utils/hooks/multiWallet/useMultiWallet/useMultiWallet.cjs +2 -3
  13. package/src/lib/utils/hooks/multiWallet/useMultiWallet/useMultiWallet.d.ts +1 -4
  14. package/src/lib/utils/hooks/multiWallet/useMultiWallet/useMultiWallet.js +2 -3
  15. package/src/lib/utils/hooks/useWalletConnectorEvent/index.d.ts +1 -0
  16. package/src/lib/utils/hooks/useWalletConnectorEvent/useWalletConnectorEvent.cjs +42 -0
  17. package/src/lib/utils/hooks/useWalletConnectorEvent/useWalletConnectorEvent.d.ts +12 -0
  18. package/src/lib/utils/hooks/useWalletConnectorEvent/useWalletConnectorEvent.js +38 -0
  19. package/src/lib/utils/hooks/useWalletConnectors/useWalletConnectors.cjs +12 -0
  20. package/src/lib/utils/hooks/useWalletConnectors/useWalletConnectors.js +12 -0
  21. package/src/lib/utils/hooks/useWalletEventListeners/useWalletEventListeners.cjs +91 -136
  22. package/src/lib/utils/hooks/useWalletEventListeners/useWalletEventListeners.js +92 -137
  23. package/src/lib/views/NetworkNotSupported/NetworkNotSupported.cjs +13 -3
  24. package/src/lib/views/NetworkNotSupported/NetworkNotSupported.js +13 -3
  25. package/src/lib/views/NetworkNotSupportedSwitchManual/NetworkNotSupportedSwitchManual.cjs +13 -3
  26. package/src/lib/views/NetworkNotSupportedSwitchManual/NetworkNotSupportedSwitchManual.js +13 -3
package/CHANGELOG.md CHANGED
@@ -1,4 +1,28 @@
1
1
 
2
+ ## [0.18.0-beta.30](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.0-beta.29...v0.18.0-beta.30) (2023-08-04)
3
+
4
+ ### Bug Fixes
5
+
6
+ * add improves to wallet events handling
7
+
8
+ ## [0.18.0-beta.29](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.0-beta.28...v0.18.0-beta.29) (2023-08-03)
9
+
10
+
11
+ ### ⚠ BREAKING CHANGES
12
+
13
+ * remove deprecated multiwallet prop (#2821)
14
+
15
+ ### Bug Fixes
16
+
17
+ * array of dynamicWagmiSettings not being sent, must be turned into object ([#2837](https://github.com/dynamic-labs/DynamicAuth/issues/2837)) ([fc5051d](https://github.com/dynamic-labs/DynamicAuth/commit/fc5051d3ce4c5e28d54a74cc9d74424748b52df9)), closes [#2835](https://github.com/dynamic-labs/DynamicAuth/issues/2835)
18
+ * change network modal doesn't pop on secondary wallet, when primaryWallet was disconnected ([#2831](https://github.com/dynamic-labs/DynamicAuth/issues/2831)) ([4a78cc8](https://github.com/dynamic-labs/DynamicAuth/commit/4a78cc8c9004e6716fa9e35d8572c57bfd8bdc22))
19
+ * connectSuccess callback is not being called when connecting new wallet after unlink ([#2829](https://github.com/dynamic-labs/DynamicAuth/issues/2829)) ([37795e5](https://github.com/dynamic-labs/DynamicAuth/commit/37795e5304d65766968ae6168d329b899c0afdfa))
20
+ * **wcv2:** simulate chain change event in switchNetwork ([#2827](https://github.com/dynamic-labs/DynamicAuth/issues/2827)) ([98cff76](https://github.com/dynamic-labs/DynamicAuth/commit/98cff7687112ddbf2971fa4e42cc959f5be62014)), closes [#2809](https://github.com/dynamic-labs/DynamicAuth/issues/2809)
21
+ * wrong wallet list is showing after disconnecting and network change ([#2832](https://github.com/dynamic-labs/DynamicAuth/issues/2832)) ([b7af548](https://github.com/dynamic-labs/DynamicAuth/commit/b7af5480a0f05b851cf9accb3ab0870fd2836a92))
22
+
23
+
24
+ * remove deprecated multiwallet prop ([#2821](https://github.com/dynamic-labs/DynamicAuth/issues/2821)) ([d95173d](https://github.com/dynamic-labs/DynamicAuth/commit/d95173de890104b1b94b612976682c9d86ec4b17))
25
+
2
26
  ## [0.18.0-beta.28](https://github.com/dynamic-labs/DynamicAuth/compare/v0.18.0-RC.27...v0.18.0-beta.28) (2023-08-03)
3
27
 
4
28
 
package/package.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var version = "0.18.0-beta.28";
5
+ var version = "0.18.0-beta.30";
6
6
  var dependencies = {
7
7
  "react-focus-lock": "2.9.2",
8
8
  "@dynamic-labs/iconic": "0.1.23",
package/package.js CHANGED
@@ -1,4 +1,4 @@
1
- var version = "0.18.0-beta.28";
1
+ var version = "0.18.0-beta.30";
2
2
  var dependencies = {
3
3
  "react-focus-lock": "2.9.2",
4
4
  "@dynamic-labs/iconic": "0.1.23",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamic-labs/sdk-react-core",
3
- "version": "0.18.0-beta.28",
3
+ "version": "0.18.0-beta.30",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/dynamic-labs/DynamicAuth.git",
@@ -16,13 +16,14 @@
16
16
  "formik": "2.2.9",
17
17
  "qrcode": "1.5.1",
18
18
  "ethers": "5.7.2",
19
- "@dynamic-labs/logger": "0.18.0-beta.28",
20
- "@dynamic-labs/multi-wallet": "0.18.0-beta.28",
21
- "@dynamic-labs/rpc-providers": "0.18.0-beta.28",
22
- "@dynamic-labs/types": "0.18.0-beta.28",
23
- "@dynamic-labs/utils": "0.18.0-beta.28",
24
- "@dynamic-labs/wallet-book": "0.18.0-beta.28",
25
- "@dynamic-labs/wallet-connector-core": "0.18.0-beta.28"
19
+ "@dynamic-labs/logger": "0.18.0-beta.30",
20
+ "@dynamic-labs/multi-wallet": "0.18.0-beta.30",
21
+ "@dynamic-labs/rpc-providers": "0.18.0-beta.30",
22
+ "@dynamic-labs/types": "0.18.0-beta.30",
23
+ "@dynamic-labs/utils": "0.18.0-beta.30",
24
+ "@dynamic-labs/wallet-book": "0.18.0-beta.30",
25
+ "@dynamic-labs/wallet-connector-core": "0.18.0-beta.30",
26
+ "eventemitter3": "5.0.1"
26
27
  },
27
28
  "devDependencies": {
28
29
  "semver": "7.3.8"
@@ -99,7 +99,7 @@ const EMPTY_INITIAL_USER = undefined;
99
99
  const DynamicContext = React.createContext(undefined);
100
100
  const DynamicContextProvider = ({ children, theme, settings, }) => {
101
101
  var _a, _b, _c, _d, _e, _f, _g, _h;
102
- const { accessDeniedMessagePrimary, accessDeniedMessageSecondary, accessDeniedButton, apiBaseUrl, walletsByChain, cssOverrides, defaultNumberOfWalletsToShow = values.DEFAULT_NUMBER_OF_WALLETS_TO_SHOW, flowNetwork, initialAuthenticationMode = 'connect-and-sign', debugError = false, displaySiweStatement = true, newToWeb3WalletChainMap, enableVisitTrackingOnConnectOnly = true, environmentId, localStorageSuffix, eventsCallbacks, evmNetworks, walletsFilter, logLevel = 'WARN', multiWallet: deprecatedMultiWallet, notInTheListImageUrl, onboardingImageUrl, policiesConsentInnerComponent, customPrivacyPolicy, privacyPolicyUrl, signWithEmailWalletName, socialMediaLinkText, socialMediaIconUrl, socialMediaUrl, customTermsOfServices, termsOfServiceUrl, toolkitEnabled, siweStatement, shadowDOMEnabled = true, walletConnectors: walletConnectorsProp, socialProvidersFilter, } = settings;
102
+ const { accessDeniedMessagePrimary, accessDeniedMessageSecondary, accessDeniedButton, apiBaseUrl, walletsByChain, cssOverrides, defaultNumberOfWalletsToShow = values.DEFAULT_NUMBER_OF_WALLETS_TO_SHOW, flowNetwork, initialAuthenticationMode = 'connect-and-sign', debugError = false, displaySiweStatement = true, newToWeb3WalletChainMap, enableVisitTrackingOnConnectOnly = true, environmentId, localStorageSuffix, eventsCallbacks, evmNetworks, walletsFilter, logLevel = 'WARN', notInTheListImageUrl, onboardingImageUrl, policiesConsentInnerComponent, customPrivacyPolicy, privacyPolicyUrl, signWithEmailWalletName, socialMediaLinkText, socialMediaIconUrl, socialMediaUrl, customTermsOfServices, termsOfServiceUrl, toolkitEnabled, siweStatement, shadowDOMEnabled = true, walletConnectors: walletConnectorsProp, socialProvidersFilter, } = settings;
103
103
  let { walletConnectV1Bridge, appLogoUrl = 'https://demo.dynamic.xyz/assets/dynamic-logo.svg', appName = 'Dynamic Example', } = settings;
104
104
  if (!environmentId) {
105
105
  throw new utils.MissingEnvironmentIdError();
@@ -135,10 +135,7 @@ const DynamicContextProvider = ({ children, theme, settings, }) => {
135
135
  dynamicContextProps: { settings },
136
136
  environmentId,
137
137
  });
138
- const { multiWallet, setMultiWallet } = useMultiWallet.useMultiWallet({
139
- deprecatedMultiWallet,
140
- multiWalletSettings: (_b = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _b === void 0 ? void 0 : _b.multiWallet,
141
- });
138
+ const { multiWallet, setMultiWallet } = useMultiWallet.useMultiWallet((_b = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _b === void 0 ? void 0 : _b.multiWallet);
142
139
  // for demo proposes when running single wallet
143
140
  // it should not use bridge even having walletConnectV1Bridge set on settings
144
141
  // but v2 if enabled
@@ -360,9 +357,12 @@ const DynamicContextProvider = ({ children, theme, settings, }) => {
360
357
  user,
361
358
  });
362
359
  const sendWagmiSettings = (settings) => {
363
- api.sendDynamicProps(environmentId, {
364
- dynamicWagmiSettings: settings.dynamicWagmiSettings,
365
- });
360
+ const { dynamicWagmiSettings } = settings;
361
+ if (dynamicWagmiSettings) {
362
+ api.sendDynamicProps(environmentId, {
363
+ dynamicWagmiSettings: { dynamicWagmiSettings },
364
+ });
365
+ }
366
366
  };
367
367
  const clearStatesOnBackClick = React.useCallback(() => _tslib.__awaiter(void 0, void 0, void 0, function* () {
368
368
  setDesktopUri('');
@@ -36,8 +36,6 @@ export interface DynamicContextProps {
36
36
  * @default WARN
37
37
  */
38
38
  logLevel?: keyof typeof LogLevel;
39
- /** @deprecated enable multi wallet in the dashboard settings instead */
40
- multiWallet?: boolean;
41
39
  newToWeb3WalletChainMap?: ChainToWalletMap;
42
40
  notInTheListImageUrl?: string;
43
41
  onboardingImageUrl?: string;
@@ -95,7 +95,7 @@ const EMPTY_INITIAL_USER = undefined;
95
95
  const DynamicContext = createContext(undefined);
96
96
  const DynamicContextProvider = ({ children, theme, settings, }) => {
97
97
  var _a, _b, _c, _d, _e, _f, _g, _h;
98
- const { accessDeniedMessagePrimary, accessDeniedMessageSecondary, accessDeniedButton, apiBaseUrl, walletsByChain, cssOverrides, defaultNumberOfWalletsToShow = DEFAULT_NUMBER_OF_WALLETS_TO_SHOW, flowNetwork, initialAuthenticationMode = 'connect-and-sign', debugError = false, displaySiweStatement = true, newToWeb3WalletChainMap, enableVisitTrackingOnConnectOnly = true, environmentId, localStorageSuffix, eventsCallbacks, evmNetworks, walletsFilter, logLevel = 'WARN', multiWallet: deprecatedMultiWallet, notInTheListImageUrl, onboardingImageUrl, policiesConsentInnerComponent, customPrivacyPolicy, privacyPolicyUrl, signWithEmailWalletName, socialMediaLinkText, socialMediaIconUrl, socialMediaUrl, customTermsOfServices, termsOfServiceUrl, toolkitEnabled, siweStatement, shadowDOMEnabled = true, walletConnectors: walletConnectorsProp, socialProvidersFilter, } = settings;
98
+ const { accessDeniedMessagePrimary, accessDeniedMessageSecondary, accessDeniedButton, apiBaseUrl, walletsByChain, cssOverrides, defaultNumberOfWalletsToShow = DEFAULT_NUMBER_OF_WALLETS_TO_SHOW, flowNetwork, initialAuthenticationMode = 'connect-and-sign', debugError = false, displaySiweStatement = true, newToWeb3WalletChainMap, enableVisitTrackingOnConnectOnly = true, environmentId, localStorageSuffix, eventsCallbacks, evmNetworks, walletsFilter, logLevel = 'WARN', notInTheListImageUrl, onboardingImageUrl, policiesConsentInnerComponent, customPrivacyPolicy, privacyPolicyUrl, signWithEmailWalletName, socialMediaLinkText, socialMediaIconUrl, socialMediaUrl, customTermsOfServices, termsOfServiceUrl, toolkitEnabled, siweStatement, shadowDOMEnabled = true, walletConnectors: walletConnectorsProp, socialProvidersFilter, } = settings;
99
99
  let { walletConnectV1Bridge, appLogoUrl = 'https://demo.dynamic.xyz/assets/dynamic-logo.svg', appName = 'Dynamic Example', } = settings;
100
100
  if (!environmentId) {
101
101
  throw new MissingEnvironmentIdError();
@@ -131,10 +131,7 @@ const DynamicContextProvider = ({ children, theme, settings, }) => {
131
131
  dynamicContextProps: { settings },
132
132
  environmentId,
133
133
  });
134
- const { multiWallet, setMultiWallet } = useMultiWallet({
135
- deprecatedMultiWallet,
136
- multiWalletSettings: (_b = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _b === void 0 ? void 0 : _b.multiWallet,
137
- });
134
+ const { multiWallet, setMultiWallet } = useMultiWallet((_b = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.sdk) === null || _b === void 0 ? void 0 : _b.multiWallet);
138
135
  // for demo proposes when running single wallet
139
136
  // it should not use bridge even having walletConnectV1Bridge set on settings
140
137
  // but v2 if enabled
@@ -356,9 +353,12 @@ const DynamicContextProvider = ({ children, theme, settings, }) => {
356
353
  user,
357
354
  });
358
355
  const sendWagmiSettings = (settings) => {
359
- sendDynamicProps(environmentId, {
360
- dynamicWagmiSettings: settings.dynamicWagmiSettings,
361
- });
356
+ const { dynamicWagmiSettings } = settings;
357
+ if (dynamicWagmiSettings) {
358
+ sendDynamicProps(environmentId, {
359
+ dynamicWagmiSettings: { dynamicWagmiSettings },
360
+ });
361
+ }
362
362
  };
363
363
  const clearStatesOnBackClick = useCallback(() => __awaiter(void 0, void 0, void 0, function* () {
364
364
  setDesktopUri('');
@@ -28,11 +28,11 @@ require('@dynamic-labs/multi-wallet');
28
28
  var isSupportedNetwork = require('../../../functions/isSupportedNetwork/isSupportedNetwork.cjs');
29
29
  var isProgrammableNetworkSwitchSupported = require('../../../functions/isProgrammableNetworkSwitchSupported/isProgrammableNetworkSwitchSupported.cjs');
30
30
 
31
- const useConnectAndSign = () => {
31
+ const useConnectAndSign = ({ shouldUpdateWallets = true } = {}) => {
32
32
  const { setView, goToInitialView } = ViewContext.useViewContext();
33
33
  const { setErrorMessage } = ErrorContext.useErrorContext();
34
34
  const { captchaToken } = CaptchaContext.useCaptchaContext();
35
- const { authMode, connectWallet, consumeNonce, displaySiweStatement, environmentId, projectSettings, setIsSingleWalletAccount, user, walletUiUtils, setCallback, setIsVerificationInProgress, isFullyConnected, } = useInternalDynamicContext.useInternalDynamicContext();
35
+ const { authMode, connectWallet, consumeNonce, displaySiweStatement, environmentId, projectSettings, setIsSingleWalletAccount, user, walletUiUtils, setCallback, setIsVerificationInProgress, isFullyConnected, walletsToConnectByChain, } = useInternalDynamicContext.useInternalDynamicContext();
36
36
  const { handleWalletsToConnect } = useHandleWalletsToConnect.useHandleWalletsToConnect();
37
37
  const verifyWallet = useVerifyWallet.useVerifyWallet({
38
38
  consumeNonce,
@@ -72,8 +72,10 @@ const useConnectAndSign = () => {
72
72
  }
73
73
  if (isConnectOnly.isConnectOnly(user, authMode)) {
74
74
  localStorage.LocalStorage.setToLS(localStorage$1.LAST_USED_WALLET, walletConnector.name);
75
- handleWalletsToConnect();
76
- if (!isFullyConnected) {
75
+ if (shouldUpdateWallets) {
76
+ handleWalletsToConnect();
77
+ }
78
+ if (!isFullyConnected || (walletsToConnectByChain === null || walletsToConnectByChain === void 0 ? void 0 : walletsToConnectByChain.length)) {
77
79
  setCallback('connectSuccess');
78
80
  }
79
81
  return;
@@ -3,5 +3,7 @@ type Props = {
3
3
  fetchPublicAddressOpts?: FetchPublicAddressOpts;
4
4
  walletConnector: WalletConnector;
5
5
  };
6
- export declare const useConnectAndSign: () => ({ walletConnector, fetchPublicAddressOpts, }: Props) => Promise<void>;
6
+ export declare const useConnectAndSign: ({ shouldUpdateWallets }?: {
7
+ shouldUpdateWallets?: boolean | undefined;
8
+ }) => ({ walletConnector, fetchPublicAddressOpts, }: Props) => Promise<void>;
7
9
  export {};
@@ -24,11 +24,11 @@ import '@dynamic-labs/multi-wallet';
24
24
  import { isSupportedNetwork } from '../../../functions/isSupportedNetwork/isSupportedNetwork.js';
25
25
  import { isProgrammableNetworkSwitchSupported } from '../../../functions/isProgrammableNetworkSwitchSupported/isProgrammableNetworkSwitchSupported.js';
26
26
 
27
- const useConnectAndSign = () => {
27
+ const useConnectAndSign = ({ shouldUpdateWallets = true } = {}) => {
28
28
  const { setView, goToInitialView } = useViewContext();
29
29
  const { setErrorMessage } = useErrorContext();
30
30
  const { captchaToken } = useCaptchaContext();
31
- const { authMode, connectWallet, consumeNonce, displaySiweStatement, environmentId, projectSettings, setIsSingleWalletAccount, user, walletUiUtils, setCallback, setIsVerificationInProgress, isFullyConnected, } = useInternalDynamicContext();
31
+ const { authMode, connectWallet, consumeNonce, displaySiweStatement, environmentId, projectSettings, setIsSingleWalletAccount, user, walletUiUtils, setCallback, setIsVerificationInProgress, isFullyConnected, walletsToConnectByChain, } = useInternalDynamicContext();
32
32
  const { handleWalletsToConnect } = useHandleWalletsToConnect();
33
33
  const verifyWallet = useVerifyWallet({
34
34
  consumeNonce,
@@ -68,8 +68,10 @@ const useConnectAndSign = () => {
68
68
  }
69
69
  if (isConnectOnly(user, authMode)) {
70
70
  LocalStorage.setToLS(LAST_USED_WALLET, walletConnector.name);
71
- handleWalletsToConnect();
72
- if (!isFullyConnected) {
71
+ if (shouldUpdateWallets) {
72
+ handleWalletsToConnect();
73
+ }
74
+ if (!isFullyConnected || (walletsToConnectByChain === null || walletsToConnectByChain === void 0 ? void 0 : walletsToConnectByChain.length)) {
73
75
  setCallback('connectSuccess');
74
76
  }
75
77
  return;
@@ -30,3 +30,4 @@ export { useInterval } from './useInterval/useInterval';
30
30
  export { useCountdown } from './useCountdown/useCountdown';
31
31
  export { useValidateSession } from './useValidateSession';
32
32
  export { useEventListener } from './useEventListener';
33
+ export { useWalletConnectorEvent } from './useWalletConnectorEvent';
@@ -4,9 +4,8 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
6
 
7
- const useMultiWallet = ({ deprecatedMultiWallet, multiWalletSettings, }) => {
8
- var _a;
9
- const isMultiWalletEnabled = (_a = deprecatedMultiWallet !== null && deprecatedMultiWallet !== void 0 ? deprecatedMultiWallet : multiWalletSettings) !== null && _a !== void 0 ? _a : false;
7
+ const useMultiWallet = (multiWalletSettings) => {
8
+ const isMultiWalletEnabled = multiWalletSettings !== null && multiWalletSettings !== void 0 ? multiWalletSettings : false;
10
9
  const [multiWallet, setMultiWallet] = React.useState(isMultiWalletEnabled);
11
10
  React.useEffect(() => {
12
11
  setMultiWallet(isMultiWalletEnabled);
@@ -1,8 +1,5 @@
1
1
  /// <reference types="react" />
2
- export declare const useMultiWallet: ({ deprecatedMultiWallet, multiWalletSettings, }: {
3
- deprecatedMultiWallet?: boolean | undefined;
4
- multiWalletSettings?: boolean | undefined;
5
- }) => {
2
+ export declare const useMultiWallet: (multiWalletSettings?: boolean) => {
6
3
  multiWallet: boolean;
7
4
  setMultiWallet: import("react").Dispatch<import("react").SetStateAction<boolean>>;
8
5
  };
@@ -1,8 +1,7 @@
1
1
  import { useState, useEffect } from 'react';
2
2
 
3
- const useMultiWallet = ({ deprecatedMultiWallet, multiWalletSettings, }) => {
4
- var _a;
5
- const isMultiWalletEnabled = (_a = deprecatedMultiWallet !== null && deprecatedMultiWallet !== void 0 ? deprecatedMultiWallet : multiWalletSettings) !== null && _a !== void 0 ? _a : false;
3
+ const useMultiWallet = (multiWalletSettings) => {
4
+ const isMultiWalletEnabled = multiWalletSettings !== null && multiWalletSettings !== void 0 ? multiWalletSettings : false;
6
5
  const [multiWallet, setMultiWallet] = useState(isMultiWalletEnabled);
7
6
  useEffect(() => {
8
7
  setMultiWallet(isMultiWalletEnabled);
@@ -0,0 +1 @@
1
+ export { useWalletConnectorEvent } from './useWalletConnectorEvent';
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+ var useIsomorphicLayoutEffect = require('../useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.cjs');
7
+
8
+ const useWalletConnectorEvent = (eventEmitters, eventName, handler) => {
9
+ const callbackRef = React.useRef(handler);
10
+ useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
11
+ callbackRef.current = handler;
12
+ }, [handler]);
13
+ React.useEffect(() => {
14
+ if (!eventEmitters)
15
+ return;
16
+ const eventEmittersArray = Array.isArray(eventEmitters)
17
+ ? eventEmitters
18
+ : [eventEmitters];
19
+ /**
20
+ * Initialize the event listeners for the wallet connectors
21
+ * to ensure they were initialized before listening to events
22
+ *
23
+ * This will be removed when all wallets are migrated to
24
+ * use the event emitter "emit" method
25
+ *
26
+ * Ticket todo - QNTM-88
27
+ */
28
+ eventEmittersArray.forEach((connector) => connector.initEventListener());
29
+ const uniqueEventEmitters = Array.from(new Set(eventEmittersArray));
30
+ const unsubscribeCallbacks = uniqueEventEmitters.map((emitter) => {
31
+ const callback = (...args) => {
32
+ callbackRef.current(emitter, ...args);
33
+ };
34
+ emitter.on(eventName, callback);
35
+ return () => emitter.off(eventName, callback);
36
+ });
37
+ return () => unsubscribeCallbacks.forEach((unsubscribe) => unsubscribe());
38
+ // eslint-disable-next-line react-hooks/exhaustive-deps
39
+ }, [eventEmitters, eventName]);
40
+ };
41
+
42
+ exports.useWalletConnectorEvent = useWalletConnectorEvent;
@@ -0,0 +1,12 @@
1
+ import { WalletConnector, WalletConnectorEventTypes } from '@dynamic-labs/wallet-connector-core';
2
+ /**
3
+ * This type is a copy of the ArgumentMap type from eventemitter3 package.
4
+ * Is used extract the arguments from a event type.
5
+ * Then we can use the arguments to reconstruct the callback we want
6
+ */
7
+ type ArgumentMap<T extends object> = {
8
+ [K in keyof T]: T[K] extends (...args: any[]) => void ? Parameters<T[K]> : T[K] extends any[] ? T[K] : any[];
9
+ };
10
+ type EventArg<Event extends keyof WalletConnectorEventTypes> = ArgumentMap<WalletConnectorEventTypes>[Extract<Event, keyof WalletConnectorEventTypes>];
11
+ export declare const useWalletConnectorEvent: <Event_1 extends keyof WalletConnectorEventTypes = keyof WalletConnectorEventTypes>(eventEmitters: WalletConnector | WalletConnector[] | undefined, eventName: Event_1, handler: (connector: WalletConnector, ...args: EventArg<Event_1>) => void) => void;
12
+ export {};
@@ -0,0 +1,38 @@
1
+ import { useRef, useEffect } from 'react';
2
+ import { useIsomorphicLayoutEffect } from '../useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.js';
3
+
4
+ const useWalletConnectorEvent = (eventEmitters, eventName, handler) => {
5
+ const callbackRef = useRef(handler);
6
+ useIsomorphicLayoutEffect(() => {
7
+ callbackRef.current = handler;
8
+ }, [handler]);
9
+ useEffect(() => {
10
+ if (!eventEmitters)
11
+ return;
12
+ const eventEmittersArray = Array.isArray(eventEmitters)
13
+ ? eventEmitters
14
+ : [eventEmitters];
15
+ /**
16
+ * Initialize the event listeners for the wallet connectors
17
+ * to ensure they were initialized before listening to events
18
+ *
19
+ * This will be removed when all wallets are migrated to
20
+ * use the event emitter "emit" method
21
+ *
22
+ * Ticket todo - QNTM-88
23
+ */
24
+ eventEmittersArray.forEach((connector) => connector.initEventListener());
25
+ const uniqueEventEmitters = Array.from(new Set(eventEmittersArray));
26
+ const unsubscribeCallbacks = uniqueEventEmitters.map((emitter) => {
27
+ const callback = (...args) => {
28
+ callbackRef.current(emitter, ...args);
29
+ };
30
+ emitter.on(eventName, callback);
31
+ return () => emitter.off(eventName, callback);
32
+ });
33
+ return () => unsubscribeCallbacks.forEach((unsubscribe) => unsubscribe());
34
+ // eslint-disable-next-line react-hooks/exhaustive-deps
35
+ }, [eventEmitters, eventName]);
36
+ };
37
+
38
+ export { useWalletConnectorEvent };
@@ -44,6 +44,18 @@ const useWalletConnectors = ({ authMode, authToken, connectedWallets, wallets: a
44
44
  }
45
45
  return connectedWallets;
46
46
  }, [authMode, connectedWallets, linkedWallets, user, onboardingOnlyJwt]);
47
+ /**
48
+ * This useEffect is temporary.
49
+ * While the wallet connectors don't use the event emitter, we need to manually
50
+ * initialize the bridge between the old event listeners and the new event emitter.
51
+ * When the wallet connectors are migrated to the new event emitter, there will be no
52
+ * need to initialize or teardown event listeners, then we can remove this useEffect.
53
+ * @todo remove this useEffect
54
+ * Ticket todo - QNTM-88
55
+ */
56
+ React.useEffect(() => walletsBasedOnAuthMode.forEach((wallet) => {
57
+ wallet.connector.initEventListener();
58
+ }), [walletsBasedOnAuthMode]);
47
59
  const { connectedWalletMap, computeConnectedStateForWallets, didConnectedStateLoad, } = useWalletsConnectionState.useWalletsConnectionState(walletsBasedOnAuthMode);
48
60
  const wallets = React.useMemo(() => walletsBasedOnAuthMode.map((wallet) => (Object.assign(Object.assign({}, wallet), { connected: Boolean(connectedWalletMap[wallet.id]) }))), [connectedWalletMap, walletsBasedOnAuthMode]);
49
61
  React.useEffect(() => {
@@ -40,6 +40,18 @@ const useWalletConnectors = ({ authMode, authToken, connectedWallets, wallets: a
40
40
  }
41
41
  return connectedWallets;
42
42
  }, [authMode, connectedWallets, linkedWallets, user, onboardingOnlyJwt]);
43
+ /**
44
+ * This useEffect is temporary.
45
+ * While the wallet connectors don't use the event emitter, we need to manually
46
+ * initialize the bridge between the old event listeners and the new event emitter.
47
+ * When the wallet connectors are migrated to the new event emitter, there will be no
48
+ * need to initialize or teardown event listeners, then we can remove this useEffect.
49
+ * @todo remove this useEffect
50
+ * Ticket todo - QNTM-88
51
+ */
52
+ useEffect(() => walletsBasedOnAuthMode.forEach((wallet) => {
53
+ wallet.connector.initEventListener();
54
+ }), [walletsBasedOnAuthMode]);
43
55
  const { connectedWalletMap, computeConnectedStateForWallets, didConnectedStateLoad, } = useWalletsConnectionState(walletsBasedOnAuthMode);
44
56
  const wallets = useMemo(() => walletsBasedOnAuthMode.map((wallet) => (Object.assign(Object.assign({}, wallet), { connected: Boolean(connectedWalletMap[wallet.id]) }))), [connectedWalletMap, walletsBasedOnAuthMode]);
45
57
  useEffect(() => {
@@ -16,8 +16,8 @@ require('../../constants/colors.cjs');
16
16
  require('../../../shared/utils/classes/storage/localStorage.cjs');
17
17
  require('ethers');
18
18
  require('../../../shared/consts/index.cjs');
19
+ var useWalletConnectorEvent = require('../useWalletConnectorEvent/useWalletConnectorEvent.cjs');
19
20
 
20
- const orderedSecondaryWalletAddresses = (wallets) => wallets.map((wallet) => wallet.address).sort();
21
21
  const useWalletEventListeners = ({ computeConnectedStateForWallets, handleLogOut, multiWallet, multiWalletWidgetState, primaryWallet, secondaryWallets, selectedWalletConnector, selectedWalletWithAction, setSelectedWalletConnector, setSelectedWalletWithAction, setMultiWalletWidgetState, user, setPrimaryWalletId, authMode, refreshConnectedWallet, }) => {
22
22
  const [loadingNetwork, setLoadingNetwork] = React.useState(true);
23
23
  const [network, setNetwork] = React.useState(undefined);
@@ -39,31 +39,100 @@ const useWalletEventListeners = ({ computeConnectedStateForWallets, handleLogOut
39
39
  });
40
40
  fetchNetwork();
41
41
  }, [primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.id]);
42
- React.useEffect(() => {
42
+ useWalletConnectorEvent.useWalletConnectorEvent(primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector, 'disconnect', () => {
43
+ logger.logger.debug('primary wallet disconnect');
44
+ handleLogOut();
45
+ });
46
+ useWalletConnectorEvent.useWalletConnectorEvent(primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector, 'chainChange', (_, { chain }) => {
47
+ logger.logger.debug('primary wallet chain change', { chain });
43
48
  if (!primaryWallet) {
44
49
  return;
45
50
  }
46
- const seen = new Set();
47
- addPrimaryWalletEventListeners(seen);
48
- addSecondaryWalletEventListeners(seen);
49
- return () => {
50
- primaryWallet.connector.teardownEventListeners();
51
- for (const wallet of secondaryWallets) {
52
- wallet.connector.teardownEventListeners();
51
+ refreshConnectedWallet(primaryWallet.id, primaryWallet.connector);
52
+ // https://linear.app/dynamic-labs/issue/QNTM-84/breaking-change-rename-network-to-primarywalletnetwork
53
+ if (primaryWallet.chain === 'starknet') {
54
+ setNetwork(chain);
55
+ }
56
+ else {
57
+ setNetwork(parseInt(chain));
58
+ }
59
+ });
60
+ useWalletConnectorEvent.useWalletConnectorEvent(primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector, 'accountChange', (_, { accounts }) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
61
+ logger.logger.debug('primary wallet account change', {
62
+ accounts,
63
+ });
64
+ // change the api here
65
+ if (!primaryWallet)
66
+ return;
67
+ const [newAddress] = accounts;
68
+ const newWallet = secondaryWallets.find((wallet) => walletConnectorCore.isSameAddress(wallet.address, newAddress, wallet.chain));
69
+ if (authMode === 'connect-only') {
70
+ refreshConnectedWallet(primaryWallet.id, primaryWallet.connector);
71
+ return;
72
+ }
73
+ if (walletConnectorCore.isSameAddress(newAddress, primaryWallet.address, primaryWallet.chain)) {
74
+ setMultiWalletWidgetState('idle');
75
+ }
76
+ else if (!multiWallet) {
77
+ yield handleLogOut();
78
+ return;
79
+ }
80
+ else if (multiWalletWidgetState === 'awaiting_account_switch') {
81
+ handleAccountChangeWhenAwaitingAccountSwitch(true, newAddress);
82
+ }
83
+ else if (multiWalletWidgetState === 'idle' && newWallet) {
84
+ setPrimaryWalletId(newWallet.id);
85
+ }
86
+ else if (multiWalletWidgetState === 'idle' && !newWallet) {
87
+ if (user) {
88
+ setMultiWalletWidgetState('detected_new_wallet');
89
+ setSelectedWalletConnector(primaryWallet.connector);
90
+ yield computeConnectedStateForWallets();
91
+ return;
53
92
  }
54
- };
55
- // justification: we don't want to setup event listeners more than needed
56
- // eslint-disable-next-line react-hooks/exhaustive-deps
57
- }, [
58
- user,
59
- primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.address,
60
- primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.id,
61
- multiWalletWidgetState,
62
- // eslint-disable-next-line react-hooks/exhaustive-deps
63
- orderedSecondaryWalletAddresses(secondaryWallets).join(),
64
- selectedWalletConnector === null || selectedWalletConnector === void 0 ? void 0 : selectedWalletConnector.name,
65
- primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector.isInitialized,
66
- ]);
93
+ }
94
+ else {
95
+ logger.logger.error(`Unexpected multiWalletWidgetState (${multiWalletWidgetState}) and onAccountChange combination. Resetting state to idle.`);
96
+ setMultiWalletWidgetState('idle');
97
+ }
98
+ yield computeConnectedStateForWallets();
99
+ }));
100
+ const uniqueNonPrimaryWallets = React.useMemo(() => {
101
+ const primaryConnector = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector;
102
+ const secondaryConnectors = secondaryWallets.map(({ connector }) => connector);
103
+ const allWalletConnectors = new Set([
104
+ ...secondaryConnectors,
105
+ primaryConnector,
106
+ selectedWalletConnector,
107
+ ].filter((connector) => Boolean(connector)));
108
+ if (primaryConnector) {
109
+ allWalletConnectors.delete(primaryConnector);
110
+ }
111
+ return Array.from(allWalletConnectors);
112
+ }, [secondaryWallets, selectedWalletConnector, primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector]);
113
+ useWalletConnectorEvent.useWalletConnectorEvent(uniqueNonPrimaryWallets, 'accountChange', () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
114
+ logger.logger.debug('secondary wallet account change');
115
+ if (authMode === 'connect-only' && secondaryWallets.length) {
116
+ refreshConnectedWallet(secondaryWallets[0].id, secondaryWallets[0].connector);
117
+ return;
118
+ }
119
+ if (multiWalletWidgetState === 'awaiting_account_switch') {
120
+ handleAccountChangeWhenAwaitingAccountSwitch(false, (selectedWalletWithAction === null || selectedWalletWithAction === void 0 ? void 0 : selectedWalletWithAction.wallet.address) || '');
121
+ }
122
+ yield computeConnectedStateForWallets();
123
+ }));
124
+ useWalletConnectorEvent.useWalletConnectorEvent(uniqueNonPrimaryWallets, 'chainChange', () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
125
+ logger.logger.debug('secondary wallet chain change');
126
+ // We should pass the proper walletId here
127
+ if (!secondaryWallets.length) {
128
+ return;
129
+ }
130
+ refreshConnectedWallet(secondaryWallets[0].id, secondaryWallets[0].connector);
131
+ }));
132
+ useWalletConnectorEvent.useWalletConnectorEvent(uniqueNonPrimaryWallets, 'disconnect', () => {
133
+ logger.logger.debug('secondary wallet disconnect');
134
+ computeConnectedStateForWallets();
135
+ });
67
136
  const handleAccountChangeWhenAwaitingAccountSwitch = React.useCallback((isPrimaryWallet, newAddress) => {
68
137
  const linkedSecondaryWallet = secondaryWallets.find((wallet) => walletConnectorCore.isSameAddress(wallet.address, newAddress, wallet.chain));
69
138
  // this means the user is linking a new account, so we need proof of ownership...
@@ -86,120 +155,6 @@ const useWalletEventListeners = ({ computeConnectedStateForWallets, handleLogOut
86
155
  setSelectedWalletWithAction,
87
156
  setPrimaryWalletId,
88
157
  ]);
89
- const addPrimaryWalletEventListeners = React.useCallback((seen) => {
90
- if (!primaryWallet) {
91
- return;
92
- }
93
- seen.add(primaryWallet.connector.name);
94
- primaryWallet.connector.setupEventListeners({
95
- onAccountChange: (accounts) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
96
- const [newAddress] = accounts;
97
- const newWallet = secondaryWallets.find((wallet) => walletConnectorCore.isSameAddress(wallet.address, newAddress, wallet.chain));
98
- if (authMode === 'connect-only') {
99
- refreshConnectedWallet(primaryWallet.id, primaryWallet.connector);
100
- return;
101
- }
102
- if (walletConnectorCore.isSameAddress(newAddress, primaryWallet.address, primaryWallet.chain)) {
103
- setMultiWalletWidgetState('idle');
104
- }
105
- else if (!multiWallet) {
106
- yield handleLogOut();
107
- return;
108
- }
109
- else if (multiWalletWidgetState === 'awaiting_account_switch') {
110
- handleAccountChangeWhenAwaitingAccountSwitch(true, newAddress);
111
- }
112
- else if (multiWalletWidgetState === 'idle' && newWallet) {
113
- setPrimaryWalletId(newWallet.id);
114
- }
115
- else if (multiWalletWidgetState === 'idle' && !newWallet) {
116
- if (user) {
117
- setMultiWalletWidgetState('detected_new_wallet');
118
- setSelectedWalletConnector(primaryWallet.connector);
119
- yield computeConnectedStateForWallets();
120
- return;
121
- }
122
- }
123
- else {
124
- logger.logger.error(`Unexpected multiWalletWidgetState (${multiWalletWidgetState}) and onAccountChange combination. Resetting state to idle.`);
125
- setMultiWalletWidgetState('idle');
126
- }
127
- yield computeConnectedStateForWallets();
128
- }),
129
- onChainChange: (chain) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
130
- if (!primaryWallet) {
131
- return;
132
- }
133
- refreshConnectedWallet(primaryWallet.id, primaryWallet.connector);
134
- // https://linear.app/dynamic-labs/issue/QNTM-84/breaking-change-rename-network-to-primarywalletnetwork
135
- if (primaryWallet.chain === 'starknet') {
136
- setNetwork(chain);
137
- }
138
- else {
139
- setNetwork(parseInt(chain));
140
- }
141
- }),
142
- onDisconnect: handleLogOut,
143
- });
144
- }, [
145
- authMode,
146
- primaryWallet,
147
- setMultiWalletWidgetState,
148
- multiWallet,
149
- user,
150
- computeConnectedStateForWallets,
151
- handleLogOut,
152
- multiWalletWidgetState,
153
- secondaryWallets,
154
- setSelectedWalletConnector,
155
- handleAccountChangeWhenAwaitingAccountSwitch,
156
- setPrimaryWalletId,
157
- refreshConnectedWallet,
158
- ]);
159
- const addSecondaryWalletEventListeners = React.useCallback((seen) => {
160
- const secondaryListeners = {
161
- onAccountChange: () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
162
- if (authMode === 'connect-only' && secondaryWallets.length) {
163
- refreshConnectedWallet(secondaryWallets[0].id, secondaryWallets[0].connector);
164
- return;
165
- }
166
- if (multiWalletWidgetState === 'awaiting_account_switch') {
167
- handleAccountChangeWhenAwaitingAccountSwitch(false, (selectedWalletWithAction === null || selectedWalletWithAction === void 0 ? void 0 : selectedWalletWithAction.wallet.address) || '');
168
- }
169
- yield computeConnectedStateForWallets();
170
- }),
171
- onChainChange: () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
172
- // We should pass the proper walletId here
173
- if (!secondaryWallets.length) {
174
- return;
175
- }
176
- refreshConnectedWallet(secondaryWallets[0].id, secondaryWallets[0].connector);
177
- }),
178
- onDisconnect: () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
179
- yield computeConnectedStateForWallets();
180
- }),
181
- };
182
- if (selectedWalletConnector && !seen.has(selectedWalletConnector.name)) {
183
- seen.add(selectedWalletConnector.name);
184
- selectedWalletConnector.setupEventListeners(secondaryListeners);
185
- }
186
- for (const wallet of secondaryWallets) {
187
- if (seen.has(wallet.connector.name)) {
188
- continue;
189
- }
190
- seen.add(wallet.connector.name);
191
- wallet.connector.setupEventListeners(secondaryListeners);
192
- }
193
- }, [
194
- authMode,
195
- computeConnectedStateForWallets,
196
- selectedWalletConnector,
197
- selectedWalletWithAction,
198
- handleAccountChangeWhenAwaitingAccountSwitch,
199
- multiWalletWidgetState,
200
- secondaryWallets,
201
- refreshConnectedWallet,
202
- ]);
203
158
  return {
204
159
  loadingNetwork,
205
160
  network,
@@ -1,5 +1,5 @@
1
1
  import { __awaiter } from '../../../../../_virtual/_tslib.js';
2
- import { useState, useEffect, useCallback } from 'react';
2
+ import { useState, useEffect, useMemo, useCallback } from 'react';
3
3
  import { isSameAddress } from '@dynamic-labs/wallet-connector-core';
4
4
  import '@dynamic-labs/sdk-api';
5
5
  import { logger } from '../../../shared/logger.js';
@@ -12,8 +12,8 @@ import '../../constants/colors.js';
12
12
  import '../../../shared/utils/classes/storage/localStorage.js';
13
13
  import 'ethers';
14
14
  import '../../../shared/consts/index.js';
15
+ import { useWalletConnectorEvent } from '../useWalletConnectorEvent/useWalletConnectorEvent.js';
15
16
 
16
- const orderedSecondaryWalletAddresses = (wallets) => wallets.map((wallet) => wallet.address).sort();
17
17
  const useWalletEventListeners = ({ computeConnectedStateForWallets, handleLogOut, multiWallet, multiWalletWidgetState, primaryWallet, secondaryWallets, selectedWalletConnector, selectedWalletWithAction, setSelectedWalletConnector, setSelectedWalletWithAction, setMultiWalletWidgetState, user, setPrimaryWalletId, authMode, refreshConnectedWallet, }) => {
18
18
  const [loadingNetwork, setLoadingNetwork] = useState(true);
19
19
  const [network, setNetwork] = useState(undefined);
@@ -35,31 +35,100 @@ const useWalletEventListeners = ({ computeConnectedStateForWallets, handleLogOut
35
35
  });
36
36
  fetchNetwork();
37
37
  }, [primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.id]);
38
- useEffect(() => {
38
+ useWalletConnectorEvent(primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector, 'disconnect', () => {
39
+ logger.debug('primary wallet disconnect');
40
+ handleLogOut();
41
+ });
42
+ useWalletConnectorEvent(primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector, 'chainChange', (_, { chain }) => {
43
+ logger.debug('primary wallet chain change', { chain });
39
44
  if (!primaryWallet) {
40
45
  return;
41
46
  }
42
- const seen = new Set();
43
- addPrimaryWalletEventListeners(seen);
44
- addSecondaryWalletEventListeners(seen);
45
- return () => {
46
- primaryWallet.connector.teardownEventListeners();
47
- for (const wallet of secondaryWallets) {
48
- wallet.connector.teardownEventListeners();
47
+ refreshConnectedWallet(primaryWallet.id, primaryWallet.connector);
48
+ // https://linear.app/dynamic-labs/issue/QNTM-84/breaking-change-rename-network-to-primarywalletnetwork
49
+ if (primaryWallet.chain === 'starknet') {
50
+ setNetwork(chain);
51
+ }
52
+ else {
53
+ setNetwork(parseInt(chain));
54
+ }
55
+ });
56
+ useWalletConnectorEvent(primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector, 'accountChange', (_, { accounts }) => __awaiter(void 0, void 0, void 0, function* () {
57
+ logger.debug('primary wallet account change', {
58
+ accounts,
59
+ });
60
+ // change the api here
61
+ if (!primaryWallet)
62
+ return;
63
+ const [newAddress] = accounts;
64
+ const newWallet = secondaryWallets.find((wallet) => isSameAddress(wallet.address, newAddress, wallet.chain));
65
+ if (authMode === 'connect-only') {
66
+ refreshConnectedWallet(primaryWallet.id, primaryWallet.connector);
67
+ return;
68
+ }
69
+ if (isSameAddress(newAddress, primaryWallet.address, primaryWallet.chain)) {
70
+ setMultiWalletWidgetState('idle');
71
+ }
72
+ else if (!multiWallet) {
73
+ yield handleLogOut();
74
+ return;
75
+ }
76
+ else if (multiWalletWidgetState === 'awaiting_account_switch') {
77
+ handleAccountChangeWhenAwaitingAccountSwitch(true, newAddress);
78
+ }
79
+ else if (multiWalletWidgetState === 'idle' && newWallet) {
80
+ setPrimaryWalletId(newWallet.id);
81
+ }
82
+ else if (multiWalletWidgetState === 'idle' && !newWallet) {
83
+ if (user) {
84
+ setMultiWalletWidgetState('detected_new_wallet');
85
+ setSelectedWalletConnector(primaryWallet.connector);
86
+ yield computeConnectedStateForWallets();
87
+ return;
49
88
  }
50
- };
51
- // justification: we don't want to setup event listeners more than needed
52
- // eslint-disable-next-line react-hooks/exhaustive-deps
53
- }, [
54
- user,
55
- primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.address,
56
- primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.id,
57
- multiWalletWidgetState,
58
- // eslint-disable-next-line react-hooks/exhaustive-deps
59
- orderedSecondaryWalletAddresses(secondaryWallets).join(),
60
- selectedWalletConnector === null || selectedWalletConnector === void 0 ? void 0 : selectedWalletConnector.name,
61
- primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector.isInitialized,
62
- ]);
89
+ }
90
+ else {
91
+ logger.error(`Unexpected multiWalletWidgetState (${multiWalletWidgetState}) and onAccountChange combination. Resetting state to idle.`);
92
+ setMultiWalletWidgetState('idle');
93
+ }
94
+ yield computeConnectedStateForWallets();
95
+ }));
96
+ const uniqueNonPrimaryWallets = useMemo(() => {
97
+ const primaryConnector = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector;
98
+ const secondaryConnectors = secondaryWallets.map(({ connector }) => connector);
99
+ const allWalletConnectors = new Set([
100
+ ...secondaryConnectors,
101
+ primaryConnector,
102
+ selectedWalletConnector,
103
+ ].filter((connector) => Boolean(connector)));
104
+ if (primaryConnector) {
105
+ allWalletConnectors.delete(primaryConnector);
106
+ }
107
+ return Array.from(allWalletConnectors);
108
+ }, [secondaryWallets, selectedWalletConnector, primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector]);
109
+ useWalletConnectorEvent(uniqueNonPrimaryWallets, 'accountChange', () => __awaiter(void 0, void 0, void 0, function* () {
110
+ logger.debug('secondary wallet account change');
111
+ if (authMode === 'connect-only' && secondaryWallets.length) {
112
+ refreshConnectedWallet(secondaryWallets[0].id, secondaryWallets[0].connector);
113
+ return;
114
+ }
115
+ if (multiWalletWidgetState === 'awaiting_account_switch') {
116
+ handleAccountChangeWhenAwaitingAccountSwitch(false, (selectedWalletWithAction === null || selectedWalletWithAction === void 0 ? void 0 : selectedWalletWithAction.wallet.address) || '');
117
+ }
118
+ yield computeConnectedStateForWallets();
119
+ }));
120
+ useWalletConnectorEvent(uniqueNonPrimaryWallets, 'chainChange', () => __awaiter(void 0, void 0, void 0, function* () {
121
+ logger.debug('secondary wallet chain change');
122
+ // We should pass the proper walletId here
123
+ if (!secondaryWallets.length) {
124
+ return;
125
+ }
126
+ refreshConnectedWallet(secondaryWallets[0].id, secondaryWallets[0].connector);
127
+ }));
128
+ useWalletConnectorEvent(uniqueNonPrimaryWallets, 'disconnect', () => {
129
+ logger.debug('secondary wallet disconnect');
130
+ computeConnectedStateForWallets();
131
+ });
63
132
  const handleAccountChangeWhenAwaitingAccountSwitch = useCallback((isPrimaryWallet, newAddress) => {
64
133
  const linkedSecondaryWallet = secondaryWallets.find((wallet) => isSameAddress(wallet.address, newAddress, wallet.chain));
65
134
  // this means the user is linking a new account, so we need proof of ownership...
@@ -82,120 +151,6 @@ const useWalletEventListeners = ({ computeConnectedStateForWallets, handleLogOut
82
151
  setSelectedWalletWithAction,
83
152
  setPrimaryWalletId,
84
153
  ]);
85
- const addPrimaryWalletEventListeners = useCallback((seen) => {
86
- if (!primaryWallet) {
87
- return;
88
- }
89
- seen.add(primaryWallet.connector.name);
90
- primaryWallet.connector.setupEventListeners({
91
- onAccountChange: (accounts) => __awaiter(void 0, void 0, void 0, function* () {
92
- const [newAddress] = accounts;
93
- const newWallet = secondaryWallets.find((wallet) => isSameAddress(wallet.address, newAddress, wallet.chain));
94
- if (authMode === 'connect-only') {
95
- refreshConnectedWallet(primaryWallet.id, primaryWallet.connector);
96
- return;
97
- }
98
- if (isSameAddress(newAddress, primaryWallet.address, primaryWallet.chain)) {
99
- setMultiWalletWidgetState('idle');
100
- }
101
- else if (!multiWallet) {
102
- yield handleLogOut();
103
- return;
104
- }
105
- else if (multiWalletWidgetState === 'awaiting_account_switch') {
106
- handleAccountChangeWhenAwaitingAccountSwitch(true, newAddress);
107
- }
108
- else if (multiWalletWidgetState === 'idle' && newWallet) {
109
- setPrimaryWalletId(newWallet.id);
110
- }
111
- else if (multiWalletWidgetState === 'idle' && !newWallet) {
112
- if (user) {
113
- setMultiWalletWidgetState('detected_new_wallet');
114
- setSelectedWalletConnector(primaryWallet.connector);
115
- yield computeConnectedStateForWallets();
116
- return;
117
- }
118
- }
119
- else {
120
- logger.error(`Unexpected multiWalletWidgetState (${multiWalletWidgetState}) and onAccountChange combination. Resetting state to idle.`);
121
- setMultiWalletWidgetState('idle');
122
- }
123
- yield computeConnectedStateForWallets();
124
- }),
125
- onChainChange: (chain) => __awaiter(void 0, void 0, void 0, function* () {
126
- if (!primaryWallet) {
127
- return;
128
- }
129
- refreshConnectedWallet(primaryWallet.id, primaryWallet.connector);
130
- // https://linear.app/dynamic-labs/issue/QNTM-84/breaking-change-rename-network-to-primarywalletnetwork
131
- if (primaryWallet.chain === 'starknet') {
132
- setNetwork(chain);
133
- }
134
- else {
135
- setNetwork(parseInt(chain));
136
- }
137
- }),
138
- onDisconnect: handleLogOut,
139
- });
140
- }, [
141
- authMode,
142
- primaryWallet,
143
- setMultiWalletWidgetState,
144
- multiWallet,
145
- user,
146
- computeConnectedStateForWallets,
147
- handleLogOut,
148
- multiWalletWidgetState,
149
- secondaryWallets,
150
- setSelectedWalletConnector,
151
- handleAccountChangeWhenAwaitingAccountSwitch,
152
- setPrimaryWalletId,
153
- refreshConnectedWallet,
154
- ]);
155
- const addSecondaryWalletEventListeners = useCallback((seen) => {
156
- const secondaryListeners = {
157
- onAccountChange: () => __awaiter(void 0, void 0, void 0, function* () {
158
- if (authMode === 'connect-only' && secondaryWallets.length) {
159
- refreshConnectedWallet(secondaryWallets[0].id, secondaryWallets[0].connector);
160
- return;
161
- }
162
- if (multiWalletWidgetState === 'awaiting_account_switch') {
163
- handleAccountChangeWhenAwaitingAccountSwitch(false, (selectedWalletWithAction === null || selectedWalletWithAction === void 0 ? void 0 : selectedWalletWithAction.wallet.address) || '');
164
- }
165
- yield computeConnectedStateForWallets();
166
- }),
167
- onChainChange: () => __awaiter(void 0, void 0, void 0, function* () {
168
- // We should pass the proper walletId here
169
- if (!secondaryWallets.length) {
170
- return;
171
- }
172
- refreshConnectedWallet(secondaryWallets[0].id, secondaryWallets[0].connector);
173
- }),
174
- onDisconnect: () => __awaiter(void 0, void 0, void 0, function* () {
175
- yield computeConnectedStateForWallets();
176
- }),
177
- };
178
- if (selectedWalletConnector && !seen.has(selectedWalletConnector.name)) {
179
- seen.add(selectedWalletConnector.name);
180
- selectedWalletConnector.setupEventListeners(secondaryListeners);
181
- }
182
- for (const wallet of secondaryWallets) {
183
- if (seen.has(wallet.connector.name)) {
184
- continue;
185
- }
186
- seen.add(wallet.connector.name);
187
- wallet.connector.setupEventListeners(secondaryListeners);
188
- }
189
- }, [
190
- authMode,
191
- computeConnectedStateForWallets,
192
- selectedWalletConnector,
193
- selectedWalletWithAction,
194
- handleAccountChangeWhenAwaitingAccountSwitch,
195
- multiWalletWidgetState,
196
- secondaryWallets,
197
- refreshConnectedWallet,
198
- ]);
199
154
  return {
200
155
  loadingNetwork,
201
156
  network,
@@ -53,10 +53,12 @@ var SelectNetworkButton = require('../../components/SelectNetworkButton/SelectNe
53
53
  var useApplyWalletConnectorNetwork = require('../../utils/hooks/useApplyWalletConnectorNetwork/useApplyWalletConnectorNetwork.cjs');
54
54
 
55
55
  const NetworkNotSupported = () => {
56
- const { network, onboardingImageUrl, selectedWalletConnector: walletConnector, connectedWallets, primaryWallet, } = useInternalDynamicContext.useInternalDynamicContext();
56
+ const { network, onboardingImageUrl, selectedWalletConnector: walletConnector, connectedWallets, primaryWallet, isFullyConnected, setShowAuthFlow, } = useInternalDynamicContext.useInternalDynamicContext();
57
57
  // Refresh selectedWalletConnector network when primaryWallet or connectedWallets updates
58
58
  const { data: walletConnectorNetwork } = usePromise.usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.getNetwork(), { deps: [primaryWallet, walletConnector, connectedWallets] });
59
- const finishConnectAndSign = useConnectAndSign.useConnectAndSign();
59
+ const finishConnectAndSign = useConnectAndSign.useConnectAndSign({
60
+ shouldUpdateWallets: !isFullyConnected,
61
+ });
60
62
  const [isNetworkPickerOpen, setIsNetworkPickerOpen] = React.useState(false);
61
63
  // Finishes auth flow when wallet switches to proper network
62
64
  React.useEffect(() => {
@@ -64,8 +66,16 @@ const NetworkNotSupported = () => {
64
66
  finishConnectAndSign({
65
67
  walletConnector: walletConnector,
66
68
  });
69
+ // there are two scenarios here, one in not connected state and the other one in connected state.
70
+ // previously we were calling setShowAuthFlow(false) in useHandleWalletsToConnect.
71
+ // now, we don't call it in network-not-supported view, so we need to handle that scenario and close modal here
72
+ // this should be gone, once we're done with the useConnectAndSign hook refactor.
73
+ // TODO: https://linear.app/dynamic-labs/issue/QNTM-117/break-useconnectandsign-hook-to-small-parts
74
+ if (isFullyConnected) {
75
+ setShowAuthFlow(false);
76
+ }
67
77
  }
68
- }, [walletConnectorNetwork]);
78
+ }, [walletConnectorNetwork, setShowAuthFlow, isFullyConnected]);
69
79
  // Updates the contexts 'network' based on the selected wallet connector.
70
80
  // It helps ensure that the 'network' is always in sync with the wallet's actual network,
71
81
  // Prevents 'network' from being 'undefined'.
@@ -49,10 +49,12 @@ import { SelectNetworkButton } from '../../components/SelectNetworkButton/Select
49
49
  import { useApplyWalletConnectorNetwork } from '../../utils/hooks/useApplyWalletConnectorNetwork/useApplyWalletConnectorNetwork.js';
50
50
 
51
51
  const NetworkNotSupported = () => {
52
- const { network, onboardingImageUrl, selectedWalletConnector: walletConnector, connectedWallets, primaryWallet, } = useInternalDynamicContext();
52
+ const { network, onboardingImageUrl, selectedWalletConnector: walletConnector, connectedWallets, primaryWallet, isFullyConnected, setShowAuthFlow, } = useInternalDynamicContext();
53
53
  // Refresh selectedWalletConnector network when primaryWallet or connectedWallets updates
54
54
  const { data: walletConnectorNetwork } = usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.getNetwork(), { deps: [primaryWallet, walletConnector, connectedWallets] });
55
- const finishConnectAndSign = useConnectAndSign();
55
+ const finishConnectAndSign = useConnectAndSign({
56
+ shouldUpdateWallets: !isFullyConnected,
57
+ });
56
58
  const [isNetworkPickerOpen, setIsNetworkPickerOpen] = useState(false);
57
59
  // Finishes auth flow when wallet switches to proper network
58
60
  useEffect(() => {
@@ -60,8 +62,16 @@ const NetworkNotSupported = () => {
60
62
  finishConnectAndSign({
61
63
  walletConnector: walletConnector,
62
64
  });
65
+ // there are two scenarios here, one in not connected state and the other one in connected state.
66
+ // previously we were calling setShowAuthFlow(false) in useHandleWalletsToConnect.
67
+ // now, we don't call it in network-not-supported view, so we need to handle that scenario and close modal here
68
+ // this should be gone, once we're done with the useConnectAndSign hook refactor.
69
+ // TODO: https://linear.app/dynamic-labs/issue/QNTM-117/break-useconnectandsign-hook-to-small-parts
70
+ if (isFullyConnected) {
71
+ setShowAuthFlow(false);
72
+ }
63
73
  }
64
- }, [walletConnectorNetwork]);
74
+ }, [walletConnectorNetwork, setShowAuthFlow, isFullyConnected]);
65
75
  // Updates the contexts 'network' based on the selected wallet connector.
66
76
  // It helps ensure that the 'network' is always in sync with the wallet's actual network,
67
77
  // Prevents 'network' from being 'undefined'.
@@ -54,20 +54,30 @@ var useApplyWalletConnectorNetwork = require('../../utils/hooks/useApplyWalletCo
54
54
  // as the wallet does not support programmatic network change.
55
55
  const NetworkNotSupportedSwitchManual = () => {
56
56
  var _a, _b;
57
- const { user, selectedWalletConnector: walletConnector, connectedWallets, } = useInternalDynamicContext.useInternalDynamicContext();
57
+ const { user, selectedWalletConnector: walletConnector, connectedWallets, isFullyConnected, setShowAuthFlow, } = useInternalDynamicContext.useInternalDynamicContext();
58
58
  // Refresh selectedWalletConnector network when primaryWallet or connectedWallets updates
59
59
  const { data: walletConnectorNetwork } = usePromise.usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.getNetwork(), {
60
60
  deps: [walletConnector, connectedWallets],
61
61
  });
62
- const finishConnectAndSign = useConnectAndSign.useConnectAndSign();
62
+ const finishConnectAndSign = useConnectAndSign.useConnectAndSign({
63
+ shouldUpdateWallets: !isFullyConnected,
64
+ });
63
65
  // Finishes auth flow when wallet switches to proper network
64
66
  React.useEffect(() => {
65
67
  if (isSupportedNetwork.isSupportedNetwork({ network: walletConnectorNetwork, walletConnector })) {
66
68
  finishConnectAndSign({
67
69
  walletConnector: walletConnector,
68
70
  });
71
+ // there are two scenarios here, one in not connected state and the other one in connected state.
72
+ // previously we were calling setShowAuthFlow(false) in useHandleWalletsToConnect.
73
+ // now, we don't call it in network-not-supported view, so we need to handle that scenario and close modal here
74
+ // this should be gone, once we're done with the useConnectAndSign hook refactor.
75
+ // TODO: https://linear.app/dynamic-labs/issue/QNTM-117/break-useconnectandsign-hook-to-small-parts
76
+ if (isFullyConnected) {
77
+ setShowAuthFlow(false);
78
+ }
69
79
  }
70
- }, [walletConnectorNetwork]);
80
+ }, [walletConnectorNetwork, setShowAuthFlow, isFullyConnected]);
71
81
  // Updates the contexts 'network' based on the selected wallet connector.
72
82
  // It helps ensure that the 'network' is always in sync with the wallet's actual network,
73
83
  // Prevents 'network' from being 'undefined'.
@@ -50,20 +50,30 @@ import { useApplyWalletConnectorNetwork } from '../../utils/hooks/useApplyWallet
50
50
  // as the wallet does not support programmatic network change.
51
51
  const NetworkNotSupportedSwitchManual = () => {
52
52
  var _a, _b;
53
- const { user, selectedWalletConnector: walletConnector, connectedWallets, } = useInternalDynamicContext();
53
+ const { user, selectedWalletConnector: walletConnector, connectedWallets, isFullyConnected, setShowAuthFlow, } = useInternalDynamicContext();
54
54
  // Refresh selectedWalletConnector network when primaryWallet or connectedWallets updates
55
55
  const { data: walletConnectorNetwork } = usePromise(() => walletConnector === null || walletConnector === void 0 ? void 0 : walletConnector.getNetwork(), {
56
56
  deps: [walletConnector, connectedWallets],
57
57
  });
58
- const finishConnectAndSign = useConnectAndSign();
58
+ const finishConnectAndSign = useConnectAndSign({
59
+ shouldUpdateWallets: !isFullyConnected,
60
+ });
59
61
  // Finishes auth flow when wallet switches to proper network
60
62
  useEffect(() => {
61
63
  if (isSupportedNetwork({ network: walletConnectorNetwork, walletConnector })) {
62
64
  finishConnectAndSign({
63
65
  walletConnector: walletConnector,
64
66
  });
67
+ // there are two scenarios here, one in not connected state and the other one in connected state.
68
+ // previously we were calling setShowAuthFlow(false) in useHandleWalletsToConnect.
69
+ // now, we don't call it in network-not-supported view, so we need to handle that scenario and close modal here
70
+ // this should be gone, once we're done with the useConnectAndSign hook refactor.
71
+ // TODO: https://linear.app/dynamic-labs/issue/QNTM-117/break-useconnectandsign-hook-to-small-parts
72
+ if (isFullyConnected) {
73
+ setShowAuthFlow(false);
74
+ }
65
75
  }
66
- }, [walletConnectorNetwork]);
76
+ }, [walletConnectorNetwork, setShowAuthFlow, isFullyConnected]);
67
77
  // Updates the contexts 'network' based on the selected wallet connector.
68
78
  // It helps ensure that the 'network' is always in sync with the wallet's actual network,
69
79
  // Prevents 'network' from being 'undefined'.