2021-04-26 07:22:30 -07:00
|
|
|
import { useEffect, useState } from 'react'
|
2021-07-06 14:21:30 -07:00
|
|
|
import {
|
|
|
|
ExclamationCircleIcon,
|
|
|
|
LockClosedIcon,
|
|
|
|
LockOpenIcon,
|
2021-07-22 10:00:48 -07:00
|
|
|
RefreshIcon,
|
2021-07-06 14:21:30 -07:00
|
|
|
} from '@heroicons/react/outline'
|
2021-04-26 07:22:30 -07:00
|
|
|
import useWalletStore from '../stores/useWalletStore'
|
|
|
|
import Input from './Input'
|
|
|
|
import Button from './Button'
|
2021-07-16 03:18:21 -07:00
|
|
|
import ConnectWalletButton from './ConnectWalletButton'
|
2021-07-23 14:09:36 -07:00
|
|
|
//import PoolCountdown from './PoolCountdown'
|
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-23 14:09:36 -07:00
|
|
|
//import useVaults from '../hooks/useVaults'
|
2021-07-07 04:16:54 -07:00
|
|
|
import usePool from '../hooks/usePool'
|
2021-07-14 18:11:43 -07:00
|
|
|
import styled from '@emotion/styled'
|
|
|
|
import 'twin.macro'
|
2021-07-21 16:11:46 -07:00
|
|
|
import { notify } from '../utils/notifications'
|
2021-07-28 05:08:46 -07:00
|
|
|
import useIpAddress from '../hooks/useIpAddress'
|
2021-07-14 18:11:43 -07:00
|
|
|
|
|
|
|
const SmallButton = styled.button``
|
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-23 14:09:36 -07:00
|
|
|
//const vaults = useVaults()
|
2021-07-07 04:16:54 -07:00
|
|
|
const { endIdo, endDeposits } = usePool()
|
2021-07-28 05:08:46 -07:00
|
|
|
const { ipAllowed } = useIpAddress()
|
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-06 15:35:53 -07:00
|
|
|
// const mangoRedeemable = vaults.usdc
|
|
|
|
// ? (redeemableBalance * vaults.mango.balance) / vaults.usdc.balance
|
|
|
|
// : 0
|
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-07-06 14:21:30 -07:00
|
|
|
const [errorMessage, setErrorMessage] = useState(null)
|
2021-07-22 10:00:48 -07:00
|
|
|
const [refreshing, setRefreshing] = useState(false)
|
2021-04-26 07:22:30 -07:00
|
|
|
|
2021-08-09 10:59:35 -07:00
|
|
|
const usdFormat = new Intl.NumberFormat('en-US')
|
|
|
|
|
2021-07-23 14:09:36 -07:00
|
|
|
//onst priceFormat = new Intl.NumberFormat('en-US', {
|
|
|
|
// maximumSignificantDigits: 4,
|
|
|
|
//})
|
2021-07-16 09:07:37 -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)
|
2021-07-07 04:16:54 -07:00
|
|
|
if (endDeposits?.isBefore() && amount > redeemableBalance) {
|
2021-08-08 04:42:21 -07:00
|
|
|
setErrorMessage('Deposits ended, contribution cannot increase')
|
2021-07-06 15:35:53 -07:00
|
|
|
setTimeout(() => setErrorMessage(null), 4000)
|
2021-07-06 15:03:58 -07:00
|
|
|
}
|
2021-04-29 06:51:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
const onChangeSlider = (percentage) => {
|
2021-07-06 14:21:30 -07:00
|
|
|
let newContribution = Math.round(percentage * totalBalance) / 100
|
2021-07-07 04:16:54 -07:00
|
|
|
if (endDeposits?.isBefore() && newContribution > redeemableBalance) {
|
2021-07-06 15:35:53 -07:00
|
|
|
newContribution = redeemableBalance
|
2021-08-08 04:42:21 -07:00
|
|
|
setErrorMessage('Deposits ended, contribution cannot increase')
|
2021-07-06 15:35:53 -07:00
|
|
|
setTimeout(() => setErrorMessage(null), 4000)
|
2021-07-06 14:21:30 -07:00
|
|
|
}
|
|
|
|
|
2021-07-05 06:05:35 -07:00
|
|
|
setWalletAmount(totalBalance - newContribution)
|
|
|
|
setContributionAmount(newContribution)
|
2021-04-29 06:51:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
const handleMax = () => {
|
2021-07-07 04:16:54 -07:00
|
|
|
if (endDeposits?.isAfter()) {
|
2021-07-06 14:21:30 -07:00
|
|
|
setWalletAmount(0)
|
|
|
|
setContributionAmount(totalBalance)
|
|
|
|
} else {
|
|
|
|
setWalletAmount(usdcBalance)
|
|
|
|
setContributionAmount(redeemableBalance)
|
|
|
|
}
|
|
|
|
|
2021-04-29 18:40:11 -07:00
|
|
|
setMaxButtonTransition(true)
|
2021-04-26 07:22:30 -07:00
|
|
|
}
|
|
|
|
|
2021-07-22 10:00:48 -07:00
|
|
|
const handleRefresh = async () => {
|
|
|
|
setRefreshing(true)
|
|
|
|
try {
|
|
|
|
await actions.fetchWalletTokenAccounts()
|
|
|
|
} finally {
|
|
|
|
setTimeout(() => setRefreshing(false), 1000)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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-21 16:11:46 -07:00
|
|
|
try {
|
|
|
|
await actions.submitContribution(contributionAmount)
|
2021-07-21 16:53:35 -07:00
|
|
|
setSubmitted(true)
|
|
|
|
setSubmitting(false)
|
2021-07-21 16:11:46 -07:00
|
|
|
} catch (e) {
|
|
|
|
notify({ type: 'error', message: e.message })
|
|
|
|
console.error(e.message)
|
|
|
|
setSubmitted(false)
|
|
|
|
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-08-06 10:45:42 -07:00
|
|
|
const hasUSDC = usdcBalance > 0 || redeemableBalance > 0
|
2021-08-09 10:59:35 -07:00
|
|
|
const difference = contributionAmount - redeemableBalance
|
2021-08-06 10:45:42 -07:00
|
|
|
|
2021-07-22 11:10:00 -07:00
|
|
|
const toLateToDeposit =
|
2021-08-09 10:59:35 -07:00
|
|
|
endDeposits?.isBefore() &&
|
|
|
|
endIdo.isAfter() &&
|
|
|
|
!largestAccounts.redeemable?.balance
|
2021-07-22 11:10:00 -07:00
|
|
|
|
|
|
|
const disableFormInputs =
|
|
|
|
submitted || !connected || loading || (connected && toLateToDeposit)
|
2021-04-29 18:40:11 -07:00
|
|
|
|
2021-07-06 15:35:53 -07:00
|
|
|
const dontAddMore =
|
2021-07-07 04:16:54 -07:00
|
|
|
endDeposits?.isBefore() && contributionAmount > redeemableBalance
|
2021-08-10 08:45:06 -07:00
|
|
|
const disableSubmit = disableFormInputs || difference == 0 || dontAddMore
|
2021-07-06 15:35:53 -07:00
|
|
|
|
2021-04-26 07:22:30 -07:00
|
|
|
return (
|
2021-07-06 06:25:55 -07:00
|
|
|
<>
|
2021-08-09 12:47:19 -07:00
|
|
|
<div className="flex-1 flex-col bg-bkg-2 border border-bkg-3 p-7 rounded-xl shadow-md z-10">
|
2021-07-24 06:19:16 -07:00
|
|
|
<div className="pb-4 text-center">
|
|
|
|
{!submitted &&
|
|
|
|
!submitting &&
|
|
|
|
!editContribution &&
|
|
|
|
!(connected && toLateToDeposit) && (
|
2021-07-22 09:39:55 -07:00
|
|
|
<>
|
2021-07-24 06:19:16 -07:00
|
|
|
<h2>The journey starts here.</h2>
|
2021-08-09 12:47:19 -07:00
|
|
|
<p>When you're ready, deposit your USDC.</p>
|
2021-07-22 09:39:55 -07:00
|
|
|
</>
|
2021-07-22 11:10:00 -07:00
|
|
|
)}
|
2021-04-29 06:51:16 -07:00
|
|
|
|
2021-07-24 06:19:16 -07:00
|
|
|
{!submitted &&
|
|
|
|
!submitting &&
|
|
|
|
!editContribution &&
|
|
|
|
connected &&
|
|
|
|
toLateToDeposit && (
|
2021-07-22 09:39:55 -07:00
|
|
|
<>
|
2021-07-24 06:19:16 -07:00
|
|
|
<h2>We're sorry, you missed it.</h2>
|
2021-08-09 12:47:19 -07:00
|
|
|
<p>The sale period has ended.</p>
|
2021-07-22 09:39:55 -07:00
|
|
|
</>
|
2021-07-22 11:10:00 -07:00
|
|
|
)}
|
2021-04-29 06:51:16 -07:00
|
|
|
|
2021-07-24 06:19:16 -07:00
|
|
|
{!submitted && submitting && (
|
2021-07-22 09:39:55 -07:00
|
|
|
<>
|
2021-08-09 12:47:19 -07:00
|
|
|
<h2>Approve the transaction.</h2>
|
2021-07-24 06:19:16 -07:00
|
|
|
<p>Almost there...</p>
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
|
|
|
|
{submitted && !submitting && (
|
|
|
|
<>
|
2021-08-09 10:59:35 -07:00
|
|
|
<h2>
|
2021-08-09 12:47:19 -07:00
|
|
|
You've contributed ${usdFormat.format(contributionAmount)}.
|
2021-08-09 10:59:35 -07:00
|
|
|
</h2>
|
2021-08-09 12:47:19 -07:00
|
|
|
<p>Unlock to edit your contribution amount.</p>
|
2021-07-24 06:19:16 -07:00
|
|
|
</>
|
|
|
|
)}
|
|
|
|
|
|
|
|
{editContribution && !submitting && (
|
|
|
|
<>
|
2021-08-09 10:59:35 -07:00
|
|
|
<h2>
|
2021-08-09 12:47:19 -07:00
|
|
|
You've contributed ${usdFormat.format(redeemableBalance)}.
|
|
|
|
</h2>
|
2021-08-08 04:42:21 -07:00
|
|
|
<p>
|
|
|
|
{endDeposits?.isBefore() && endIdo?.isAfter()
|
2021-08-09 10:59:35 -07:00
|
|
|
? 'You can only reduce your contribution during the grace period. Reducing cannot be reversed.'
|
2021-08-09 12:47:19 -07:00
|
|
|
: 'Increase or reduce your contribution.'}
|
2021-08-08 04:42:21 -07:00
|
|
|
</p>
|
2021-07-24 06:19:16 -07:00
|
|
|
</>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
{submitting ? (
|
|
|
|
<div className="flex h-64 items-center justify-center">
|
|
|
|
<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">
|
|
|
|
<a
|
|
|
|
onClick={handleRefresh}
|
2021-08-06 10:45:42 -07:00
|
|
|
className={
|
|
|
|
refreshing ? 'animate-spin' : 'hover:cursor-pointer'
|
|
|
|
}
|
2021-07-24 06:19:16 -07:00
|
|
|
>
|
|
|
|
<RefreshIcon
|
|
|
|
className={`w-4 h-4`}
|
|
|
|
style={{ transform: 'scaleX(-1)' }}
|
2021-07-22 09:39:55 -07:00
|
|
|
/>
|
2021-07-24 06:19:16 -07:00
|
|
|
</a>
|
2021-08-08 04:42:21 -07:00
|
|
|
<div title="Wallet Icon">
|
|
|
|
<WalletIcon className="w-4 h-4 mx-1 text-fgd-3 fill-current" />
|
|
|
|
</div>
|
2021-07-24 06:19:16 -07:00
|
|
|
{connected ? (
|
|
|
|
loading ? (
|
|
|
|
<div className="bg-bkg-4 rounded w-10 h-4 animate-pulse" />
|
|
|
|
) : (
|
2021-08-08 04:42:21 -07:00
|
|
|
<span
|
|
|
|
className="font-display text-fgd-3 ml-1"
|
|
|
|
title="Wallet USDC"
|
|
|
|
>
|
2021-08-09 10:59:35 -07:00
|
|
|
{usdFormat.format(walletAmount)}
|
2021-07-24 06:19:16 -07:00
|
|
|
</span>
|
|
|
|
)
|
|
|
|
) : (
|
|
|
|
'----'
|
|
|
|
)}
|
|
|
|
<img
|
|
|
|
alt=""
|
2021-08-08 04:42:21 -07:00
|
|
|
title="Wallet USDC"
|
2021-07-24 06:19:16 -07:00
|
|
|
width="16"
|
|
|
|
height="16"
|
|
|
|
src="/icons/usdc.svg"
|
2021-08-08 04:42:21 -07:00
|
|
|
className="ml-1 opacity-75"
|
2021-07-24 06:19:16 -07:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div className="flex">
|
|
|
|
{submitted ? (
|
2021-07-14 18:11:43 -07:00
|
|
|
<SmallButton
|
2021-07-24 06:19:16 -07:00
|
|
|
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()}
|
2021-04-29 23:16:02 -07:00
|
|
|
>
|
2021-07-24 06:19:16 -07:00
|
|
|
Unlock
|
2021-07-14 18:11:43 -07:00
|
|
|
</SmallButton>
|
2021-07-22 09:39:55 -07:00
|
|
|
) : null}
|
2021-07-24 06:19:16 -07:00
|
|
|
<SmallButton
|
|
|
|
className={`${
|
|
|
|
disableFormInputs && 'opacity-30'
|
|
|
|
} bg-bkg-4 hover:bg-bkg-3 font-normal rounded text-fgd-3 text-xs py-0.5 px-1.5`}
|
|
|
|
disabled={disableFormInputs}
|
|
|
|
onClick={() => handleMax()}
|
|
|
|
>
|
|
|
|
Max
|
|
|
|
</SmallButton>
|
|
|
|
</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" />
|
|
|
|
) : null}
|
|
|
|
<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-12">
|
|
|
|
<Slider
|
2021-04-29 23:16:02 -07:00
|
|
|
disabled={disableFormInputs}
|
2021-07-24 06:19:16 -07:00
|
|
|
value={(100 * contributionAmount) / totalBalance}
|
|
|
|
onChange={(v) => onChangeSlider(v)}
|
|
|
|
step={1}
|
|
|
|
maxButtonTransition={maxButtonTransition}
|
2021-04-29 23:16:02 -07:00
|
|
|
/>
|
|
|
|
</div>
|
2021-07-24 06:19:16 -07:00
|
|
|
<div className="h-12 pb-4">
|
|
|
|
{errorMessage && (
|
|
|
|
<div className="flex items-center pt-1.5 text-secondary-2-light">
|
|
|
|
<ExclamationCircleIcon className="h-4 w-4 mr-1.5" />
|
|
|
|
{errorMessage}
|
2021-07-22 09:39:55 -07:00
|
|
|
</div>
|
2021-07-24 06:19:16 -07:00
|
|
|
)}
|
2021-07-22 09:39:55 -07:00
|
|
|
</div>
|
2021-07-28 05:08:46 -07:00
|
|
|
{ipAllowed || !connected ? (
|
|
|
|
<Button
|
|
|
|
onClick={() => handleSetContribution()}
|
|
|
|
className="w-full py-2.5"
|
|
|
|
disabled={disableSubmit}
|
|
|
|
>
|
|
|
|
<div className={`flex items-center justify-center`}>
|
|
|
|
{dontAddMore
|
2021-08-09 12:49:42 -07:00
|
|
|
? "Sorry you can't add anymore 🥲"
|
|
|
|
: !hasUSDC && connected
|
|
|
|
? 'Your USDC balance is 0'
|
|
|
|
: difference >= 0
|
|
|
|
? `Deposit $${usdFormat.format(difference)}`
|
|
|
|
: `Withdraw $${usdFormat.format(-difference)}`}
|
2021-07-28 05:08:46 -07:00
|
|
|
</div>
|
|
|
|
</Button>
|
|
|
|
) : (
|
|
|
|
<Button className="w-full py-2.5" disabled>
|
|
|
|
<div className={`flex items-center justify-center`}>
|
2021-08-09 13:14:57 -07:00
|
|
|
Country Not Allowed 🇺🇸😭
|
2021-07-28 05:08:46 -07:00
|
|
|
</div>
|
|
|
|
</Button>
|
|
|
|
)}
|
2021-04-29 06:51:16 -07:00
|
|
|
</div>
|
2021-07-24 06:19:16 -07:00
|
|
|
</div>
|
|
|
|
<div className="flex items-center justify-center">
|
|
|
|
<ConnectWalletButton onClick={handleConnectDisconnect} />
|
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
</div>
|
2021-07-06 06:25:55 -07:00
|
|
|
</>
|
2021-04-26 07:22:30 -07:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
export default ContributionModal
|