import { useEffect, useState } from 'react' import { ExclamationCircleIcon, LockClosedIcon, LockOpenIcon, RefreshIcon, } from '@heroicons/react/outline' import useWalletStore from '../stores/useWalletStore' import Input from './Input' import Button from './Button' import ConnectWalletButton from './ConnectWalletButton' //import PoolCountdown from './PoolCountdown' import Slider from './Slider' import Loading from './Loading' import WalletIcon from './WalletIcon' import useLargestAccounts from '../hooks/useLargestAccounts' //import useVaults from '../hooks/useVaults' import usePool from '../hooks/usePool' import styled from '@emotion/styled' import 'twin.macro' import { notify } from '../utils/notifications' const SmallButton = styled.button`` const ContributionModal = () => { const actions = useWalletStore((s) => s.actions) const connected = useWalletStore((s) => s.connected) const wallet = useWalletStore((s) => s.current) const largestAccounts = useLargestAccounts() //const vaults = useVaults() const { endIdo, endDeposits } = usePool() const usdcBalance = largestAccounts.usdc?.balance || 0 const redeemableBalance = largestAccounts.redeemable?.balance || 0 const totalBalance = usdcBalance + redeemableBalance // const mangoRedeemable = vaults.usdc // ? (redeemableBalance * vaults.mango.balance) / vaults.usdc.balance // : 0 const [walletAmount, setWalletAmount] = useState(0) const [contributionAmount, setContributionAmount] = useState(0) const [submitting, setSubmitting] = useState(false) const [submitted, setSubmitted] = useState(false) const [editContribution, setEditContribution] = useState(false) const [loading, setLoading] = useState(true) const [maxButtonTransition, setMaxButtonTransition] = useState(false) const [errorMessage, setErrorMessage] = useState(null) const [refreshing, setRefreshing] = useState(false) const usdFormat = new Intl.NumberFormat('en-US') //onst priceFormat = new Intl.NumberFormat('en-US', { // maximumSignificantDigits: 4, //}) useEffect(() => { console.log('refresh modal on balance change') setWalletAmount(usdcBalance) setContributionAmount(redeemableBalance) if (redeemableBalance > 0) { setSubmitted(true) } }, [totalBalance]) const handleConnectDisconnect = () => { if (connected) { setSubmitted(false) setEditContribution(false) wallet.disconnect() } else { wallet.connect() } } const handleSetContribution = () => { setSubmitting(true) setEditContribution(false) } const handleEditContribution = () => { setEditContribution(true) setSubmitted(false) } const onChangeAmountInput = (amount) => { setWalletAmount(totalBalance - amount) setContributionAmount(amount) if (endDeposits?.isBefore() && amount > redeemableBalance) { setErrorMessage('Deposits ended, contribution cannot increase') setTimeout(() => setErrorMessage(null), 4000) } } const onChangeSlider = (percentage) => { let newContribution = Math.round(percentage * totalBalance) / 100 if (endDeposits?.isBefore() && newContribution > redeemableBalance) { newContribution = redeemableBalance setErrorMessage('Deposits ended, contribution cannot increase') setTimeout(() => setErrorMessage(null), 4000) } setWalletAmount(totalBalance - newContribution) setContributionAmount(newContribution) } const handleMax = () => { if (endDeposits?.isAfter()) { setWalletAmount(0) setContributionAmount(totalBalance) } else { setWalletAmount(usdcBalance) setContributionAmount(redeemableBalance) } setMaxButtonTransition(true) } const handleRefresh = async () => { setRefreshing(true) try { await actions.fetchWalletTokenAccounts() } finally { setTimeout(() => setRefreshing(false), 1000) } } useEffect(() => { if (maxButtonTransition) { setMaxButtonTransition(false) } }, [maxButtonTransition]) useEffect(() => { setLoading(true) if (largestAccounts.usdc) { setLoading(false) } }, [largestAccounts]) useEffect(() => { if (submitting) { const handleSubmit = async () => { try { await actions.submitContribution(contributionAmount) setSubmitted(true) setSubmitting(false) } catch (e) { notify({ type: 'error', message: e.message }) console.error(e.message) setSubmitted(false) setSubmitting(false) } } handleSubmit() } }, [submitting]) const hasUSDC = usdcBalance > 0 || redeemableBalance > 0 const difference = contributionAmount - redeemableBalance const toLateToDeposit = endDeposits?.isBefore() && endIdo.isAfter() && !largestAccounts.redeemable?.balance const disableFormInputs = submitted || !connected || loading || (connected && toLateToDeposit) const dontAddMore = endDeposits?.isBefore() && contributionAmount > redeemableBalance const disableSubmit = disableFormInputs || walletAmount <= 0 || dontAddMore return ( <>
{!submitted && !submitting && !editContribution && !(connected && toLateToDeposit) && ( <>

The journey starts here.

When you're ready, deposit your USDC.

)} {!submitted && !submitting && !editContribution && connected && toLateToDeposit && ( <>

We're sorry, you missed it.

The sale period has ended.

)} {!submitted && submitting && ( <>

Approve the transaction.

Almost there...

)} {submitted && !submitting && ( <>

You've contributed ${usdFormat.format(contributionAmount)}.

Unlock to edit your contribution amount.

)} {editContribution && !submitting && ( <>

You've contributed ${usdFormat.format(redeemableBalance)}.

{endDeposits?.isBefore() && endIdo?.isAfter() ? 'You can only reduce your contribution during the grace period. Reducing cannot be reversed.' : 'Increase or reduce your contribution.'}

)}
{submitting ? (
) : ( <>
{connected ? ( loading ? (
) : ( {usdFormat.format(walletAmount)} ) ) : ( '----' )}
{submitted ? ( handleEditContribution()} > Unlock ) : null} handleMax()} > Max
{submitted ? ( ) : null} {editContribution ? ( ) : null} onChangeAmountInput(e.target.value)} value={loading ? '' : contributionAmount} suffix="USDC" />
onChangeSlider(v)} step={1} maxButtonTransition={maxButtonTransition} />
{errorMessage && (
{errorMessage}
)}
)}
) } export default ContributionModal