@reservoir0x/relay-kit-ui
Version:
Relay is the Fastest and Cheapest Way to Bridge and Transact Across Chains.
102 lines • 7.45 kB
JavaScript
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