@turnkey/react-wallet-kit
Version:
The easiest and most powerful way to integrate Turnkey's Embedded Wallets into your React applications.
152 lines (149 loc) • 7.54 kB
JavaScript
import { slicedToArray as _slicedToArray, objectSpread2 as _objectSpread2, asyncToGenerator as _asyncToGenerator, regenerator as _regenerator } from '../../../_virtual/_rollupPluginBabelHelpers.mjs';
import { jsxs, jsx } from 'react/jsx-runtime';
import { ActionButton } from '../../design/Buttons.mjs';
import { EthereumLogo, SolanaLogo } from '../../design/Svg.mjs';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faClose, faChevronRight } from '@fortawesome/free-solid-svg-icons';
import { useState, useEffect } from 'react';
import clsx from 'clsx';
import { isEthereumProvider, isSolanaProvider } from '@turnkey/core';
import { useModal } from '../../../providers/modal/Hook.mjs';
import { useTurnkey } from '../../../providers/client/Hook.mjs';
import { ConnectedIndicator } from '../../design/ConnectedIndicator.mjs';
import { canDisconnect } from './utils.mjs';
function ExternalWalletChainSelector(props) {
var _providers$, _providers$0$info$nam, _providers$2;
var providers = props.providers,
onSelect = props.onSelect,
onDisconnect = props.onDisconnect;
var _useTurnkey = useTurnkey(),
walletProviders = _useTurnkey.walletProviders;
var _useModal = useModal(),
isMobile = _useModal.isMobile,
popPage = _useModal.popPage;
var _useState = useState(),
_useState2 = _slicedToArray(_useState, 2),
loadingProvider = _useState2[0],
setLoadingProvider = _useState2[1];
// we find matching providers in current state, matching by wallet identity
// (rdns preferred, name as fallback) in addition to interfaceType + namespace
// to avoid picking a different wallet that happens to support the same chain
var currentProviders = providers.map(function (inputProvider) {
return walletProviders.find(function (p) {
return p.interfaceType === inputProvider.interfaceType && p.chainInfo.namespace === inputProvider.chainInfo.namespace && (p.info.rdns && inputProvider.info.rdns ? p.info.rdns === inputProvider.info.rdns : p.info.name === inputProvider.info.name);
});
}).filter(function (p) {
return p !== undefined;
});
// if no providers are found then that means that the user entered this screen
// while WalletConnect was still initializing, and then it failed to initialize
useEffect(function () {
if (currentProviders.length === 0) {
popPage();
}
}, [currentProviders.length, popPage]);
var shouldShowDisconnect = onDisconnect !== undefined;
var handleSelect = /*#__PURE__*/function () {
var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(provider) {
return _regenerator().w(function (_context) {
while (1) switch (_context.n) {
case 0:
setLoadingProvider(provider);
if (!canDisconnect(provider, shouldShowDisconnect)) {
_context.n = 2;
break;
}
_context.n = 1;
return onDisconnect(provider);
case 1:
_context.n = 3;
break;
case 2:
_context.n = 3;
return onSelect(provider);
case 3:
setLoadingProvider(undefined);
case 4:
return _context.a(2);
}
}, _callee);
}));
return function handleSelect(_x) {
return _ref.apply(this, arguments);
};
}();
return jsxs("div", {
className: clsx("flex flex-col w-72 gap-4 mt-11 items-center justify-center", isMobile ? "w-full" : "w-72"),
children: [jsx("img", {
src: (_providers$ = providers[0]) === null || _providers$ === void 0 ? void 0 : _providers$.info.icon,
className: "size-14 rounded-full"
}), jsxs("span", {
className: "text-sm text-center text-icon-text-light dark:text-icon-text-dark",
children: [(_providers$0$info$nam = (_providers$2 = providers[0]) === null || _providers$2 === void 0 ? void 0 : _providers$2.info.name) !== null && _providers$0$info$nam !== void 0 ? _providers$0$info$nam : "This wallet provider", " supports multiple chains. Select which chain you would like to use."]
}), jsx("div", {
className: "w-full flex flex-col gap-2",
children: currentProviders.map(function (p) {
var _p$connectedAddresses, _p$connectedAddresses2;
var _useState3 = useState(false),
_useState4 = _slicedToArray(_useState3, 2),
isHovering = _useState4[0],
setIsHovering = _useState4[1];
return jsxs(ActionButton, _objectSpread2(_objectSpread2({
loading: loadingProvider === p,
loadingText: "Preparing...",
onClick: function onClick() {
return handleSelect(p);
}
}, !isMobile && {
// This looks weird on mobile since there's no hover state
onMouseEnter: function onMouseEnter() {
return setIsHovering(true);
},
onMouseLeave: function onMouseLeave() {
return setIsHovering(false);
}
}), {}, {
className: "relative overflow-hidden flex items-center justify-start gap-2 w-full text-inherit bg-button-light dark:bg-button-dark",
children: [isEthereumProvider(p) ? jsxs("div", {
className: "relative",
children: [jsx(EthereumLogo, {
className: "size-5"
}), canDisconnect(p, shouldShowDisconnect) && jsx(ConnectedIndicator, {
isPinging: true
})]
}) : isSolanaProvider(p) ? jsxs("div", {
className: "relative",
children: [jsx(SolanaLogo, {
className: "size-5"
}), canDisconnect(p, shouldShowDisconnect) && jsx(ConnectedIndicator, {
isPinging: true
})]
}) :
// we should never reach here
// if we do then it means we forgot to update the auth component after adding a new chain
jsx("div", {
className: "relative",
children: jsx("span", {
className: "size-5 flex items-center justify-center rounded bg-gray-300 dark:bg-gray-700",
children: "?"
})
}), jsxs("div", {
className: "flex flex-col items-start",
children: [isEthereumProvider(p) ? "EVM" : isSolanaProvider(p) ? "Solana" : // we should never reach here
// if we do then it means we forgot to update the auth component after adding a new chain
"?", canDisconnect(p, shouldShowDisconnect) && jsxs("span", {
className: "text-xs text-icon-text-light dark:text-icon-text-dark",
children: ["Connected: ", (_p$connectedAddresses = p.connectedAddresses[0]) === null || _p$connectedAddresses === void 0 ? void 0 : _p$connectedAddresses.slice(0, 4), "...", (_p$connectedAddresses2 = p.connectedAddresses[0]) === null || _p$connectedAddresses2 === void 0 ? void 0 : _p$connectedAddresses2.slice(-3)]
})]
}), jsx(FontAwesomeIcon, {
className: clsx("absolute transition-all duration-200", isHovering ? "right-4" : "-right-4", canDisconnect(p, shouldShowDisconnect) ? "text-danger-light dark:text-danger-dark" : "text-icon-text-light dark:text-icon-text-dark"),
size: canDisconnect(p, shouldShowDisconnect) ? "lg" : "1x",
icon: canDisconnect(p, shouldShowDisconnect) ? faClose : faChevronRight
})]
}), p.chainInfo.namespace);
})
})]
});
}
export { ExternalWalletChainSelector };
//# sourceMappingURL=ExternalWalletChainSelector.mjs.map