import { getConnectorIcon } from 'nimbus-wallet-management';
import { ExpandMore, Wallet } from '@mui/icons-material';
import { Avatar, Badge } from '@mui/material';
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useLocation, useNavigate } from 'react-router-dom';
import type { Account } from '../../hooks/useAccount.js';
import { useAccount } from '../../hooks/useAccount.js';
import { useChain } from '../../hooks/useChain.js';
import { useHasExternalWalletProvider } from '../../providers/WalletProvider/useHasExternalWalletProvider.js';
import { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js';
import { HiddenUI } from '../../types/widget.js';
import { navigationRoutes } from '../../utils/navigationRoutes.js';
import { shortenAddress } from '../../utils/wallet.js';
import { SmallAvatar } from '../SmallAvatar.js';
import { CloseDrawerButton } from './CloseDrawerButton.js';
import {
DrawerWalletContainer,
HeaderAppBar,
WalletAvatar,
WalletButton,
} from './Header.style.js';
import { WalletMenu } from './WalletMenu.js';
import { WalletMenuContainer } from './WalletMenu.style.js';
import { ChainType } from '../../utils/chainType.js';
// @ts-ignore
import { useWallet as useSolanaWallet } from '@solana/wallet-adapter-react';
import { useTon } from '../../providers/WalletProvider/TVM/TVMBaseProvider.js';
import { useDisconnect } from 'wagmi';
import { useFieldValues } from '../../stores/form/useFieldValues.js';
import { FormKeyHelper } from '../../stores/form/types.js';
import { ChainId } from '../../types/base.js';
import { useFieldActions } from '../../stores/form/useFieldActions.js';
import { getDefaultValuesFromQueryString } from '../../stores/form/URLSearchParamsBuilder.js';
export const WalletHeader: React.FC = () => {
const { subvariant, hiddenUI } = useWidgetConfig();
const { hasExternalProvider } = useHasExternalWalletProvider();
return !hasExternalProvider &&
subvariant !== 'split' &&
!hiddenUI?.includes(HiddenUI.WalletMenu) ? (
) : null;
};
export const SplitWalletMenuButton: React.FC = () => {
const { hiddenUI } = useWidgetConfig();
const { hasExternalProvider } = useHasExternalWalletProvider();
return !hasExternalProvider && !hiddenUI?.includes(HiddenUI.WalletMenu) ? (
) : null;
};
export const WalletMenuButton: React.FC = () => {
const { account, accounts } = useAccount();
const { variant, hiddenUI, isUniversalSwap } = useWidgetConfig();
// TODO: remove when enable other chain
const { tonConnectUI } = useTon();
const { disconnect } = useSolanaWallet();
const evmDisconnect = useDisconnect();
const wait = (time: number) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(true);
}, time);
});
};
const handleDisconnectWallet = async () => {
if (account.isConnected && isUniversalSwap) {
if (account.chainType === ChainType.EVM) {
if (account?.connector?.name === 'MetaMask') {
await wait(10000); // 10s
evmDisconnect.disconnect({
connector: account?.connector as any,
});
} else {
evmDisconnect.disconnect({
connector: account?.connector as any,
});
}
}
}
};
useEffect(() => {
handleDisconnectWallet();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [account, isUniversalSwap, disconnect, tonConnectUI, evmDisconnect]);
if (variant === 'drawer') {
return (
{account.isConnected ? (
) : (
)}
{!hiddenUI?.includes(HiddenUI.DrawerCloseButton) ? (
) : null}
);
}
return account.isConnected ? (
) : (
);
};
const ConnectButton = () => {
const { t } = useTranslation();
const { pathname } = useLocation();
const { walletConfig, subvariant, variant } = useWidgetConfig();
const navigate = useNavigate();
const connect = async () => {
if (walletConfig?.onConnect) {
walletConfig.onConnect();
return;
}
navigate(navigationRoutes.selectWallet);
};
return (
: undefined
}
startIcon={
variant === 'drawer' || subvariant === 'split' ? (
) : undefined
}
onClick={
!pathname.includes(navigationRoutes.selectWallet) ? connect : undefined
}
>
{t(`button.connectWallet`)}
);
};
const ConnectedButton = ({
account,
accounts,
}: {
account: Account;
accounts: Account[];
}) => {
const [anchorEl, setAnchorEl] = useState(null);
const { subvariant, fromToken } = useWidgetConfig();
const [chainId] = useFieldValues(FormKeyHelper.getChainKey('from'));
const { setUserAndDefaultValues } = useFieldActions();
const selectedAccount =
accounts.find((acc) => acc.chainId === chainId) || account;
const { chain } = useChain(selectedAccount.chainId);
const walletAddress = shortenAddress(selectedAccount.address);
useEffect(() => {
setTimeout(() => {
const formValues = getDefaultValuesFromQueryString();
if (!fromToken && !formValues.fromToken && !formValues.toToken) {
if (chainId === ChainId.MOVE) {
setUserAndDefaultValues({
fromToken: '0x2::sui::SUI',
toToken:
'0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN',
});
}
if (chainId === ChainId.TON) {
setUserAndDefaultValues({
fromToken:
'0:0000000000000000000000000000000000000000000000000000000000000000',
toToken:
'0:b113a994b5024a16719f69139328eb759596c38a25f59028b146fecdc3621dfe',
});
}
if (chainId === ChainId.ECLIPSE) {
setUserAndDefaultValues({
fromToken: 'So11111111111111111111111111111111111111112',
toToken: 'AKEWE7Bgh87GPp171b4cJPSSZfmZwQ3KaqYqXoKLNAEE',
});
}
if (chainId === ChainId.SOL) {
setUserAndDefaultValues({
fromToken: '11111111111111111111111111111111',
toToken: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
});
}
}
}, 0);
}, [chainId, fromToken, setUserAndDefaultValues]);
const handleClick = (event: React.MouseEvent) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
return (
<>
}
startIcon={
chain?.logoURI ? (
{chain?.name[0]}
}
>
{selectedAccount.connector?.name[0]}
) : (
{selectedAccount.connector?.name[0]}
)
}
onClick={handleClick}
>
{walletAddress}
>
);
};