import { useEffect, useState } from 'react' import { useAccount, useAccountEffect, useSwitchChain } from 'wagmi' import { useConnectModal } from '@rainbow-me/rainbowkit' import { useTranslations } from 'next-intl' import { DEFAULT_WITHDRAW_QUOTE } from '@/slices/poolWithdrawSlice' import { usePoolDataState, usePoolWithdrawState, usePoolUserDataState, } from '@/slices/pools/hooks' import { stringToBigInt } from '@/utils/bigint/format' import { TransactionButton } from '@/components/buttons/TransactionButton' import LoadingDots from '@/components/ui/tailwind/LoadingDots' const WithdrawButton = ({ approveTxn, withdrawTxn, isApproved }) => { const t = useTranslations('Pools.WithdrawButton') const { chain, isConnected: isConnectedInit } = useAccount() const { chains, switchChain } = useSwitchChain() const { openConnectModal } = useConnectModal() const [isConnected, setIsConnected] = useState(false) useAccountEffect({ onDisconnect() { setIsConnected(false) }, }) useEffect(() => { setIsConnected(isConnectedInit) }, [isConnectedInit]) const { pool } = usePoolDataState() const { poolUserData } = usePoolUserDataState() const { withdrawQuote, inputValue, isLoading } = usePoolWithdrawState() const poolDecimals = pool?.decimals[pool?.chainId] const isBalanceEnough = stringToBigInt(inputValue, poolDecimals) !== 0n && stringToBigInt(inputValue, poolDecimals) <= poolUserData.lpTokenBalance const isValidInput = stringToBigInt(inputValue, poolDecimals) !== 0n const isValidQuote = withdrawQuote !== DEFAULT_WITHDRAW_QUOTE const isButtonDisabled = isLoading || !isBalanceEnough || !isValidQuote let buttonProperties if (!isBalanceEnough && isValidQuote && isValidInput) { buttonProperties = { label: t('insufficientBalance'), onClick: null, } } else if (isLoading) { buttonProperties = { label: (
), onClick: null, } } else if (!isConnected) { buttonProperties = { label: t('connectWallet'), onClick: openConnectModal, } } else if (chain?.id !== pool.chainId) { buttonProperties = { label: t('switchChain', { chainName: chains.find((c) => c.id === pool.chainId).name, }), onClick: () => switchChain({ chainId: pool.chainId }), pendingLabel: t('switchingChains'), } } else if (!isApproved && isValidQuote && isValidInput) { buttonProperties = { onClick: approveTxn, label: t('approveToken'), pendingLabel: t('approving'), } } else { buttonProperties = { onClick: withdrawTxn, label: t('withdraw'), pendingLabel: t('withdrawing'), } } return ( pool && buttonProperties && ( ) ) } export default WithdrawButton