import { useCallback, useMemo } from 'react' import Button from 'components/common/Button' import TokenInputWithSlider from 'components/common/TokenInput/TokenInputWithSlider' import { BN_ZERO } from 'constants/math' import useAllAssets from 'hooks/assets/useAllAssets' import useHealthComputer from 'hooks/useHealthComputer' import { useUpdatedAccount } from 'hooks/useUpdatedAccount' import useStore from 'store' import { BNCoin } from 'types/classes/BNCoin' import { byDenom } from 'utils/array' import { getHealthFactorMessage } from 'utils/messages' interface Props { account: Account action: HlsStakingManageAction collateralAsset: Asset } export default function Withdraw(props: Props) { const { removedDeposits, removeDeposits, updatedAccount } = useUpdatedAccount(props.account) const { computeMaxWithdrawAmount } = useHealthComputer(updatedAccount) const assets = useAllAssets() const withdraw = useStore((s) => s.withdraw) const handleChange = useCallback( (amount: BigNumber) => removeDeposits([BNCoin.fromDenomAndBigNumber(props.collateralAsset.denom, amount)]), [removeDeposits, props.collateralAsset.denom], ) const removedDeposit = useMemo( () => removedDeposits.find(byDenom(props.collateralAsset.denom)), [props.collateralAsset.denom, removedDeposits], ) const maxWithdrawAmount = useMemo(() => { const currentWithdrawAmount = removedDeposit?.amount || BN_ZERO const extraWithdrawAmount = computeMaxWithdrawAmount(props.collateralAsset.denom) return currentWithdrawAmount.plus(extraWithdrawAmount) }, [computeMaxWithdrawAmount, props.collateralAsset.denom, removedDeposit?.amount]) const onClick = useCallback(() => { useStore.setState({ hlsManageModal: null }) if (!removedDeposit) return withdraw({ accountId: props.account.id, coins: [{ coin: removedDeposit }], borrow: [], reclaims: [], }) }, [props.account.id, removedDeposit, withdraw]) const withdrawAmount = useMemo(() => removedDeposit?.amount || BN_ZERO, [removedDeposit?.amount]) const warningMessages = useMemo(() => { if (maxWithdrawAmount.isLessThan(withdrawAmount) || maxWithdrawAmount.isZero()) { return [ getHealthFactorMessage(props.collateralAsset.denom, maxWithdrawAmount, 'withdraw', assets), ] } return [] }, [assets, maxWithdrawAmount, props.collateralAsset.denom, withdrawAmount]) return ( <>