2021-04-26 07:22:30 -07:00
|
|
|
import { useEffect, useState } from 'react'
|
2021-04-29 18:40:11 -07:00
|
|
|
import { LockClosedIcon, LockOpenIcon } from '@heroicons/react/outline'
|
|
|
|
import { LinkIcon } from '@heroicons/react/solid'
|
2021-04-26 07:22:30 -07:00
|
|
|
import useWalletStore from '../stores/useWalletStore'
|
|
|
|
import Input from './Input'
|
|
|
|
import Button from './Button'
|
2021-04-29 06:51:16 -07:00
|
|
|
import { ConnectWalletButtonSmall } from './ConnectWalletButton'
|
2021-04-28 07:43:29 -07:00
|
|
|
import Slider from './Slider'
|
2021-04-26 07:22:30 -07:00
|
|
|
import Loading from './Loading'
|
|
|
|
import WalletIcon from './WalletIcon'
|
2021-07-04 16:17:40 -07:00
|
|
|
import useLargestAccounts from '../hooks/useLargestAccounts'
|
2021-07-05 07:51:32 -07:00
|
|
|
import useVaults from '../hooks/useVaults'
|
|
|
|
import moment from 'moment'
|
2021-07-06 06:25:55 -07:00
|
|
|
import Countdown from 'react-countdown'
|
2021-04-29 06:51:16 -07:00
|
|
|
|
2021-04-26 07:22:30 -07:00
|
|
|
const ContributionModal = () => {
|
2021-07-04 16:17:40 -07:00
|
|
|
const actions = useWalletStore((s) => s.actions)
|
2021-04-26 07:22:30 -07:00
|
|
|
const connected = useWalletStore((s) => s.connected)
|
|
|
|
const wallet = useWalletStore((s) => s.current)
|
2021-07-04 16:17:40 -07:00
|
|
|
const largestAccounts = useLargestAccounts()
|
2021-07-05 07:51:32 -07:00
|
|
|
const vaults = useVaults()
|
|
|
|
|
|
|
|
const pool = useWalletStore((s) => s.pool)
|
2021-07-06 06:25:55 -07:00
|
|
|
// const startIdo = pool ? moment.unix(pool.startIdoTs.toNumber()) : undefined
|
2021-07-05 07:51:32 -07:00
|
|
|
const endIdo = pool ? moment.unix(pool.endIdoTs.toNumber()) : undefined
|
|
|
|
const endDeposits = pool
|
|
|
|
? moment.unix(pool.endDepositsTs.toNumber())
|
|
|
|
: undefined
|
2021-07-04 16:17:40 -07:00
|
|
|
|
|
|
|
const usdcBalance = largestAccounts.usdc?.balance || 0
|
|
|
|
const redeemableBalance = largestAccounts.redeemable?.balance || 0
|
2021-07-05 05:34:53 -07:00
|
|
|
const totalBalance = usdcBalance + redeemableBalance
|
2021-07-04 16:17:40 -07:00
|
|
|
|
2021-07-05 06:05:35 -07:00
|
|
|
const [walletAmount, setWalletAmount] = useState(0)
|
2021-04-29 18:40:11 -07:00
|
|
|
const [contributionAmount, setContributionAmount] = useState(0)
|
2021-04-26 07:22:30 -07:00
|
|
|
const [submitting, setSubmitting] = useState(false)
|
2021-04-29 06:51:16 -07:00
|
|
|
const [submitted, setSubmitted] = useState(false)
|
|
|
|
const [editContribution, setEditContribution] = useState(false)
|
2021-04-27 06:47:52 -07:00
|
|
|
const [loading, setLoading] = useState(true)
|
2021-04-29 18:40:11 -07:00
|
|
|
const [maxButtonTransition, setMaxButtonTransition] = useState(false)
|
2021-04-26 07:22:30 -07:00
|
|
|
|
2021-07-04 16:17:40 -07:00
|
|
|
useEffect(() => {
|
2021-07-05 06:05:35 -07:00
|
|
|
console.log('refresh modal on balance change')
|
|
|
|
setWalletAmount(usdcBalance)
|
2021-07-04 16:17:40 -07:00
|
|
|
setContributionAmount(redeemableBalance)
|
2021-07-05 05:52:49 -07:00
|
|
|
if (redeemableBalance > 0) {
|
|
|
|
setSubmitted(true)
|
|
|
|
}
|
2021-07-05 06:05:35 -07:00
|
|
|
}, [totalBalance])
|
2021-07-04 16:17:40 -07:00
|
|
|
|
2021-04-26 07:22:30 -07:00
|
|
|
const handleConnectDisconnect = () => {
|
|
|
|
if (connected) {
|
2021-04-29 06:51:16 -07:00
|
|
|
setSubmitted(false)
|
|
|
|
setEditContribution(false)
|
2021-04-26 07:22:30 -07:00
|
|
|
wallet.disconnect()
|
|
|
|
} else {
|
|
|
|
wallet.connect()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const handleSetContribution = () => {
|
|
|
|
setSubmitting(true)
|
2021-04-29 06:51:16 -07:00
|
|
|
setEditContribution(false)
|
|
|
|
}
|
|
|
|
|
|
|
|
const handleEditContribution = () => {
|
|
|
|
setEditContribution(true)
|
|
|
|
setSubmitted(false)
|
|
|
|
}
|
|
|
|
|
|
|
|
const onChangeAmountInput = (amount) => {
|
2021-07-05 06:05:35 -07:00
|
|
|
setWalletAmount(totalBalance - amount)
|
2021-04-29 06:51:16 -07:00
|
|
|
setContributionAmount(amount)
|
|
|
|
}
|
|
|
|
|
|
|
|
const onChangeSlider = (percentage) => {
|
2021-07-05 06:05:35 -07:00
|
|
|
const newContribution = Math.round(percentage * totalBalance) / 100
|
|
|
|
setWalletAmount(totalBalance - newContribution)
|
|
|
|
setContributionAmount(newContribution)
|
2021-04-29 06:51:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
const handleMax = () => {
|
2021-07-05 06:05:35 -07:00
|
|
|
setWalletAmount(0)
|
2021-07-05 05:34:53 -07:00
|
|
|
setContributionAmount(totalBalance)
|
2021-04-29 18:40:11 -07:00
|
|
|
setMaxButtonTransition(true)
|
2021-04-26 07:22:30 -07:00
|
|
|
}
|
|
|
|
|
2021-04-29 18:40:11 -07:00
|
|
|
useEffect(() => {
|
|
|
|
if (maxButtonTransition) {
|
|
|
|
setMaxButtonTransition(false)
|
|
|
|
}
|
|
|
|
}, [maxButtonTransition])
|
|
|
|
|
2021-04-27 06:47:52 -07:00
|
|
|
useEffect(() => {
|
|
|
|
setLoading(true)
|
2021-07-05 05:34:53 -07:00
|
|
|
if (largestAccounts.usdc) {
|
2021-04-27 06:47:52 -07:00
|
|
|
setLoading(false)
|
|
|
|
}
|
2021-07-05 05:34:53 -07:00
|
|
|
}, [largestAccounts])
|
2021-04-27 06:47:52 -07:00
|
|
|
|
2021-04-26 07:22:30 -07:00
|
|
|
useEffect(() => {
|
2021-04-29 06:51:16 -07:00
|
|
|
if (submitting) {
|
2021-07-05 08:32:33 -07:00
|
|
|
const handleSubmit = async () => {
|
2021-07-05 06:28:01 -07:00
|
|
|
await actions.submitContribution(contributionAmount)
|
|
|
|
setSubmitted(true)
|
|
|
|
setSubmitting(false)
|
2021-07-05 08:32:33 -07:00
|
|
|
}
|
|
|
|
handleSubmit()
|
2021-04-29 06:51:16 -07:00
|
|
|
}
|
2021-04-26 07:22:30 -07:00
|
|
|
}, [submitting])
|
|
|
|
|
2021-04-29 18:40:11 -07:00
|
|
|
const disableFormInputs = submitted || !connected || loading
|
|
|
|
|
2021-07-06 06:25:55 -07:00
|
|
|
const renderCountdown = ({ hours, minutes, seconds, completed }) => {
|
|
|
|
const now = new Date().getTime() / 1000
|
|
|
|
const message =
|
|
|
|
now > pool.endDepositsTs.toNumber() && now < pool.endIdoTs.toNumber()
|
|
|
|
? 'Deposits are closed'
|
|
|
|
: 'The IDO has ended'
|
|
|
|
if (completed) {
|
|
|
|
return <p className="text-secondary-2-light">{message}</p>
|
|
|
|
} else {
|
|
|
|
return (
|
|
|
|
<div className="font-bold pt-2 text-fgd-1 text-base">
|
|
|
|
<span className="bg-bkg-1 border border-bkg-4 mx-0.5 px-1.5 py-1 rounded">
|
|
|
|
{hours < 10 ? `0${hours}` : hours}
|
|
|
|
</span>
|
|
|
|
:
|
|
|
|
<span className="bg-bkg-1 border border-bkg-4 mx-0.5 px-1.5 py-1 rounded">
|
|
|
|
{minutes < 10 ? `0${minutes}` : minutes}
|
|
|
|
</span>
|
|
|
|
:
|
|
|
|
<span className="bg-bkg-1 border border-bkg-4 mx-0.5 px-1.5 py-1 rounded">
|
|
|
|
{seconds < 10 ? `0${seconds}` : seconds}
|
|
|
|
</span>
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-26 07:22:30 -07:00
|
|
|
return (
|
2021-07-06 06:25:55 -07:00
|
|
|
<>
|
|
|
|
<div className="bg-bkg-2 border border-bkg-3 col-span-7 p-7 rounded-lg shadow-lg">
|
2021-04-29 23:16:02 -07:00
|
|
|
<div className="pb-4 text-center">
|
|
|
|
{!submitted && !submitting && !editContribution ? (
|
|
|
|
<>
|
2021-07-06 06:25:55 -07:00
|
|
|
<h2>Plant Your Seed</h2>
|
2021-04-29 23:16:02 -07:00
|
|
|
<p>This is the start of something big.</p>
|
|
|
|
</>
|
|
|
|
) : null}
|
2021-04-29 06:51:16 -07:00
|
|
|
|
2021-04-29 23:16:02 -07:00
|
|
|
{!submitted && submitting ? (
|
|
|
|
<>
|
|
|
|
<h2>Approve the transaction</h2>
|
|
|
|
<p>Almost there...</p>
|
|
|
|
</>
|
|
|
|
) : null}
|
2021-04-29 06:51:16 -07:00
|
|
|
|
2021-04-29 23:16:02 -07:00
|
|
|
{submitted && !submitting ? (
|
|
|
|
<>
|
|
|
|
<h2>Your contribution amount</h2>
|
|
|
|
<p>A new seed planted...</p>
|
|
|
|
</>
|
|
|
|
) : null}
|
2021-04-29 06:51:16 -07:00
|
|
|
|
2021-04-29 23:16:02 -07:00
|
|
|
{editContribution && !submitting ? (
|
|
|
|
<>
|
|
|
|
<h2>Funds unlocked</h2>
|
|
|
|
<p>Increase or reduce your contribution...</p>
|
|
|
|
</>
|
|
|
|
) : null}
|
2021-04-29 06:51:16 -07:00
|
|
|
</div>
|
2021-04-29 23:16:02 -07:00
|
|
|
{submitting ? (
|
2021-07-06 06:25:55 -07:00
|
|
|
<div className="flex h-64 items-center justify-center">
|
2021-04-29 23:16:02 -07:00
|
|
|
<Loading className="h-6 w-6 mb-3 text-primary-light" />
|
|
|
|
</div>
|
|
|
|
) : (
|
|
|
|
<>
|
|
|
|
<div
|
|
|
|
className={`${
|
|
|
|
connected ? 'opacity-100' : 'opacity-30'
|
|
|
|
} pb-6 transiton-all duration-1000 w-full`}
|
|
|
|
>
|
|
|
|
<div className="flex justify-between pb-2">
|
|
|
|
<div className="flex items-center text-xs text-fgd-4">
|
|
|
|
<WalletIcon className="w-4 h-4 mr-1 text-fgd-3 fill-current" />
|
|
|
|
{connected ? (
|
|
|
|
loading ? (
|
|
|
|
<div className="bg-bkg-4 rounded w-10 h-4 animate-pulse" />
|
|
|
|
) : (
|
|
|
|
<span className="font-display text-fgd-1 ml-1">
|
2021-07-05 06:05:35 -07:00
|
|
|
{walletAmount}
|
2021-04-29 23:16:02 -07:00
|
|
|
</span>
|
|
|
|
)
|
2021-04-29 06:51:16 -07:00
|
|
|
) : (
|
2021-04-29 23:16:02 -07:00
|
|
|
'----'
|
|
|
|
)}
|
|
|
|
<img
|
|
|
|
alt=""
|
|
|
|
width="16"
|
|
|
|
height="16"
|
|
|
|
src="/icons/usdc.svg"
|
|
|
|
className={`ml-1`}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div className="flex">
|
|
|
|
{submitted ? (
|
|
|
|
<Button
|
|
|
|
className="ring-1 ring-secondary-1-light ring-inset hover:ring-secondary-1-dark hover:bg-transparent hover:text-secondary-1-dark font-normal rounded text-secondary-1-light text-xs py-0.5 px-1.5 mr-2"
|
|
|
|
disabled={!connected}
|
|
|
|
onClick={() => handleEditContribution()}
|
|
|
|
secondary
|
|
|
|
>
|
|
|
|
Unlock
|
|
|
|
</Button>
|
|
|
|
) : null}
|
2021-04-29 06:51:16 -07:00
|
|
|
<Button
|
2021-04-29 23:16:02 -07:00
|
|
|
className={`${
|
2021-07-05 12:37:28 -07:00
|
|
|
disableFormInputs && 'opacity-30'
|
2021-04-29 23:16:02 -07:00
|
|
|
} bg-bkg-4 font-normal rounded text-fgd-3 text-xs py-0.5 px-1.5`}
|
|
|
|
disabled={disableFormInputs}
|
|
|
|
onClick={() => handleMax()}
|
2021-04-29 06:51:16 -07:00
|
|
|
secondary
|
|
|
|
>
|
2021-04-29 23:16:02 -07:00
|
|
|
Max
|
2021-04-29 06:51:16 -07:00
|
|
|
</Button>
|
2021-04-29 23:16:02 -07:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className="flex items-center pb-4 relative">
|
|
|
|
{submitted ? (
|
|
|
|
<LockClosedIcon className="absolute text-secondary-2-light h-4 w-4 mb-0.5 left-2 z-10" />
|
|
|
|
) : null}
|
|
|
|
{editContribution ? (
|
|
|
|
<LockOpenIcon className="absolute text-secondary-1-light h-4 w-4 mb-0.5 left-2 z-10" />
|
2021-04-29 06:51:16 -07:00
|
|
|
) : null}
|
2021-04-29 23:16:02 -07:00
|
|
|
<Input
|
|
|
|
className={(submitted || editContribution) && 'pl-7'}
|
|
|
|
disabled={disableFormInputs}
|
|
|
|
type="text"
|
|
|
|
onChange={(e) => onChangeAmountInput(e.target.value)}
|
|
|
|
value={loading ? '' : contributionAmount}
|
|
|
|
suffix="USDC"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div
|
|
|
|
className={`${
|
|
|
|
!submitted ? 'opacity-100' : 'opacity-30'
|
|
|
|
} transiton-all duration-1000`}
|
|
|
|
>
|
|
|
|
<div className="pb-20">
|
|
|
|
<Slider
|
|
|
|
disabled={disableFormInputs}
|
2021-07-05 05:34:53 -07:00
|
|
|
value={(100 * contributionAmount) / totalBalance}
|
2021-04-29 23:16:02 -07:00
|
|
|
onChange={(v) => onChangeSlider(v)}
|
|
|
|
step={1}
|
|
|
|
maxButtonTransition={maxButtonTransition}
|
|
|
|
/>
|
|
|
|
</div>
|
2021-04-29 06:51:16 -07:00
|
|
|
<Button
|
2021-04-29 23:16:02 -07:00
|
|
|
onClick={() => handleSetContribution()}
|
|
|
|
className="w-full py-2.5"
|
2021-07-05 06:05:35 -07:00
|
|
|
disabled={disableFormInputs || walletAmount < 0}
|
2021-04-29 06:51:16 -07:00
|
|
|
>
|
2021-04-29 23:16:02 -07:00
|
|
|
<div className={`flex items-center justify-center`}>
|
|
|
|
Set Contribution
|
|
|
|
</div>
|
2021-04-29 06:51:16 -07:00
|
|
|
</Button>
|
|
|
|
</div>
|
|
|
|
</div>
|
2021-07-06 06:25:55 -07:00
|
|
|
<div className="flex justify-center">
|
|
|
|
{connected ? (
|
|
|
|
<Button
|
|
|
|
className="rounded-full bg-bkg-4 text-fgd-3 font-normal"
|
|
|
|
onClick={() => handleConnectDisconnect()}
|
|
|
|
secondary
|
|
|
|
>
|
|
|
|
<div className="flex items-center text-sm">
|
|
|
|
<LinkIcon className="h-4 w-4 mr-1" />
|
|
|
|
Disconnect
|
|
|
|
</div>
|
|
|
|
</Button>
|
|
|
|
) : (
|
|
|
|
<ConnectWalletButtonSmall onClick={handleConnectDisconnect}>
|
|
|
|
<div className="flex items-center justify-center text-sm">
|
|
|
|
<LinkIcon className="h-4 w-4 mr-1" />
|
|
|
|
Connect Wallet
|
|
|
|
</div>
|
|
|
|
</ConnectWalletButtonSmall>
|
|
|
|
)}
|
|
|
|
</div>
|
2021-04-29 23:16:02 -07:00
|
|
|
</>
|
|
|
|
)}
|
2021-07-06 06:25:55 -07:00
|
|
|
</div>
|
|
|
|
<div className="bg-gradient-to-br from-secondary-4-dark to-secondary-4-light border border-bkg-3 col-span-5 p-7 rounded-lg shadow-lg">
|
|
|
|
<div className="border-b border-bkg-4 pb-4 text-center">
|
|
|
|
<p className="text-fgd-3">Estimated Token Price</p>
|
|
|
|
<div className="flex items-center justify-center pt-0.5">
|
|
|
|
<img
|
|
|
|
alt=""
|
|
|
|
width="20"
|
|
|
|
height="20"
|
|
|
|
src="/icons/usdc.svg"
|
|
|
|
className={`mr-2`}
|
|
|
|
/>
|
|
|
|
<div className="font-bold text-fgd-1 text-xl">
|
|
|
|
{vaults.usdc && vaults.mango
|
|
|
|
? `$${vaults.usdc.balance / vaults.mango.balance}`
|
|
|
|
: 'N/A'}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className="border-b border-bkg-4 py-4 text-center">
|
|
|
|
<p className="text-fgd-3">Total USDC Deposited</p>
|
|
|
|
<div className="flex items-center justify-center pt-0.5">
|
|
|
|
<div className="font-bold text-fgd-1 text-base">
|
|
|
|
{`$${vaults.usdc?.balance.toLocaleString()}` || 'N/A'}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className="border-b border-bkg-4 py-4 text-center">
|
|
|
|
<p className="text-fgd-3">Locked MNGO in Pool</p>
|
|
|
|
<div className="flex items-center justify-center pt-0.5">
|
|
|
|
<img className="h-5 mr-2 w-auto" src="/logo.svg" alt="mango" />
|
|
|
|
<div className="font-bold text-fgd-1 text-base">
|
|
|
|
{vaults.mango?.balance.toLocaleString() || 'N/A'}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className="border-b border-bkg-4 py-4 text-center">
|
|
|
|
<p className="text-fgd-3">Deposits Close</p>
|
|
|
|
{pool ? (
|
|
|
|
<Countdown
|
|
|
|
date={endDeposits?.format()}
|
|
|
|
renderer={renderCountdown}
|
|
|
|
/>
|
|
|
|
) : null}
|
|
|
|
</div>
|
|
|
|
<div className="pt-4 text-center">
|
|
|
|
<p className="text-fgd-3">Withdrawals Close</p>
|
|
|
|
{pool ? (
|
|
|
|
<Countdown date={endIdo?.format()} renderer={renderCountdown} />
|
|
|
|
) : null}
|
|
|
|
</div>
|
|
|
|
{/* <p>
|
|
|
|
Start: {startIdo?.fromNow()} ({startIdo?.format()})
|
|
|
|
</p>
|
|
|
|
<p>
|
|
|
|
End Deposits: {endDeposits?.fromNow()} ({endDeposits?.format()})
|
|
|
|
</p>
|
|
|
|
<p>
|
|
|
|
End Withdraws: {endIdo?.fromNow()} ({endIdo?.format()})
|
|
|
|
</p>
|
|
|
|
<p>Current USDC in Pool: {vaults.usdc?.balance || 'N/A'}</p>
|
|
|
|
<p>Locked MNGO in Pool: {vaults.mango?.balance || 'N/A'}</p> */}
|
|
|
|
</div>
|
|
|
|
</>
|
2021-04-26 07:22:30 -07:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
export default ContributionModal
|