mars-v2-frontend/src/components/Modals/Vault/VaultModalContent.tsx
Linkie Link b0c9cca51c
v2.0.5 (#636)
* fix: fixed the trading chart load

* fix: prevent wrapped checkboxes to be double clicked

* fix: refactored funding account modal

* fix: fixed modal classes

* fix: adjusted width classes

* fix: fixed the slider masks

* listed: TIA and USDT

* fix: fixed the slider initial position

* env: version update
2023-11-15 16:27:05 +01:00

187 lines
6.2 KiB
TypeScript

import { useCallback, useMemo, useState } from 'react'
import Accordion from 'components/Accordion'
import AccountSummary from 'components/Account/AccountSummary'
import VaultBorrowings from 'components/Modals/Vault/VaultBorrowings'
import VaultBorrowingsSubTitle from 'components/Modals/Vault/VaultBorrowingsSubTitle'
import VaultDeposit from 'components/Modals/Vault/VaultDeposits'
import VaultDepositSubTitle from 'components/Modals/Vault/VaultDepositsSubTitle'
import Text from 'components/Text'
import { DEFAULT_SETTINGS } from 'constants/defaultSettings'
import { LocalStorageKeys } from 'constants/localStorageKeys'
import { BN_ZERO } from 'constants/math'
import useDepositVault from 'hooks/broadcast/useDepositVault'
import useDisplayAsset from 'hooks/useDisplayAsset'
import useIsOpenArray from 'hooks/useIsOpenArray'
import useLocalStorage from 'hooks/useLocalStorage'
import usePrices from 'hooks/usePrices'
import { useUpdatedAccount } from 'hooks/useUpdatedAccount'
import { BNCoin } from 'types/classes/BNCoin'
import { getCoinValue, magnify } from 'utils/formatters'
import { getCapLeftWithBuffer } from 'utils/generic'
import { mergeBNCoinArrays } from 'utils/helpers'
interface Props {
vault: Vault | DepositedVault
primaryAsset: Asset
secondaryAsset: Asset
account: Account
isDeposited?: boolean
}
export default function VaultModalContent(props: Props) {
const { addedDebts, removedDeposits, removedLends, simulateVaultDeposit } = useUpdatedAccount(
props.account,
)
const { data: prices } = usePrices()
const [displayCurrency] = useLocalStorage<string>(
LocalStorageKeys.DISPLAY_CURRENCY,
DEFAULT_SETTINGS.displayCurrency,
)
const [isOpen, toggleOpen] = useIsOpenArray(2, false)
const [isCustomRatio, setIsCustomRatio] = useState(false)
const [depositCoins, setDepositCoins] = useState<BNCoin[]>([])
const [borrowCoins, setBorrowCoins] = useState<BNCoin[]>([])
const displayAsset = useDisplayAsset()
const { actions: depositActions, totalValue } = useDepositVault({
vault: props.vault,
reclaims: removedLends,
deposits: removedDeposits,
borrowings: addedDebts,
kind: 'default',
})
const depositCapReachedCoins = useMemo(() => {
const capLeft = getCapLeftWithBuffer(props.vault.cap)
if (totalValue.isGreaterThan(capLeft)) {
const amount = magnify(
getCoinValue(
BNCoin.fromDenomAndBigNumber(props.vault.cap.denom, capLeft),
prices,
).toString(),
displayAsset,
)
return [BNCoin.fromDenomAndBigNumber(displayAsset.denom, amount)]
}
return []
}, [displayAsset, prices, props.vault.cap, totalValue])
const onChangeIsCustomRatio = useCallback(
(isCustomRatio: boolean) => setIsCustomRatio(isCustomRatio),
[setIsCustomRatio],
)
const deposits = useMemo(
() => mergeBNCoinArrays(removedDeposits, removedLends),
[removedDeposits, removedLends],
)
const onChangeDeposits = useCallback(
(coins: BNCoin[]) => {
setDepositCoins(coins)
simulateVaultDeposit(props.vault.address, coins, borrowCoins)
},
[borrowCoins, props.vault.address, simulateVaultDeposit],
)
const onChangeBorrowings = useCallback(
(coins: BNCoin[]) => {
setBorrowCoins(coins)
simulateVaultDeposit(props.vault.address, depositCoins, coins)
},
[depositCoins, props.vault.address, simulateVaultDeposit],
)
function getDepositSubTitle() {
if (isOpen[0] && props.isDeposited)
return (
<Text size='xs' className='mt-1 text-white/60'>
The amounts you enter below will be added to your current position.
</Text>
)
if (isOpen[0]) return null
return (
<VaultDepositSubTitle
primaryAmount={
deposits.find((coin) => coin.denom === props.primaryAsset.denom)?.amount || BN_ZERO
}
secondaryAmount={
deposits.find((coin) => coin.denom === props.secondaryAsset.denom)?.amount || BN_ZERO
}
primaryAsset={props.primaryAsset}
secondaryAsset={props.secondaryAsset}
displayCurrency={displayCurrency}
/>
)
}
function getBorrowingsSubTitle() {
if (isOpen[1] && props.isDeposited)
return (
<Text size='xs' className='mt-1 text-white/60'>
The amounts you enter below will be added to your current position.
</Text>
)
if (isOpen[1]) return null
return <VaultBorrowingsSubTitle borrowings={addedDebts} displayCurrency={displayCurrency} />
}
return (
<div className='flex items-start flex-1 gap-6 p-6'>
<Accordion
className='h-[546px] overflow-y-scroll scrollbar-hide flex-1'
items={[
{
renderContent: () => (
<VaultDeposit
deposits={depositCoins}
onChangeDeposits={onChangeDeposits}
primaryAsset={props.primaryAsset}
secondaryAsset={props.secondaryAsset}
account={props.account}
toggleOpen={toggleOpen}
isCustomRatio={isCustomRatio}
onChangeIsCustomRatio={onChangeIsCustomRatio}
depositCapReachedCoins={depositCapReachedCoins}
/>
),
title: 'Deposit',
renderSubTitle: getDepositSubTitle,
isOpen: isOpen[0],
toggleOpen: (index: number) => toggleOpen(index),
},
{
renderContent: () => (
<VaultBorrowings
account={props.account}
borrowings={borrowCoins}
deposits={deposits}
primaryAsset={props.primaryAsset}
secondaryAsset={props.secondaryAsset}
onChangeBorrowings={onChangeBorrowings}
vault={props.vault}
depositActions={depositActions}
depositCapReachedCoins={depositCapReachedCoins}
displayCurrency={displayCurrency}
/>
),
title: 'Borrow',
renderSubTitle: getBorrowingsSubTitle,
isOpen: isOpen[1],
toggleOpen: (index: number) => toggleOpen(index),
},
]}
/>
<AccountSummary account={props.account} />
</div>
)
}