import { useCallback, useEffect, useMemo, useState } from 'react' import { useParams } from 'react-router-dom' import Button from 'components/Button' import Card from 'components/Card' import FullOverlayContent from 'components/FullOverlayContent' import { Plus } from 'components/Icons' import SwitchWithLabel from 'components/SwitchWithLabel' import Text from 'components/Text' import TokenInputWithSlider from 'components/TokenInput/TokenInputWithSlider' import WalletBridges from 'components/Wallet/WalletBridges' import { BN_ZERO } from 'constants/math' import useAccounts from 'hooks/useAccounts' import useAutoLendEnabledAccountIds from 'hooks/useAutoLendEnabledAccountIds' import useCurrentAccount from 'hooks/useCurrentAccount' import useToggle from 'hooks/useToggle' import useWalletBalances from 'hooks/useWalletBalances' import useStore from 'store' import { BNCoin } from 'types/classes/BNCoin' import { byDenom } from 'utils/array' import { getAssetByDenom, getBaseAsset } from 'utils/assets' import { hardcodedFee } from 'utils/constants' import { BN } from 'utils/helpers' export default function AccountFund() { const address = useStore((s) => s.address) const deposit = useStore((s) => s.deposit) const walletAssetModal = useStore((s) => s.walletAssetsModal) const { accountId } = useParams() const { data: accounts } = useAccounts(address) const currentAccount = useCurrentAccount() const [isFunding, setIsFunding] = useToggle(false) const [selectedAccountId, setSelectedAccountId] = useState(null) const [fundingAssets, setFundingAssets] = useState([]) const { data: walletBalances } = useWalletBalances(address) const baseAsset = getBaseAsset() const { autoLendEnabledAccountIds, toggleAutoLend } = useAutoLendEnabledAccountIds() const isAutoLendEnabled = autoLendEnabledAccountIds.includes(accountId ?? '0') const hasAssetSelected = fundingAssets.length > 0 const hasFundingAssets = fundingAssets.length > 0 && fundingAssets.every((a) => a.toCoin().amount !== '0') const baseBalance = useMemo( () => walletBalances.find(byDenom(baseAsset.denom))?.amount ?? '0', [walletBalances, baseAsset], ) const selectedDenoms = useMemo(() => { return walletAssetModal?.selectedDenoms ?? [] }, [walletAssetModal?.selectedDenoms]) const handleClick = useCallback(async () => { setIsFunding(true) if (!accountId) return const result = await deposit({ fee: hardcodedFee, accountId, coins: fundingAssets, }) setIsFunding(false) if (result) useStore.setState({ focusComponent: null, walletAssetsModal: null }) }, [fundingAssets, accountId, setIsFunding, deposit]) const handleSelectAssetsClick = useCallback(() => { useStore.setState({ walletAssetsModal: { isOpen: true, selectedDenoms, }, }) }, [selectedDenoms]) useEffect(() => { const currentSelectedDenom = fundingAssets.map((asset) => asset.denom) if ( selectedDenoms.every((denom) => currentSelectedDenom.includes(denom)) && selectedDenoms.length === currentSelectedDenom.length ) return const newFundingAssets = selectedDenoms.map((denom) => BNCoin.fromDenomAndBigNumber(denom, BN(fundingAssets.find(byDenom(denom))?.amount ?? '0')), ) setFundingAssets(newFundingAssets) }, [selectedDenoms, fundingAssets]) const updateFundingAssets = useCallback( (amount: BigNumber, denom: string) => { const assetToUpdate = fundingAssets.find((asset) => asset.denom === denom) if (assetToUpdate) { assetToUpdate.amount = amount setFundingAssets([...fundingAssets.filter((a) => a.denom !== denom), assetToUpdate]) } }, [fundingAssets], ) useEffect(() => { if (BN(baseBalance).isLessThan(hardcodedFee.amount[0].amount)) { useStore.setState({ focusComponent: }) } }, [baseBalance]) useEffect(() => { if (accounts && !selectedAccountId && accountId) setSelectedAccountId(currentAccount?.id ?? accountId) }, [accounts, selectedAccountId, accountId, currentAccount]) if (!selectedAccountId) return null return ( {!hasAssetSelected && Please select an asset.} {selectedDenoms.map((denom) => { const asset = getAssetByDenom(denom) as Asset const balance = walletBalances.find(byDenom(asset.denom))?.amount ?? '0' return (
updateFundingAssets(amount, asset.denom)} amount={BN_ZERO} max={BN(balance)} balances={walletBalances} maxText='Max' />
) })}