mars-v2-frontend/src/components/Modals/HLS/Deposit/index.tsx
Bob van der Helm 1ecd80dac2
Hls leverage (#628)
* Add basic modal for HLS staking

* UI components for Manage

* All Manage actions (except change lev)

* 🐛hls intro icons + checkbox, hide repay when no debt, clickable dropdown

* fix build

* finish all actiosn for HLS staking

* 🐛clean up tooltip props
2023-11-10 17:20:48 +01:00

175 lines
4.9 KiB
TypeScript

import React, { useMemo, useState } from 'react'
import Accordion from 'components/Accordion'
import useStakingController from 'components/Modals/HLS/Deposit//useStakingController'
import useVaultController from 'components/Modals/HLS/Deposit//useVaultController'
import useAccordionItems from 'components/Modals/HLS/Deposit/useAccordionItems'
import { EMPTY_ACCOUNT_HLS } from 'constants/accounts'
import useAccounts from 'hooks/useAccounts'
import useCurrentWalletBalance from 'hooks/useCurrentWalletBalance'
import useIsOpenArray from 'hooks/useIsOpenArray'
import useVault from 'hooks/useVault'
import useStore from 'store'
import { isAccountEmpty } from 'utils/accounts'
interface Props {
borrowAsset: Asset
collateralAsset: Asset
vaultAddress: string | null
strategy?: HLSStrategy
}
export default function Controller(props: Props) {
const [selectedAccount, setSelectedAccount] = useState<Account>(EMPTY_ACCOUNT_HLS)
const [isOpen, toggleIsOpen] = useIsOpenArray(4, false)
const address = useStore((s) => s.address)
const { data: hlsAccounts } = useAccounts('high_levered_strategy', address)
const emptyHlsAccounts = useMemo(
() => hlsAccounts.filter((account) => isAccountEmpty(account)),
[hlsAccounts],
)
const walletCollateralAsset = useCurrentWalletBalance(props.collateralAsset.denom)
const vault = useVault(props.vaultAddress || '')
if (vault)
return (
<Vault
walletCollateralAsset={walletCollateralAsset}
vault={vault}
collateralAsset={props.collateralAsset}
borrowAsset={props.borrowAsset}
emptyHlsAccounts={emptyHlsAccounts}
hlsAccounts={hlsAccounts}
isOpen={isOpen}
selectedAccount={selectedAccount}
setSelectedAccount={setSelectedAccount}
toggleIsOpen={toggleIsOpen}
/>
)
if (props.strategy) {
return (
<StakingContent
walletCollateralAsset={walletCollateralAsset}
collateralAsset={props.collateralAsset}
borrowAsset={props.borrowAsset}
emptyHlsAccounts={emptyHlsAccounts}
hlsAccounts={hlsAccounts}
isOpen={isOpen}
selectedAccount={selectedAccount}
setSelectedAccount={setSelectedAccount}
toggleIsOpen={toggleIsOpen}
strategy={props.strategy}
/>
)
}
return null
}
interface ContentProps {
borrowAsset: Asset
collateralAsset: Asset
emptyHlsAccounts: Account[]
hlsAccounts: Account[]
isOpen: boolean[]
selectedAccount: Account
setSelectedAccount: (account: Account) => void
toggleIsOpen: (index: number) => void
walletCollateralAsset: Coin | undefined
}
interface VaultContentProps extends ContentProps {
vault: Vault
}
function Vault(props: VaultContentProps) {
const {
borrowAmount,
depositAmount,
execute,
leverage,
maxBorrowAmount,
onChangeCollateral,
onChangeDebt,
positionValue,
updatedAccount,
} = useVaultController({
vault: props.vault,
collateralAsset: props.collateralAsset,
borrowAsset: props.borrowAsset,
selectedAccount: props.selectedAccount,
})
const items = useAccordionItems({
apy: props.vault.apy || 0,
borrowAmount,
borrowAsset: props.borrowAsset,
collateralAsset: props.collateralAsset,
depositAmount,
emptyHlsAccounts: props.emptyHlsAccounts,
execute,
hlsAccounts: props.hlsAccounts,
isOpen: props.isOpen,
leverage,
maxBorrowAmount,
onChangeCollateral,
onChangeDebt,
positionValue,
selectedAccount: props.selectedAccount,
setSelectedAccount: props.setSelectedAccount,
toggleIsOpen: props.toggleIsOpen,
updatedAccount,
walletCollateralAsset: props.walletCollateralAsset,
})
return <Accordion className='h-[546px] overflow-y-scroll scrollbar-hide' items={items} />
}
interface StakingContentProps extends ContentProps {
strategy: HLSStrategy
}
function StakingContent(props: StakingContentProps) {
const {
depositAmount,
onChangeCollateral,
updatedAccount,
borrowAmount,
onChangeDebt,
leverage,
maxBorrowAmount,
positionValue,
execute,
} = useStakingController({
collateralAsset: props.collateralAsset,
borrowAsset: props.borrowAsset,
selectedAccount: props.selectedAccount,
})
const items = useAccordionItems({
borrowAmount,
borrowAsset: props.borrowAsset,
collateralAsset: props.collateralAsset,
depositAmount,
emptyHlsAccounts: props.emptyHlsAccounts,
execute,
hlsAccounts: props.hlsAccounts,
isOpen: props.isOpen,
leverage,
onChangeCollateral,
onChangeDebt,
positionValue,
selectedAccount: props.selectedAccount,
setSelectedAccount: props.setSelectedAccount,
strategy: props.strategy,
toggleIsOpen: props.toggleIsOpen,
updatedAccount,
maxBorrowAmount,
apy: props.strategy.apy || 0, // TODO: Implement APY
walletCollateralAsset: props.walletCollateralAsset,
})
return <Accordion className='h-[546px] overflow-y-scroll scrollbar-hide' items={items} />
}