@broxus/evm-connect 1.12.7 → 1.12.9

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.
@@ -72,6 +72,6 @@ exports.EvmConnectButton = (0, mobx_react_lite_1.observer)(({ disabled, network,
72
72
  typeof trigger === 'function'
73
73
  ? trigger({ connect: standalone ? connect : open, disabled: mergedDisabled })
74
74
  : (React.createElement(react_uikit_1.Button, { "aria-disabled": mergedDisabled, disabled: mergedDisabled, ...restProps, onClick: standalone ? connect : open })),
75
- !standalone && (React.createElement(context_1.EvmWalletProvidersProvider, { agreementsNote: walletProviders?.agreementsNote, network: network, onConnect: close },
75
+ !standalone && (React.createElement(context_1.EvmWalletProvidersProvider, { agreementsNote: walletProviders?.agreementsNote, network: network, recentMetaStorageKey: walletProviders?.recentMetaStorageKey, onConnect: close },
76
76
  React.createElement(EvmConnectDialog_1.EvmConnectDialog, { className: popupClassName, open: isModalShown, type: popupType, onClose: close })))));
77
77
  });
@@ -54,30 +54,27 @@ exports.EvmConnectDialog = (0, mobx_react_lite_1.observer)(({ className, open, t
54
54
  (0, react_uikit_1.removeModalMode)('evm-modal-page');
55
55
  walletProviders.reset();
56
56
  };
57
- const close = () => {
58
- onClose?.();
59
- };
60
57
  React.useEffect(() => {
61
58
  if (open) {
62
59
  (0, react_uikit_1.addModalMode)('evm-modal-page');
63
60
  }
64
61
  }, [open]);
65
62
  // eslint-disable-next-line react-hooks/exhaustive-deps
66
- React.useEffect(() => () => onClosed(), []);
63
+ React.useEffect(() => onClosed, []);
67
64
  if (type === 'drawer') {
68
65
  return (React.createElement(react_uikit_1.Drawer, { className: className, destroyOnClose: true, keyboard: !walletProviders.connectingProvider, maskClosable: !walletProviders.connectingProvider, motion: {
69
66
  motionLeave: true,
70
67
  removeOnLeave: true,
71
68
  // eslint-disable-next-line sort-keys
72
69
  onLeaveEnd: onClosed,
73
- }, open: open, placement: "bottom", push: false, rootClassName: "evm-connect-drawer", onClose: close },
70
+ }, open: open, placement: "bottom", push: false, rootClassName: "evm-connect-drawer", onClose: onClose },
74
71
  React.createElement(react_components_1.Close, { kind: "drawer", ratio: 0.9, onClick: onClose }),
75
72
  React.createElement(react_uikit_1.Component, { className: "uk-drawer-header" },
76
73
  React.createElement(react_uikit_1.Component, { className: "uk-drawer-title" }, intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_TITLE))),
77
74
  React.createElement("div", { className: "uk-drawer-body" },
78
75
  React.createElement(components_1.EvmProvidersDispatcher, null)),
79
- React.createElement(react_uikit_1.Text, { align: "center", className: "uk-drawer-footer uk-margin-top", component: "footer", kind: "meta" }, walletProviders.agreementsNote || intl.formatMessage(intl_1.default.EVM_CONNECT_AGREEMENTS_NOTE))));
76
+ walletProviders.agreementsNote !== false && (React.createElement(react_uikit_1.Text, { align: "center", className: "uk-drawer-footer uk-margin-top", component: "footer", kind: "meta" }, walletProviders.agreementsNote || intl.formatMessage(intl_1.default.EVM_CONNECT_AGREEMENTS_NOTE)))));
80
77
  }
81
- return (React.createElement(react_uikit_1.Modal, { centered: true, className: (0, classnames_1.default)('evm-connect-modal', className), closeIcon: React.createElement(react_components_1.Close, { kind: "modal", ratio: 0.9, onClick: close }), destroyOnClose: true, footer: (React.createElement(react_uikit_1.Text, { align: "center", component: "div", kind: "meta" }, walletProviders.agreementsNote || intl.formatMessage(intl_1.default.EVM_CONNECT_AGREEMENTS_NOTE))), keyboard: !walletProviders.connectingProvider, maskClosable: !walletProviders.connectingProvider, title: intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_TITLE), visible: open, width: 380, onClose: close, onClosed: onClosed },
78
+ return (React.createElement(react_uikit_1.Modal, { centered: true, className: (0, classnames_1.default)('evm-connect-modal', className), closeIcon: React.createElement(react_components_1.Close, { kind: "modal", ratio: 0.9, onClick: onClose }), destroyOnClose: true, footer: walletProviders.agreementsNote !== false && (React.createElement(react_uikit_1.Text, { align: "center", component: "div", kind: "meta" }, walletProviders.agreementsNote || intl.formatMessage(intl_1.default.EVM_CONNECT_AGREEMENTS_NOTE))), keyboard: !walletProviders.connectingProvider, maskClosable: !walletProviders.connectingProvider, title: intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_TITLE), visible: open, width: 380, onClose: onClose, onClosed: onClosed },
82
79
  React.createElement(components_1.EvmProvidersDispatcher, null)));
83
80
  });
@@ -53,7 +53,7 @@ exports.EvmConnector = (0, mobx_react_lite_1.observer)((props) => {
53
53
  const intl = (0, react_intl_1.useIntl)();
54
54
  const walletService = (0, context_1.useEvmWalletService)();
55
55
  const walletProviders = (0, context_1.useEvmWalletProviders)();
56
- const [, setRecentMeta] = (0, hooks_1.useRecentConnectionMeta)(walletProviders.recentMetaStorageKey);
56
+ const [recentMeta, setRecentMeta] = (0, hooks_1.useRecentConnectionMeta)(walletProviders.recentMetaStorageKey);
57
57
  const drop = React.useRef(null);
58
58
  const { changeWalletButtonText = intl.formatMessage(intl_1.default.EVM_CONNECT_CHANGE_WALLET_BTN_TEXT), className, connectButtonShape, connectButtonText = intl.formatMessage(intl_1.default.EVM_CONNECT_CONNECT_BTN_TEXT), connectButtonTrigger, connectButtonType, disconnectButtonText = intl.formatMessage(intl_1.default.EVM_CONNECT_DISCONNECT_BTN_TEXT), network = walletService.network, popupType, suffix, showDropMenu = true, showSubIcon = true, standalone = walletService.providers?.length === 1, warnUnsupportedNetwork = true, } = props;
59
59
  const changeWallet = () => {
@@ -63,9 +63,8 @@ exports.EvmConnector = (0, mobx_react_lite_1.observer)((props) => {
63
63
  if (walletService.hasProvider) {
64
64
  drop.current?.close();
65
65
  await walletService.disconnect();
66
- const recentMeta = (0, hooks_1.getRecentConnectionMeta)();
67
66
  if (recentMeta) {
68
- setRecentMeta({ ...recentMeta, disconnected: true });
67
+ setRecentMeta({ ...recentMeta, disconnected: true }, walletProviders.recentMetaStorageKey);
69
68
  }
70
69
  }
71
70
  };
@@ -105,7 +104,7 @@ exports.EvmConnector = (0, mobx_react_lite_1.observer)((props) => {
105
104
  }) })) })),
106
105
  React.createElement(react_uikit_1.Flex, { alignItems: "center", className: "evm-connect-connector-suffix" },
107
106
  suffix,
108
- walletService.isConnected && showDropMenu && (React.createElement(react_uikit_1.Dropdown, { ref: drop, action: ['click'], hideAction: ['click'], overlayClassName: "evm-connect-dropdown", overlay: (React.createElement(react_uikit_1.List, { className: "uk-margin-remove", size: "large" },
107
+ !isDisconnected && showDropMenu && (React.createElement(react_uikit_1.Dropdown, { ref: drop, action: ['click'], hideAction: ['click'], overlayClassName: "evm-connect-dropdown", overlay: (React.createElement(react_uikit_1.List, { className: "uk-margin-remove", size: "large" },
109
108
  !standalone && (React.createElement(react_uikit_1.List.Item, { key: "connect-wallet" },
110
109
  React.createElement(EvmConnectButton_1.EvmConnectButton, { className: "evm-connect-change-wallet", network: network, popupType: popupType, type: "link", onOpen: changeWallet }, changeWalletButtonText))),
111
110
  React.createElement(react_uikit_1.List.Item, null,
@@ -36,16 +36,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.ConnectionRequest = ConnectionRequest;
39
+ exports.ConnectionRequest = void 0;
40
40
  const react_components_1 = require("@broxus/react-components");
41
41
  const react_uikit_1 = require("@broxus/react-uikit");
42
42
  const classnames_1 = __importDefault(require("classnames"));
43
+ const mobx_react_lite_1 = require("mobx-react-lite");
43
44
  const React = __importStar(require("react"));
44
45
  const react_intl_1 = require("react-intl");
45
46
  const context_1 = require("../../../context");
46
47
  const intl_1 = __importDefault(require("../../../intl"));
47
48
  require("./index.css");
48
- function ConnectionRequest() {
49
+ exports.ConnectionRequest = (0, mobx_react_lite_1.observer)(() => {
49
50
  const intl = (0, react_intl_1.useIntl)();
50
51
  const walletProviders = (0, context_1.useEvmWalletProviders)();
51
52
  const tryAgain = async () => {
@@ -69,6 +70,6 @@ function ConnectionRequest() {
69
70
  })),
70
71
  React.createElement("div", null, intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_NOTE)))) : (React.createElement(react_uikit_1.Text, { align: "center" },
71
72
  React.createElement("h4", { className: "evm-connect-connection-request-title uk-text-danger" }, intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_TITLE)),
72
- React.createElement("div", { className: "uk-margin-small-bottom" }, walletProviders.error.message ? (React.createElement(react_uikit_1.Text, { color: "danger" }, walletProviders.error.message)) : intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_NOTE)),
73
+ React.createElement("div", { className: "uk-margin-small-bottom" }, walletProviders.error.message ? (React.createElement(react_uikit_1.Text, { color: "danger" }, walletProviders.error.message)) : (intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_NOTE))),
73
74
  React.createElement(react_uikit_1.Button, { className: "evm-connect-connection-request-button", type: "default", onClick: tryAgain }, intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_TRY_AGAIN_BTN_TEXT)))))));
74
- }
75
+ });
@@ -66,13 +66,19 @@ exports.ProviderButton = (0, mobx_react_lite_1.observer)((props) => {
66
66
  onSelectProvider?.(providerConfig);
67
67
  }
68
68
  };
69
+ // eslint-disable-next-line max-len
70
+ const isInitializing = providerConfig.connector.isInitializing === undefined || providerConfig.connector.isInitializing;
69
71
  React.useEffect(() => (0, mobx_1.reaction)(() => providerConfig.connector, connector => {
70
72
  if (connector.type !== types_1.EthereumConnectionType.WALLET_CONNECT_V2) {
71
73
  setHasProvider(connector.provider != null);
72
74
  }
73
75
  }, { fireImmediately: true }), [providerConfig.connector]);
74
- if (hasProvider === undefined) {
75
- return (React.createElement(react_uikit_1.Button, { className: "evm-connect-provider-button", disabled: true }, intl.formatMessage(intl_1.default.EVM_CONNECT_INITIALIZING_HINT)));
76
+ if (!hasProvider && isInitializing) {
77
+ return (React.createElement(react_uikit_1.Button, { className: "evm-connect-provider-button", disabled: true },
78
+ React.createElement("span", { className: "tvm-connect-provider-icon" }, typeof providerConfig.info.icon === 'string' ? (React.createElement(react_components_1.TokenIcon, { iconUrl: providerConfig.info.icon, size: 28 })) : providerConfig.info.icon),
79
+ React.createElement("span", { className: "tvm-connect-provider-title" }, intl.formatMessage(intl_1.default.EVM_CONNECT_INITIALIZING_HINT)),
80
+ React.createElement("span", null,
81
+ React.createElement(react_uikit_1.Spinner, { ratio: 0.8 }))));
76
82
  }
77
83
  const ua = (0, js_utils_1.getUserAgent)();
78
84
  const homepage = providerConfig.info.links?.homepage;
@@ -32,17 +32,23 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
35
38
  Object.defineProperty(exports, "__esModule", { value: true });
36
39
  exports.EvmProvidersDispatcher = void 0;
37
40
  const react_uikit_1 = require("@broxus/react-uikit");
38
41
  const mobx_react_lite_1 = require("mobx-react-lite");
39
42
  const React = __importStar(require("react"));
43
+ const react_intl_1 = require("react-intl");
40
44
  const ConnectionRequest_1 = require("../../components/EvmProvidersDispatcher/ConnectionRequest");
41
45
  const ProviderButton_1 = require("../../components/EvmProvidersDispatcher/ProviderButton");
42
46
  const context_1 = require("../../context");
43
47
  const hooks_1 = require("../../hooks");
48
+ const intl_1 = __importDefault(require("../../intl"));
44
49
  require("./index.css");
45
50
  exports.EvmProvidersDispatcher = (0, mobx_react_lite_1.observer)(() => {
51
+ const intl = (0, react_intl_1.useIntl)();
46
52
  const walletService = (0, context_1.useEvmWalletService)();
47
53
  const walletProviders = (0, context_1.useEvmWalletProviders)();
48
54
  const orderedProviders = (0, hooks_1.useOrderedConnections)(walletService.providers ?? []);
@@ -54,6 +60,10 @@ exports.EvmProvidersDispatcher = (0, mobx_react_lite_1.observer)(() => {
54
60
  dispatcher.current.style.height = height ? `${height}px` : '';
55
61
  }
56
62
  }, [walletProviders.connectingProvider, walletProviders.error]);
63
+ if (walletService.providers.length === 0) {
64
+ return (React.createElement("div", { ref: dispatcher, className: "tvm-connect-providers-dispatcher" },
65
+ React.createElement("div", { className: "uk-padding-large" }, intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_NO_PROVIDERS_HINT))));
66
+ }
57
67
  return (React.createElement("div", { ref: dispatcher, className: "evm-connect-providers-dispatcher" },
58
68
  React.createElement("div", { ref: content }, walletProviders.connectingProvider ? (React.createElement(ConnectionRequest_1.ConnectionRequest, null)) : (React.createElement(react_uikit_1.List, { className: "evm-connect-providers-list" }, orderedProviders.map(providerConfig => (React.createElement(react_uikit_1.List.Item, { key: providerConfig.id },
59
69
  React.createElement(ProviderButton_1.ProviderButton, { providerConfig: providerConfig })))))))));
@@ -58,15 +58,16 @@ exports.EvmWalletProvidersProvider = (0, mobx_react_lite_1.observer)(({ agreemen
58
58
  const prevConnector = walletService.connector;
59
59
  const recentMeta = (0, hooks_1.getRecentConnectionMeta)(recentMetaStorageKey);
60
60
  // eslint-disable-next-line no-nested-ternary
61
- const chainParams = network ?? (recentMeta?.chainId
61
+ const networkParams = network ?? (recentMeta?.chainId
62
62
  ? walletService.networks.find(_network => _network.chainId === recentMeta.chainId) ?? 1
63
63
  : 1);
64
- (0, js_utils_1.debug)(`Try to activate ${providerConfig.info.name} connection with chain`, typeof chainParams === 'number' ? chainParams : chainParams.chainId);
65
- await providerConfig.connector?.connect(typeof chainParams === 'number' ? chainParams : (0, utils_1.convertNetworkToChainParams)(chainParams));
66
- if (providerConfig.id !== walletService.providerId) {
67
- await prevConnector?.disconnect(true);
64
+ (0, js_utils_1.debug)(`Try to activate ${providerConfig.info.name} connection with chain`, typeof networkParams === 'number' ? networkParams : networkParams?.chainId);
65
+ await providerConfig.connector?.connect(typeof networkParams === 'number'
66
+ ? networkParams
67
+ : networkParams && (0, utils_1.convertNetworkToChainParams)(networkParams), { onConnect });
68
+ if (walletService.providerId && providerConfig.id !== walletService.providerId) {
69
+ await prevConnector?.disconnect({ force: true });
68
70
  }
69
- await onConnect?.(providerConfig.connector);
70
71
  (0, hooks_1.storeRecentConnectionMeta)({
71
72
  chainId: providerConfig.connector.chainId?.toString(),
72
73
  disconnected: false,
@@ -111,4 +111,8 @@ exports.default = (0, react_intl_1.defineMessages)({
111
111
  defaultMessage: 'Recent',
112
112
  id: 'EVM_CONNECT_DISPATCHER_POPUP_RECENT_HINT',
113
113
  },
114
+ EVM_CONNECT_DISPATCHER_POPUP_NO_PROVIDERS_HINT: {
115
+ defaultMessage: 'It seems that no provider was configured. Please ensure the service settings are correct.',
116
+ id: 'EVM_CONNECT_DISPATCHER_POPUP_NO_PROVIDERS_HINT',
117
+ },
114
118
  });
@@ -8,7 +8,6 @@ interface TriggerProps {
8
8
  connect: VoidFunction;
9
9
  }
10
10
  export interface EvmConnectButtonProps extends ButtonProps {
11
- agreementsNote?: React.ReactNode;
12
11
  className?: string;
13
12
  disabled?: boolean;
14
13
  network?: EvmNetworkConfig;
@@ -36,6 +36,6 @@ export const EvmConnectButton = observer(({ disabled, network, popupClassName, p
36
36
  typeof trigger === 'function'
37
37
  ? trigger({ connect: standalone ? connect : open, disabled: mergedDisabled })
38
38
  : (React.createElement(Button, { "aria-disabled": mergedDisabled, disabled: mergedDisabled, ...restProps, onClick: standalone ? connect : open })),
39
- !standalone && (React.createElement(EvmWalletProvidersProvider, { agreementsNote: walletProviders?.agreementsNote, network: network, onConnect: close },
39
+ !standalone && (React.createElement(EvmWalletProvidersProvider, { agreementsNote: walletProviders?.agreementsNote, network: network, recentMetaStorageKey: walletProviders?.recentMetaStorageKey, onConnect: close },
40
40
  React.createElement(EvmConnectDialog, { className: popupClassName, open: isModalShown, type: popupType, onClose: close })))));
41
41
  });
@@ -15,30 +15,27 @@ export const EvmConnectDialog = observer(({ className, open, type, onClose }) =>
15
15
  removeModalMode('evm-modal-page');
16
16
  walletProviders.reset();
17
17
  };
18
- const close = () => {
19
- onClose?.();
20
- };
21
18
  React.useEffect(() => {
22
19
  if (open) {
23
20
  addModalMode('evm-modal-page');
24
21
  }
25
22
  }, [open]);
26
23
  // eslint-disable-next-line react-hooks/exhaustive-deps
27
- React.useEffect(() => () => onClosed(), []);
24
+ React.useEffect(() => onClosed, []);
28
25
  if (type === 'drawer') {
29
26
  return (React.createElement(Drawer, { className: className, destroyOnClose: true, keyboard: !walletProviders.connectingProvider, maskClosable: !walletProviders.connectingProvider, motion: {
30
27
  motionLeave: true,
31
28
  removeOnLeave: true,
32
29
  // eslint-disable-next-line sort-keys
33
30
  onLeaveEnd: onClosed,
34
- }, open: open, placement: "bottom", push: false, rootClassName: "evm-connect-drawer", onClose: close },
31
+ }, open: open, placement: "bottom", push: false, rootClassName: "evm-connect-drawer", onClose: onClose },
35
32
  React.createElement(Close, { kind: "drawer", ratio: 0.9, onClick: onClose }),
36
33
  React.createElement(Component, { className: "uk-drawer-header" },
37
34
  React.createElement(Component, { className: "uk-drawer-title" }, intl.formatMessage(messages.EVM_CONNECT_DISPATCHER_POPUP_TITLE))),
38
35
  React.createElement("div", { className: "uk-drawer-body" },
39
36
  React.createElement(EvmProvidersDispatcher, null)),
40
- React.createElement(Text, { align: "center", className: "uk-drawer-footer uk-margin-top", component: "footer", kind: "meta" }, walletProviders.agreementsNote || intl.formatMessage(messages.EVM_CONNECT_AGREEMENTS_NOTE))));
37
+ walletProviders.agreementsNote !== false && (React.createElement(Text, { align: "center", className: "uk-drawer-footer uk-margin-top", component: "footer", kind: "meta" }, walletProviders.agreementsNote || intl.formatMessage(messages.EVM_CONNECT_AGREEMENTS_NOTE)))));
41
38
  }
42
- return (React.createElement(Modal, { centered: true, className: classNames('evm-connect-modal', className), closeIcon: React.createElement(Close, { kind: "modal", ratio: 0.9, onClick: close }), destroyOnClose: true, footer: (React.createElement(Text, { align: "center", component: "div", kind: "meta" }, walletProviders.agreementsNote || intl.formatMessage(messages.EVM_CONNECT_AGREEMENTS_NOTE))), keyboard: !walletProviders.connectingProvider, maskClosable: !walletProviders.connectingProvider, title: intl.formatMessage(messages.EVM_CONNECT_DISPATCHER_POPUP_TITLE), visible: open, width: 380, onClose: close, onClosed: onClosed },
39
+ return (React.createElement(Modal, { centered: true, className: classNames('evm-connect-modal', className), closeIcon: React.createElement(Close, { kind: "modal", ratio: 0.9, onClick: onClose }), destroyOnClose: true, footer: walletProviders.agreementsNote !== false && (React.createElement(Text, { align: "center", component: "div", kind: "meta" }, walletProviders.agreementsNote || intl.formatMessage(messages.EVM_CONNECT_AGREEMENTS_NOTE))), keyboard: !walletProviders.connectingProvider, maskClosable: !walletProviders.connectingProvider, title: intl.formatMessage(messages.EVM_CONNECT_DISPATCHER_POPUP_TITLE), visible: open, width: 380, onClose: onClose, onClosed: onClosed },
43
40
  React.createElement(EvmProvidersDispatcher, null)));
44
41
  });
@@ -7,14 +7,14 @@ import * as React from 'react';
7
7
  import { useIntl } from 'react-intl';
8
8
  import { EvmConnectButton } from '../../components/EvmConnectButton';
9
9
  import { useEvmWalletProviders, useEvmWalletService } from '../../context';
10
- import { getRecentConnectionMeta, useRecentConnectionMeta } from '../../hooks';
10
+ import { useRecentConnectionMeta } from '../../hooks';
11
11
  import messages from '../../intl';
12
12
  import './index.css';
13
13
  export const EvmConnector = observer((props) => {
14
14
  const intl = useIntl();
15
15
  const walletService = useEvmWalletService();
16
16
  const walletProviders = useEvmWalletProviders();
17
- const [, setRecentMeta] = useRecentConnectionMeta(walletProviders.recentMetaStorageKey);
17
+ const [recentMeta, setRecentMeta] = useRecentConnectionMeta(walletProviders.recentMetaStorageKey);
18
18
  const drop = React.useRef(null);
19
19
  const { changeWalletButtonText = intl.formatMessage(messages.EVM_CONNECT_CHANGE_WALLET_BTN_TEXT), className, connectButtonShape, connectButtonText = intl.formatMessage(messages.EVM_CONNECT_CONNECT_BTN_TEXT), connectButtonTrigger, connectButtonType, disconnectButtonText = intl.formatMessage(messages.EVM_CONNECT_DISCONNECT_BTN_TEXT), network = walletService.network, popupType, suffix, showDropMenu = true, showSubIcon = true, standalone = walletService.providers?.length === 1, warnUnsupportedNetwork = true, } = props;
20
20
  const changeWallet = () => {
@@ -24,9 +24,8 @@ export const EvmConnector = observer((props) => {
24
24
  if (walletService.hasProvider) {
25
25
  drop.current?.close();
26
26
  await walletService.disconnect();
27
- const recentMeta = getRecentConnectionMeta();
28
27
  if (recentMeta) {
29
- setRecentMeta({ ...recentMeta, disconnected: true });
28
+ setRecentMeta({ ...recentMeta, disconnected: true }, walletProviders.recentMetaStorageKey);
30
29
  }
31
30
  }
32
31
  };
@@ -66,7 +65,7 @@ export const EvmConnector = observer((props) => {
66
65
  }) })) })),
67
66
  React.createElement(Flex, { alignItems: "center", className: "evm-connect-connector-suffix" },
68
67
  suffix,
69
- walletService.isConnected && showDropMenu && (React.createElement(Dropdown, { ref: drop, action: ['click'], hideAction: ['click'], overlayClassName: "evm-connect-dropdown", overlay: (React.createElement(List, { className: "uk-margin-remove", size: "large" },
68
+ !isDisconnected && showDropMenu && (React.createElement(Dropdown, { ref: drop, action: ['click'], hideAction: ['click'], overlayClassName: "evm-connect-dropdown", overlay: (React.createElement(List, { className: "uk-margin-remove", size: "large" },
70
69
  !standalone && (React.createElement(List.Item, { key: "connect-wallet" },
71
70
  React.createElement(EvmConnectButton, { className: "evm-connect-change-wallet", network: network, popupType: popupType, type: "link", onOpen: changeWallet }, changeWalletButtonText))),
72
71
  React.createElement(List.Item, null,
@@ -1,3 +1,5 @@
1
1
  import * as React from 'react';
2
2
  import './index.css';
3
- export declare function ConnectionRequest(): React.JSX.Element;
3
+ export declare const ConnectionRequest: (() => React.JSX.Element) & {
4
+ displayName: string;
5
+ };
@@ -1,12 +1,13 @@
1
1
  import { Icon } from '@broxus/react-components';
2
2
  import { Button, Grid, Text } from '@broxus/react-uikit';
3
3
  import classNames from 'classnames';
4
+ import { observer } from 'mobx-react-lite';
4
5
  import * as React from 'react';
5
6
  import { useIntl } from 'react-intl';
6
7
  import { useEvmWalletProviders } from '../../../context';
7
8
  import messages from '../../../intl';
8
9
  import './index.css';
9
- export function ConnectionRequest() {
10
+ export const ConnectionRequest = observer(() => {
10
11
  const intl = useIntl();
11
12
  const walletProviders = useEvmWalletProviders();
12
13
  const tryAgain = async () => {
@@ -30,6 +31,6 @@ export function ConnectionRequest() {
30
31
  })),
31
32
  React.createElement("div", null, intl.formatMessage(messages.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_NOTE)))) : (React.createElement(Text, { align: "center" },
32
33
  React.createElement("h4", { className: "evm-connect-connection-request-title uk-text-danger" }, intl.formatMessage(messages.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_TITLE)),
33
- React.createElement("div", { className: "uk-margin-small-bottom" }, walletProviders.error.message ? (React.createElement(Text, { color: "danger" }, walletProviders.error.message)) : intl.formatMessage(messages.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_NOTE)),
34
+ React.createElement("div", { className: "uk-margin-small-bottom" }, walletProviders.error.message ? (React.createElement(Text, { color: "danger" }, walletProviders.error.message)) : (intl.formatMessage(messages.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_FAILED_NOTE))),
34
35
  React.createElement(Button, { className: "evm-connect-connection-request-button", type: "default", onClick: tryAgain }, intl.formatMessage(messages.EVM_CONNECT_DISPATCHER_POPUP_REQUEST_TRY_AGAIN_BTN_TEXT)))))));
35
- }
36
+ });
@@ -1,6 +1,6 @@
1
1
  import { camelToSnake, getUserAgent, isMobile } from '@broxus/js-utils';
2
2
  import { TokenIcon } from '@broxus/react-components';
3
- import { Button, Text } from '@broxus/react-uikit';
3
+ import { Button, Spinner, Text } from '@broxus/react-uikit';
4
4
  import { reaction } from 'mobx';
5
5
  import { observer } from 'mobx-react-lite';
6
6
  import * as React from 'react';
@@ -27,13 +27,19 @@ export const ProviderButton = observer((props) => {
27
27
  onSelectProvider?.(providerConfig);
28
28
  }
29
29
  };
30
+ // eslint-disable-next-line max-len
31
+ const isInitializing = providerConfig.connector.isInitializing === undefined || providerConfig.connector.isInitializing;
30
32
  React.useEffect(() => reaction(() => providerConfig.connector, connector => {
31
33
  if (connector.type !== EthereumConnectionType.WALLET_CONNECT_V2) {
32
34
  setHasProvider(connector.provider != null);
33
35
  }
34
36
  }, { fireImmediately: true }), [providerConfig.connector]);
35
- if (hasProvider === undefined) {
36
- return (React.createElement(Button, { className: "evm-connect-provider-button", disabled: true }, intl.formatMessage(messages.EVM_CONNECT_INITIALIZING_HINT)));
37
+ if (!hasProvider && isInitializing) {
38
+ return (React.createElement(Button, { className: "evm-connect-provider-button", disabled: true },
39
+ React.createElement("span", { className: "tvm-connect-provider-icon" }, typeof providerConfig.info.icon === 'string' ? (React.createElement(TokenIcon, { iconUrl: providerConfig.info.icon, size: 28 })) : providerConfig.info.icon),
40
+ React.createElement("span", { className: "tvm-connect-provider-title" }, intl.formatMessage(messages.EVM_CONNECT_INITIALIZING_HINT)),
41
+ React.createElement("span", null,
42
+ React.createElement(Spinner, { ratio: 0.8 }))));
37
43
  }
38
44
  const ua = getUserAgent();
39
45
  const homepage = providerConfig.info.links?.homepage;
@@ -1,12 +1,15 @@
1
1
  import { List } from '@broxus/react-uikit';
2
2
  import { observer } from 'mobx-react-lite';
3
3
  import * as React from 'react';
4
+ import { useIntl } from 'react-intl';
4
5
  import { ConnectionRequest } from '../../components/EvmProvidersDispatcher/ConnectionRequest';
5
6
  import { ProviderButton } from '../../components/EvmProvidersDispatcher/ProviderButton';
6
7
  import { useEvmWalletProviders, useEvmWalletService } from '../../context';
7
8
  import { useOrderedConnections } from '../../hooks';
9
+ import messages from '../../intl';
8
10
  import './index.css';
9
11
  export const EvmProvidersDispatcher = observer(() => {
12
+ const intl = useIntl();
10
13
  const walletService = useEvmWalletService();
11
14
  const walletProviders = useEvmWalletProviders();
12
15
  const orderedProviders = useOrderedConnections(walletService.providers ?? []);
@@ -18,6 +21,10 @@ export const EvmProvidersDispatcher = observer(() => {
18
21
  dispatcher.current.style.height = height ? `${height}px` : '';
19
22
  }
20
23
  }, [walletProviders.connectingProvider, walletProviders.error]);
24
+ if (walletService.providers.length === 0) {
25
+ return (React.createElement("div", { ref: dispatcher, className: "tvm-connect-providers-dispatcher" },
26
+ React.createElement("div", { className: "uk-padding-large" }, intl.formatMessage(messages.EVM_CONNECT_DISPATCHER_POPUP_NO_PROVIDERS_HINT))));
27
+ }
21
28
  return (React.createElement("div", { ref: dispatcher, className: "evm-connect-providers-dispatcher" },
22
29
  React.createElement("div", { ref: content }, walletProviders.connectingProvider ? (React.createElement(ConnectionRequest, null)) : (React.createElement(List, { className: "evm-connect-providers-list" }, orderedProviders.map(providerConfig => (React.createElement(List.Item, { key: providerConfig.id },
23
30
  React.createElement(ProviderButton, { providerConfig: providerConfig })))))))));
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import { type EthereumConnector } from '../core';
3
3
  import { type EvmNetworkConfig, type EvmWalletProviderConfig } from '../types';
4
4
  export interface EvmWalletProvidersContextConsumer {
5
- agreementsNote?: React.ReactNode;
5
+ agreementsNote?: React.ReactNode | false;
6
6
  connect: (providerConfig: EvmWalletProviderConfig) => Promise<void>;
7
7
  connectingProvider?: EvmWalletProviderConfig | null;
8
8
  error?: Error | null;
@@ -11,12 +11,13 @@ export interface EvmWalletProvidersContextConsumer {
11
11
  }
12
12
  export declare const EvmWalletProvidersContext: React.Context<EvmWalletProvidersContextConsumer | null>;
13
13
  export declare function useEvmWalletProviders(): EvmWalletProvidersContextConsumer;
14
- export type EvmWalletProvidersProviderProps = React.PropsWithChildren<{
14
+ interface EvmWalletProvidersProviderProps {
15
15
  agreementsNote?: React.ReactNode;
16
16
  network?: EvmNetworkConfig;
17
17
  recentMetaStorageKey?: string;
18
18
  onConnect?: (connector?: EthereumConnector) => Promise<void> | void;
19
- }>;
20
- export declare const EvmWalletProvidersProvider: (({ agreementsNote, children, network, recentMetaStorageKey, onConnect, }: EvmWalletProvidersProviderProps) => React.JSX.Element) & {
19
+ }
20
+ export declare const EvmWalletProvidersProvider: (({ agreementsNote, children, network, recentMetaStorageKey, onConnect, }: React.PropsWithChildren<EvmWalletProvidersProviderProps>) => React.JSX.Element) & {
21
21
  displayName: string;
22
22
  };
23
+ export {};
@@ -21,15 +21,16 @@ export const EvmWalletProvidersProvider = observer(({ agreementsNote, children,
21
21
  const prevConnector = walletService.connector;
22
22
  const recentMeta = getRecentConnectionMeta(recentMetaStorageKey);
23
23
  // eslint-disable-next-line no-nested-ternary
24
- const chainParams = network ?? (recentMeta?.chainId
24
+ const networkParams = network ?? (recentMeta?.chainId
25
25
  ? walletService.networks.find(_network => _network.chainId === recentMeta.chainId) ?? 1
26
26
  : 1);
27
- debug(`Try to activate ${providerConfig.info.name} connection with chain`, typeof chainParams === 'number' ? chainParams : chainParams.chainId);
28
- await providerConfig.connector?.connect(typeof chainParams === 'number' ? chainParams : convertNetworkToChainParams(chainParams));
29
- if (providerConfig.id !== walletService.providerId) {
30
- await prevConnector?.disconnect(true);
27
+ debug(`Try to activate ${providerConfig.info.name} connection with chain`, typeof networkParams === 'number' ? networkParams : networkParams?.chainId);
28
+ await providerConfig.connector?.connect(typeof networkParams === 'number'
29
+ ? networkParams
30
+ : networkParams && convertNetworkToChainParams(networkParams), { onConnect });
31
+ if (walletService.providerId && providerConfig.id !== walletService.providerId) {
32
+ await prevConnector?.disconnect({ force: true });
31
33
  }
32
- await onConnect?.(providerConfig.connector);
33
34
  storeRecentConnectionMeta({
34
35
  chainId: providerConfig.connector.chainId?.toString(),
35
36
  disconnected: false,
@@ -109,4 +109,8 @@ export default defineMessages({
109
109
  defaultMessage: 'Recent',
110
110
  id: 'EVM_CONNECT_DISPATCHER_POPUP_RECENT_HINT',
111
111
  },
112
+ EVM_CONNECT_DISPATCHER_POPUP_NO_PROVIDERS_HINT: {
113
+ defaultMessage: 'It seems that no provider was configured. Please ensure the service settings are correct.',
114
+ id: 'EVM_CONNECT_DISPATCHER_POPUP_NO_PROVIDERS_HINT',
115
+ },
112
116
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@broxus/evm-connect",
3
- "version": "1.12.7",
3
+ "version": "1.12.9",
4
4
  "description": "Ethereum wallets connector.",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -78,8 +78,8 @@
78
78
  "dependencies": {
79
79
  "@broxus/js-core": "^0.32.1",
80
80
  "@broxus/js-utils": "^1.3.16",
81
- "@broxus/react-components": "^0.23.3",
82
- "@broxus/react-uikit": "^0.19.2",
81
+ "@broxus/react-components": "^0.23.4",
82
+ "@broxus/react-uikit": "^0.19.3",
83
83
  "@metamask/detect-provider": "^2.0.0",
84
84
  "@walletconnect/ethereum-provider": "^2.20.2",
85
85
  "classnames": "^2.5.1"
@@ -96,5 +96,5 @@
96
96
  "web3-types": "^1.x",
97
97
  "web3-utils": "^4.x"
98
98
  },
99
- "gitHead": "ce82ec3a52cf959110c873959c6615b8733070c9"
99
+ "gitHead": "0d38ed5de484717a5fcbc4c831055da0e43a81b7"
100
100
  }