import React, { FunctionComponent, useEffect, useState } from 'react' import { ExclamationCircleIcon } from '@heroicons/react/outline' import { ChevronLeftIcon } from '@heroicons/react/solid' import Modal from './Modal' import Input from './Input' import AccountSelect from './AccountSelect' import { ElementTitle } from './styles' import useMangoStore from '../stores/useMangoStore' import Loading from './Loading' import Button, { LinkButton } from './Button' import Slider from './Slider' import InlineNotification from './InlineNotification' import { deposit } from '../utils/mango' import { notify } from '../utils/notifications' interface DepositModalProps { onClose: () => void isOpen: boolean settleDeficit?: string tokenSymbol?: string } const DepositModal: FunctionComponent = ({ isOpen, onClose, settleDeficit, tokenSymbol = '', }) => { const [inputAmount, setInputAmount] = useState(settleDeficit || '') const [submitting, setSubmitting] = useState(false) const [showConfirm, setShowConfirm] = useState(false) const [invalidAmountMessage, setInvalidAmountMessage] = useState('') const [sliderPercentage, setSliderPercentage] = useState(0) const [maxButtonTransition, setMaxButtonTransition] = useState(false) const walletTokens = useMangoStore((s) => s.wallet.tokens) const actions = useMangoStore((s) => s.actions) const [selectedAccount, setSelectedAccount] = useState(walletTokens[0]) useEffect(() => { if (tokenSymbol) { const symbolAccount = walletTokens.find( (a) => a.config.symbol === tokenSymbol ) if (symbolAccount) { setSelectedAccount(symbolAccount) } else { setSelectedAccount(null) } } }, [tokenSymbol, walletTokens]) const handleAccountSelect = (account) => { setInputAmount('') setSliderPercentage(0) setInvalidAmountMessage('') setSelectedAccount(account) } const setMaxForSelectedAccount = () => { setInputAmount(selectedAccount.uiBalance.toString()) setSliderPercentage(100) setInvalidAmountMessage('') setMaxButtonTransition(true) } const handleDeposit = () => { const mangoAccount = useMangoStore.getState().selectedMangoAccount.current setSubmitting(true) deposit({ amount: parseFloat(inputAmount), fromTokenAcc: selectedAccount.account, mangoAccount, }) .then((response) => { notify({ title: 'Deposit successful', type: 'success', txid: response.toString(), }) setSubmitting(false) onClose() actions.fetchMangoAccounts() }) .catch((err) => { notify({ title: 'Deposit failed', description: err.message, type: 'error', }) }) } const validateAmountInput = (amount) => { if (Number(amount) <= 0) { setInvalidAmountMessage('Enter an amount to deposit') } if (selectedAccount && Number(amount) > selectedAccount.uiBalance) { setInvalidAmountMessage( 'Insufficient balance. Reduce the amount to deposit' ) } } const onChangeAmountInput = (amount) => { setInputAmount(amount) if (!selectedAccount) { setInvalidAmountMessage( 'Please fund wallet with one of the supported assets.' ) return } const max = selectedAccount.uiBalance setSliderPercentage((amount / max) * 100) setInvalidAmountMessage('') } const onChangeSlider = async (percentage) => { setSliderPercentage(percentage) if (!selectedAccount) { setInvalidAmountMessage( 'Please fund wallet with one of the supported assets.' ) return } const max = selectedAccount.uiBalance const amount = (percentage / 100) * max if (percentage === 100) { setInputAmount(amount.toString()) } else { setInputAmount(amount.toString()) } setInvalidAmountMessage('') validateAmountInput(amount) } // turn off slider transition for dragging slider handle interaction useEffect(() => { if (maxButtonTransition) { setMaxButtonTransition(false) } }, [maxButtonTransition]) return ( {!showConfirm ? ( <> Deposit Funds {tokenSymbol && !selectedAccount ? ( ) : null} {settleDeficit ? ( ) : null}
Amount
Max
validateAmountInput(e.target.value)} value={inputAmount} onChange={(e) => onChangeAmountInput(e.target.value)} suffix={selectedAccount?.config.symbol} />
{invalidAmountMessage ? (
{invalidAmountMessage}
) : null}
onChangeSlider(v)} step={1} maxButtonTransition={maxButtonTransition} />
) : ( <> Confirm Deposit
{`You're about to deposit`}
{inputAmount} {selectedAccount?.config.symbol}
setShowConfirm(false)} > Back )}
) } export default React.memo(DepositModal)