@broxus/evm-connect 1.12.8 → 1.13.0
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.
- package/dist/index.cjs.js +2 -2
- package/dist/index.esm.js +2 -2
- package/lib/cjs/components/EvmConnectDialog/index.js +4 -7
- package/lib/cjs/components/EvmConnector/index.js +2 -3
- package/lib/cjs/components/EvmProvidersDispatcher/ConnectionRequest/index.js +5 -4
- package/lib/cjs/components/EvmProvidersDispatcher/ProviderButton/index.js +9 -4
- package/lib/cjs/components/EvmProvidersDispatcher/index.js +12 -1
- package/lib/cjs/context/EvmWalletProvidersContext.js +7 -6
- package/lib/cjs/hooks/useRecentConnectionMeta.js +8 -4
- package/lib/cjs/intl/index.js +4 -0
- package/lib/esm/components/EvmConnectButton/index.d.ts +0 -1
- package/lib/esm/components/EvmConnectDialog/index.js +4 -7
- package/lib/esm/components/EvmConnector/index.js +3 -4
- package/lib/esm/components/EvmProvidersDispatcher/ConnectionRequest/index.d.ts +3 -1
- package/lib/esm/components/EvmProvidersDispatcher/ConnectionRequest/index.js +4 -3
- package/lib/esm/components/EvmProvidersDispatcher/ProviderButton/index.d.ts +1 -1
- package/lib/esm/components/EvmProvidersDispatcher/ProviderButton/index.js +10 -5
- package/lib/esm/components/EvmProvidersDispatcher/index.js +10 -2
- package/lib/esm/context/EvmWalletProvidersContext.d.ts +5 -4
- package/lib/esm/context/EvmWalletProvidersContext.js +7 -6
- package/lib/esm/hooks/useRecentConnectionMeta.d.ts +2 -2
- package/lib/esm/hooks/useRecentConnectionMeta.js +8 -4
- package/lib/esm/intl/index.js +4 -0
- package/package.json +4 -4
|
@@ -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(() =>
|
|
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:
|
|
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:
|
|
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
|
});
|
|
@@ -52,8 +52,7 @@ require("./index.css");
|
|
|
52
52
|
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
|
-
const
|
|
56
|
-
const [recentMeta, setRecentMeta] = (0, hooks_1.useRecentConnectionMeta)(walletProviders.recentMetaStorageKey);
|
|
55
|
+
const [recentMeta, setRecentMeta] = (0, hooks_1.useRecentConnectionMeta)();
|
|
57
56
|
const drop = React.useRef(null);
|
|
58
57
|
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
58
|
const changeWallet = () => {
|
|
@@ -104,7 +103,7 @@ exports.EvmConnector = (0, mobx_react_lite_1.observer)((props) => {
|
|
|
104
103
|
}) })) })),
|
|
105
104
|
React.createElement(react_uikit_1.Flex, { alignItems: "center", className: "evm-connect-connector-suffix" },
|
|
106
105
|
suffix,
|
|
107
|
-
|
|
106
|
+
!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" },
|
|
108
107
|
!standalone && (React.createElement(react_uikit_1.List.Item, { key: "connect-wallet" },
|
|
109
108
|
React.createElement(EvmConnectButton_1.EvmConnectButton, { className: "evm-connect-change-wallet", network: network, popupType: popupType, type: "link", onOpen: changeWallet }, changeWalletButtonText))),
|
|
110
109
|
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 =
|
|
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
|
-
|
|
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
|
+
});
|
|
@@ -49,11 +49,10 @@ const intl_1 = __importDefault(require("../../../intl"));
|
|
|
49
49
|
const types_1 = require("../../../types");
|
|
50
50
|
const utils_1 = require("../../../utils");
|
|
51
51
|
require("./index.css");
|
|
52
|
-
exports.ProviderButton = (0, mobx_react_lite_1.observer)((
|
|
52
|
+
exports.ProviderButton = (0, mobx_react_lite_1.observer)(({ providerConfig, onSelect: onSelectProvider }) => {
|
|
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 { providerConfig, onSelect: onSelectProvider } = props;
|
|
57
56
|
const [hasProvider, setHasProvider] = React.useState(() => {
|
|
58
57
|
if (providerConfig.connector.type === types_1.EthereumConnectionType.WALLET_CONNECT_V2) {
|
|
59
58
|
return true;
|
|
@@ -66,13 +65,19 @@ exports.ProviderButton = (0, mobx_react_lite_1.observer)((props) => {
|
|
|
66
65
|
onSelectProvider?.(providerConfig);
|
|
67
66
|
}
|
|
68
67
|
};
|
|
68
|
+
// eslint-disable-next-line max-len
|
|
69
|
+
const isInitializing = providerConfig.connector.isInitializing === undefined || providerConfig.connector.isInitializing;
|
|
69
70
|
React.useEffect(() => (0, mobx_1.reaction)(() => providerConfig.connector, connector => {
|
|
70
71
|
if (connector.type !== types_1.EthereumConnectionType.WALLET_CONNECT_V2) {
|
|
71
72
|
setHasProvider(connector.provider != null);
|
|
72
73
|
}
|
|
73
74
|
}, { fireImmediately: true }), [providerConfig.connector]);
|
|
74
|
-
if (hasProvider
|
|
75
|
-
return (React.createElement(react_uikit_1.Button, { className: "evm-connect-provider-button", disabled: true },
|
|
75
|
+
if (!hasProvider && isInitializing) {
|
|
76
|
+
return (React.createElement(react_uikit_1.Button, { className: "evm-connect-provider-button", disabled: true },
|
|
77
|
+
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),
|
|
78
|
+
React.createElement("span", { className: "tvm-connect-provider-title" }, intl.formatMessage(intl_1.default.EVM_CONNECT_INITIALIZING_HINT)),
|
|
79
|
+
React.createElement("span", null,
|
|
80
|
+
React.createElement(react_uikit_1.Spinner, { ratio: 0.8 }))));
|
|
76
81
|
}
|
|
77
82
|
const ua = (0, js_utils_1.getUserAgent)();
|
|
78
83
|
const homepage = providerConfig.info.links?.homepage;
|
|
@@ -32,20 +32,27 @@ 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
|
-
const
|
|
54
|
+
const [recentMeta] = (0, hooks_1.useRecentConnectionMeta)();
|
|
55
|
+
const orderedProviders = (0, hooks_1.useOrderedConnections)(walletService.providers ?? [], recentMeta);
|
|
49
56
|
const dispatcher = React.useRef(null);
|
|
50
57
|
const content = React.useRef(null);
|
|
51
58
|
React.useLayoutEffect(() => {
|
|
@@ -54,6 +61,10 @@ exports.EvmProvidersDispatcher = (0, mobx_react_lite_1.observer)(() => {
|
|
|
54
61
|
dispatcher.current.style.height = height ? `${height}px` : '';
|
|
55
62
|
}
|
|
56
63
|
}, [walletProviders.connectingProvider, walletProviders.error]);
|
|
64
|
+
if (walletService.providers.length === 0) {
|
|
65
|
+
return (React.createElement("div", { ref: dispatcher, className: "tvm-connect-providers-dispatcher" },
|
|
66
|
+
React.createElement("div", { className: "uk-padding-large" }, intl.formatMessage(intl_1.default.EVM_CONNECT_DISPATCHER_POPUP_NO_PROVIDERS_HINT))));
|
|
67
|
+
}
|
|
57
68
|
return (React.createElement("div", { ref: dispatcher, className: "evm-connect-providers-dispatcher" },
|
|
58
69
|
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
70
|
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
|
|
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
|
|
65
|
-
await providerConfig.connector?.connect(typeof
|
|
66
|
-
|
|
67
|
-
|
|
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,
|
|
@@ -70,15 +70,19 @@ function getRecentConnectionMeta(storageKey = constants_1.EVM_RECENT_CONNECTION)
|
|
|
70
70
|
storeRecentConnectionMeta(undefined, storageKey);
|
|
71
71
|
return undefined;
|
|
72
72
|
}
|
|
73
|
-
function useRecentConnectionMeta(
|
|
73
|
+
function useRecentConnectionMeta() {
|
|
74
74
|
const walletProviders = (0, context_1.useEvmWalletProviders)();
|
|
75
|
-
const
|
|
75
|
+
const storageKey = walletProviders.recentMetaStorageKey ?? constants_1.EVM_RECENT_CONNECTION;
|
|
76
|
+
const [recentMeta, setRecentMeta] = React.useState(getRecentConnectionMeta(storageKey));
|
|
77
|
+
const setMeta = (meta) => {
|
|
78
|
+
storeRecentConnectionMeta(meta, storageKey);
|
|
79
|
+
};
|
|
76
80
|
React.useEffect(() => {
|
|
77
81
|
const onStorage = (event) => {
|
|
78
82
|
if (event.key === storageKey && event.newValue) {
|
|
79
83
|
const json = JSON.parse(event.newValue);
|
|
80
84
|
if (isRecentConnectionMeta(json)) {
|
|
81
|
-
|
|
85
|
+
setRecentMeta(json);
|
|
82
86
|
}
|
|
83
87
|
}
|
|
84
88
|
};
|
|
@@ -91,5 +95,5 @@ function useRecentConnectionMeta(storageKey = constants_1.EVM_RECENT_CONNECTION)
|
|
|
91
95
|
}
|
|
92
96
|
};
|
|
93
97
|
}, [storageKey]);
|
|
94
|
-
return [
|
|
98
|
+
return [recentMeta, setMeta];
|
|
95
99
|
}
|
package/lib/cjs/intl/index.js
CHANGED
|
@@ -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
|
});
|
|
@@ -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(() =>
|
|
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:
|
|
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:
|
|
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
|
});
|
|
@@ -6,15 +6,14 @@ import { observer } from 'mobx-react-lite';
|
|
|
6
6
|
import * as React from 'react';
|
|
7
7
|
import { useIntl } from 'react-intl';
|
|
8
8
|
import { EvmConnectButton } from '../../components/EvmConnectButton';
|
|
9
|
-
import {
|
|
9
|
+
import { useEvmWalletService } from '../../context';
|
|
10
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
|
-
const
|
|
17
|
-
const [recentMeta, setRecentMeta] = useRecentConnectionMeta(walletProviders.recentMetaStorageKey);
|
|
16
|
+
const [recentMeta, setRecentMeta] = useRecentConnectionMeta();
|
|
18
17
|
const drop = React.useRef(null);
|
|
19
18
|
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
19
|
const changeWallet = () => {
|
|
@@ -65,7 +64,7 @@ export const EvmConnector = observer((props) => {
|
|
|
65
64
|
}) })) })),
|
|
66
65
|
React.createElement(Flex, { alignItems: "center", className: "evm-connect-connector-suffix" },
|
|
67
66
|
suffix,
|
|
68
|
-
|
|
67
|
+
!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" },
|
|
69
68
|
!standalone && (React.createElement(List.Item, { key: "connect-wallet" },
|
|
70
69
|
React.createElement(EvmConnectButton, { className: "evm-connect-change-wallet", network: network, popupType: popupType, type: "link", onOpen: changeWallet }, changeWalletButtonText))),
|
|
71
70
|
React.createElement(List.Item, null,
|
|
@@ -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
|
|
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
|
+
});
|
|
@@ -5,7 +5,7 @@ interface ProviderButtonProps {
|
|
|
5
5
|
providerConfig: EvmWalletProviderConfig;
|
|
6
6
|
onSelect?: (providerConfig: EvmWalletProviderConfig) => Promise<void> | void;
|
|
7
7
|
}
|
|
8
|
-
export declare const ProviderButton: ((
|
|
8
|
+
export declare const ProviderButton: (({ providerConfig, onSelect: onSelectProvider }: ProviderButtonProps) => React.JSX.Element) & {
|
|
9
9
|
displayName: string;
|
|
10
10
|
};
|
|
11
11
|
export {};
|
|
@@ -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';
|
|
@@ -10,11 +10,10 @@ import messages from '../../../intl';
|
|
|
10
10
|
import { EthereumConnectionType } from '../../../types';
|
|
11
11
|
import { getEvmProviderPlatformLink } from '../../../utils';
|
|
12
12
|
import './index.css';
|
|
13
|
-
export const ProviderButton = observer((
|
|
13
|
+
export const ProviderButton = observer(({ providerConfig, onSelect: onSelectProvider }) => {
|
|
14
14
|
const intl = useIntl();
|
|
15
15
|
const walletService = useEvmWalletService();
|
|
16
16
|
const walletProviders = useEvmWalletProviders();
|
|
17
|
-
const { providerConfig, onSelect: onSelectProvider } = props;
|
|
18
17
|
const [hasProvider, setHasProvider] = React.useState(() => {
|
|
19
18
|
if (providerConfig.connector.type === EthereumConnectionType.WALLET_CONNECT_V2) {
|
|
20
19
|
return true;
|
|
@@ -27,13 +26,19 @@ export const ProviderButton = observer((props) => {
|
|
|
27
26
|
onSelectProvider?.(providerConfig);
|
|
28
27
|
}
|
|
29
28
|
};
|
|
29
|
+
// eslint-disable-next-line max-len
|
|
30
|
+
const isInitializing = providerConfig.connector.isInitializing === undefined || providerConfig.connector.isInitializing;
|
|
30
31
|
React.useEffect(() => reaction(() => providerConfig.connector, connector => {
|
|
31
32
|
if (connector.type !== EthereumConnectionType.WALLET_CONNECT_V2) {
|
|
32
33
|
setHasProvider(connector.provider != null);
|
|
33
34
|
}
|
|
34
35
|
}, { fireImmediately: true }), [providerConfig.connector]);
|
|
35
|
-
if (hasProvider
|
|
36
|
-
return (React.createElement(Button, { className: "evm-connect-provider-button", disabled: true },
|
|
36
|
+
if (!hasProvider && isInitializing) {
|
|
37
|
+
return (React.createElement(Button, { className: "evm-connect-provider-button", disabled: true },
|
|
38
|
+
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),
|
|
39
|
+
React.createElement("span", { className: "tvm-connect-provider-title" }, intl.formatMessage(messages.EVM_CONNECT_INITIALIZING_HINT)),
|
|
40
|
+
React.createElement("span", null,
|
|
41
|
+
React.createElement(Spinner, { ratio: 0.8 }))));
|
|
37
42
|
}
|
|
38
43
|
const ua = getUserAgent();
|
|
39
44
|
const homepage = providerConfig.info.links?.homepage;
|
|
@@ -1,15 +1,19 @@
|
|
|
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
|
-
import { useOrderedConnections } from '../../hooks';
|
|
8
|
+
import { useOrderedConnections, useRecentConnectionMeta } 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
|
-
const
|
|
15
|
+
const [recentMeta] = useRecentConnectionMeta();
|
|
16
|
+
const orderedProviders = useOrderedConnections(walletService.providers ?? [], recentMeta);
|
|
13
17
|
const dispatcher = React.useRef(null);
|
|
14
18
|
const content = React.useRef(null);
|
|
15
19
|
React.useLayoutEffect(() => {
|
|
@@ -18,6 +22,10 @@ export const EvmProvidersDispatcher = observer(() => {
|
|
|
18
22
|
dispatcher.current.style.height = height ? `${height}px` : '';
|
|
19
23
|
}
|
|
20
24
|
}, [walletProviders.connectingProvider, walletProviders.error]);
|
|
25
|
+
if (walletService.providers.length === 0) {
|
|
26
|
+
return (React.createElement("div", { ref: dispatcher, className: "tvm-connect-providers-dispatcher" },
|
|
27
|
+
React.createElement("div", { className: "uk-padding-large" }, intl.formatMessage(messages.EVM_CONNECT_DISPATCHER_POPUP_NO_PROVIDERS_HINT))));
|
|
28
|
+
}
|
|
21
29
|
return (React.createElement("div", { ref: dispatcher, className: "evm-connect-providers-dispatcher" },
|
|
22
30
|
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
31
|
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
|
-
|
|
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
|
|
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
|
|
28
|
-
await providerConfig.connector?.connect(typeof
|
|
29
|
-
|
|
30
|
-
|
|
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,
|
|
@@ -9,7 +9,7 @@ export declare function storeRecentConnectionMeta(meta: RecentConnectionMeta | u
|
|
|
9
9
|
export declare function getRecentConnectionMeta(storageKey?: string): RecentConnectionMeta | undefined;
|
|
10
10
|
type UseRecentConnectionMeta = [
|
|
11
11
|
value: RecentConnectionMeta | undefined,
|
|
12
|
-
setValue: (meta: RecentConnectionMeta | undefined
|
|
12
|
+
setValue: (meta: RecentConnectionMeta | undefined) => void
|
|
13
13
|
];
|
|
14
|
-
export declare function useRecentConnectionMeta(
|
|
14
|
+
export declare function useRecentConnectionMeta(): UseRecentConnectionMeta;
|
|
15
15
|
export {};
|
|
@@ -32,15 +32,19 @@ export function getRecentConnectionMeta(storageKey = EVM_RECENT_CONNECTION) {
|
|
|
32
32
|
storeRecentConnectionMeta(undefined, storageKey);
|
|
33
33
|
return undefined;
|
|
34
34
|
}
|
|
35
|
-
export function useRecentConnectionMeta(
|
|
35
|
+
export function useRecentConnectionMeta() {
|
|
36
36
|
const walletProviders = useEvmWalletProviders();
|
|
37
|
-
const
|
|
37
|
+
const storageKey = walletProviders.recentMetaStorageKey ?? EVM_RECENT_CONNECTION;
|
|
38
|
+
const [recentMeta, setRecentMeta] = React.useState(getRecentConnectionMeta(storageKey));
|
|
39
|
+
const setMeta = (meta) => {
|
|
40
|
+
storeRecentConnectionMeta(meta, storageKey);
|
|
41
|
+
};
|
|
38
42
|
React.useEffect(() => {
|
|
39
43
|
const onStorage = (event) => {
|
|
40
44
|
if (event.key === storageKey && event.newValue) {
|
|
41
45
|
const json = JSON.parse(event.newValue);
|
|
42
46
|
if (isRecentConnectionMeta(json)) {
|
|
43
|
-
|
|
47
|
+
setRecentMeta(json);
|
|
44
48
|
}
|
|
45
49
|
}
|
|
46
50
|
};
|
|
@@ -53,5 +57,5 @@ export function useRecentConnectionMeta(storageKey = EVM_RECENT_CONNECTION) {
|
|
|
53
57
|
}
|
|
54
58
|
};
|
|
55
59
|
}, [storageKey]);
|
|
56
|
-
return [
|
|
60
|
+
return [recentMeta, setMeta];
|
|
57
61
|
}
|
package/lib/esm/intl/index.js
CHANGED
|
@@ -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.
|
|
3
|
+
"version": "1.13.0",
|
|
4
4
|
"description": "Ethereum wallets connector.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -76,9 +76,9 @@
|
|
|
76
76
|
"prepare": "npx yarn cleanup && npx yarn build"
|
|
77
77
|
},
|
|
78
78
|
"dependencies": {
|
|
79
|
-
"@broxus/js-core": "^0.
|
|
79
|
+
"@broxus/js-core": "^0.33.0",
|
|
80
80
|
"@broxus/js-utils": "^1.3.16",
|
|
81
|
-
"@broxus/react-components": "^0.23.
|
|
81
|
+
"@broxus/react-components": "^0.23.5",
|
|
82
82
|
"@broxus/react-uikit": "^0.19.3",
|
|
83
83
|
"@metamask/detect-provider": "^2.0.0",
|
|
84
84
|
"@walletconnect/ethereum-provider": "^2.20.2",
|
|
@@ -96,5 +96,5 @@
|
|
|
96
96
|
"web3-types": "^1.x",
|
|
97
97
|
"web3-utils": "^4.x"
|
|
98
98
|
},
|
|
99
|
-
"gitHead": "
|
|
99
|
+
"gitHead": "f5b76b61d8ab82bed59723507e3dd5fe6740553e"
|
|
100
100
|
}
|