import classNames from 'classnames'
import { HTMLAttributes, useCallback, useMemo } from 'react'
import Accordion from 'components/common/Accordion'
import AccountBalancesTable from 'components/account/AccountBalancesTable'
import AccountComposition from 'components/account/AccountComposition'
import HealthBar from 'components/account/Health/HealthBar'
import Card from 'components/common/Card'
import DisplayCurrency from 'components/common/DisplayCurrency'
import { FormattedNumber } from 'components/common/FormattedNumber'
import { ArrowRight } from 'components/common/Icons'
import Text from 'components/common/Text'
import { DEFAULT_SETTINGS } from 'constants/defaultSettings'
import { LocalStorageKeys } from 'constants/localStorageKeys'
import { BN_ZERO } from 'constants/math'
import { ORACLE_DENOM } from 'constants/oracle'
import useAllAssets from 'hooks/assets/useAllAssets'
import useLocalStorage from 'hooks/localStorage/useLocalStorage'
import useBorrowMarketAssetsTableData from 'hooks/useBorrowMarketAssetsTableData'
import useHealthComputer from 'hooks/useHealthComputer'
import useLendingMarketAssetsTableData from 'hooks/useLendingMarketAssetsTableData'
import usePrices from 'hooks/usePrices'
import useStore from 'store'
import { BNCoin } from 'types/classes/BNCoin'
import { calculateAccountBalanceValue, calculateAccountLeverage } from 'utils/accounts'
interface Props {
account: Account
isHls?: boolean
}
export default function AccountSummary(props: Props) {
const [accountSummaryTabs, setAccountSummaryTabs] = useLocalStorage(
LocalStorageKeys.ACCOUNT_SUMMARY_TABS,
DEFAULT_SETTINGS.accountSummaryTabs,
)
const { data: prices } = usePrices()
const assets = useAllAssets()
const updatedAccount = useStore((s) => s.updatedAccount)
const accountBalance = useMemo(
() =>
props.account
? calculateAccountBalanceValue(updatedAccount ?? props.account, prices, assets)
: BN_ZERO,
[props.account, updatedAccount, prices, assets],
)
const { data } = useBorrowMarketAssetsTableData(false)
const borrowAssetsData = useMemo(() => data?.allAssets || [], [data])
const { availableAssets: lendingAvailableAssets, accountLentAssets } =
useLendingMarketAssetsTableData()
const lendingAssetsData = useMemo(
() => [...lendingAvailableAssets, ...accountLentAssets],
[lendingAvailableAssets, accountLentAssets],
)
const { health, healthFactor } = useHealthComputer(props.account)
const { health: updatedHealth, healthFactor: updatedHealthFactor } =
useHealthComputer(updatedAccount)
const leverage = useMemo(
() => (props.account ? calculateAccountLeverage(props.account, prices, assets) : BN_ZERO),
[props.account, prices, assets],
)
const updatedLeverage = useMemo(() => {
if (!updatedAccount) return null
const updatedLeverage = calculateAccountLeverage(updatedAccount, prices, assets)
if (updatedLeverage.eq(leverage)) return null
return updatedLeverage
}, [updatedAccount, prices, assets, leverage])
const handleToggle = useCallback(
(index: number) => {
setAccountSummaryTabs(accountSummaryTabs.map((tab, i) => (i === index ? !tab : tab)))
},
[accountSummaryTabs, setAccountSummaryTabs],
)
if (!props.account) return null
return (
-
-
{updatedLeverage && (
<>
>
)}
-
props.account ? (
) : null,
isOpen: accountSummaryTabs[0],
toggleOpen: (index: number) => handleToggle(index),
renderSubTitle: () => <>>,
},
{
title: 'Balances',
renderContent: () =>
props.account ? (
) : null,
isOpen: accountSummaryTabs[1],
toggleOpen: (index: number) => handleToggle(index),
renderSubTitle: () => <>>,
},
]}
allowMultipleOpen
/>
)
}
interface ItemProps extends HTMLAttributes {
label: string
classes?: string
}
function Item(props: ItemProps) {
return (
{props.label}
{props.children}
)
}