UNPKG

@reservoir0x/relay-kit-ui

Version:

Relay is the Fastest and Cheapest Way to Bridge and Transact Across Chains.

102 lines 7.45 kB
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; import { useState, useEffect, useMemo, useContext } from 'react'; import { Text, Flex, Button, Input, Pill } from '../primitives/index.js'; import { Modal } from '../common/Modal.js'; import {} from 'viem'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { useENSResolver, useWalletAddress } from '../../hooks/index.js'; import { isENSName } from '../../utils/ens.js'; import { LoadingSpinner } from '../common/LoadingSpinner.js'; import { EventNames } from '../../constants/events.js'; import { faCircleCheck, faTriangleExclamation } from '@fortawesome/free-solid-svg-icons'; import { AnchorButton } from '../primitives/Anchor.js'; import { truncateAddress } from '../../utils/truncate.js'; import { isValidAddress } from '../../utils/address.js'; import { ProviderOptionsContext } from '../../providers/RelayKitProvider.js'; export const CustomAddressModal = ({ open, toAddress, toChain, linkedWallets, isConnected, multiWalletSupportEnabled, wallet, onAnalyticEvent, onOpenChange, onConfirmed, onClear }) => { const connectedAddress = useWalletAddress(wallet, linkedWallets); const [address, setAddress] = useState(''); const [input, setInput] = useState(''); const providerOptionsContext = useContext(ProviderOptionsContext); const connectorKeyOverrides = providerOptionsContext.vmConnectorKeyOverrides; const availableWallets = useMemo(() => linkedWallets.filter((wallet) => isValidAddress(toChain?.vmType, wallet.address, toChain?.id, wallet.connector, connectorKeyOverrides)), [toChain, linkedWallets]); const connectedAddressSet = (!address && !toAddress) || (toAddress === connectedAddress && address === connectedAddress) || availableWallets.some((wallet) => wallet.address === toAddress); useEffect(() => { if (!open) { setAddress(''); setInput(''); } else { if (isValidAddress(toChain?.vmType, toAddress ?? '', toChain?.id)) { setAddress(toAddress ? toAddress : ''); setInput(toAddress ? toAddress : ''); } onAnalyticEvent?.(EventNames.ADDRESS_MODAL_OPEN); } }, [open]); const { data: resolvedENS, isLoading } = useENSResolver(isENSName(input) ? input : ''); useEffect(() => { if (isValidAddress(toChain?.vmType, input, toChain?.id)) { setAddress(input); } else if (resolvedENS?.address) { setAddress(resolvedENS.address); } else { setAddress(''); } }, [input, resolvedENS]); return (_jsx(Modal, { trigger: null, open: open, onOpenChange: onOpenChange, css: { overflow: 'hidden' }, children: _jsxs(Flex, { direction: "column", css: { width: '100%', height: '100%', gap: '4', sm: { width: 370 } }, children: [_jsx(Text, { style: "h6", children: "To Address" }), _jsxs(Flex, { direction: "column", css: { gap: '2', position: 'relative' }, children: [_jsxs(Flex, { css: { position: 'relative', display: 'inline-block' }, children: [_jsx(Input, { type: "text", inputMode: "text", autoComplete: "off", autoCorrect: "off", className: "ph-no-capture", css: { width: '100%', height: 48 }, placeholder: !toChain ? 'Enter address' : toChain.vmType === 'evm' ? 'Address or ENS' : `Enter ${toChain.displayName} address`, value: input, onChange: (e) => { setInput(e.target.value); } }), isLoading && (_jsx(LoadingSpinner, { css: { right: 2, top: 3, position: 'absolute' } }))] }), !address && input.length ? (_jsx(Text, { color: "red", style: "subtitle2", children: "Not a valid address" })) : null, !connectedAddressSet && address && isConnected ? (_jsxs(Flex, { css: { bg: 'amber2', p: '2', borderRadius: 8, gap: '2' }, align: "center", children: [_jsx(FontAwesomeIcon, { icon: faTriangleExclamation, color: "#FFA01C", width: 16, height: 16, style: { flexShrink: 0 } }), _jsxs(Text, { style: "subtitle3", color: "warning", children: ["This isn't the connected wallet address. Please ensure that the address provided is accurate.", ' '] })] })) : null, !multiWalletSupportEnabled && isConnected ? (connectedAddressSet ? (_jsxs(Flex, { css: { bg: 'green2', p: '2', borderRadius: 8, gap: '2' }, align: "center", children: [_jsx(FontAwesomeIcon, { icon: faCircleCheck, color: "#30A46C", width: 16, height: 16 }), _jsx(Text, { style: "subtitle3", children: "Connected Wallet" })] })) : (_jsx(AnchorButton, { onClick: () => { onClear(); onOpenChange(false); }, children: "Use connected wallet address" }))) : null, multiWalletSupportEnabled && availableWallets.length > 0 ? (_jsxs(_Fragment, { children: [_jsx(Text, { style: "subtitle2", children: "Use connected wallet address" }), _jsx(Flex, { css: { gap: '2', flexWrap: 'wrap' }, align: "center", children: availableWallets.map((wallet) => (_jsxs(Pill, { color: "transparent", bordered: true, radius: "squared", css: { display: 'flex', alignItems: 'center', gap: '6px', cursor: 'pointer' }, onClick: () => { onConfirmed(wallet.address); onOpenChange(false); onAnalyticEvent?.(EventNames.ADDRESS_MODAL_CONFIRMED, { address: wallet.address, context: 'linked_wallet' }); }, children: [_jsx("img", { src: wallet.walletLogoUrl, style: { width: 16, height: 16, borderRadius: 4 } }), _jsx(Text, { style: "subtitle2", children: truncateAddress(wallet.address) })] }, wallet.address))) })] })) : null] }), _jsx(Button, { disabled: !isValidAddress(toChain?.vmType, address, toChain?.id), css: { justifyContent: 'center' }, onClick: () => { if (isValidAddress(toChain?.vmType, address, toChain?.id)) { onConfirmed(address); onAnalyticEvent?.(EventNames.ADDRESS_MODAL_CONFIRMED, { address: address, context: 'input' }); } onOpenChange(false); }, children: "Save" })] }) })); }; //# sourceMappingURL=CustomAddressModal.js.map