import classNames from 'classnames' import { useCallback, useMemo } from 'react' import AccountBalancesTable from 'components/Account/AccountBalancesTable' import AccountComposition from 'components/Account/AccountComposition' import AccountDetailsLeverage from 'components/Account/AccountDetails/AccountDetailsLeverage' import Skeleton from 'components/Account/AccountDetails/Skeleton' import EscButton from 'components/Button/EscButton' import { glowElement } from 'components/Button/utils' import Card from 'components/Card' import DisplayCurrency from 'components/DisplayCurrency' import { FormattedNumber } from 'components/FormattedNumber' import { HealthGauge } from 'components/HealthGauge' import { ThreeDots } from 'components/Icons' import Text from 'components/Text' import { DEFAULT_SETTINGS } from 'constants/defaultSettings' import { REDUCE_MOTION_KEY } from 'constants/localStore' import { ORACLE_DENOM } from 'constants/oracle' import useAccountId from 'hooks/useAccountId' import useAccounts from 'hooks/useAccounts' import useBorrowMarketAssetsTableData from 'hooks/useBorrowMarketAssetsTableData' import useCurrentAccount from 'hooks/useCurrentAccount' import useHealthComputer from 'hooks/useHealthComputer' import useLendingMarketAssetsTableData from 'hooks/useLendingMarketAssetsTableData' import useLocalStorage from 'hooks/useLocalStorage' import usePrices from 'hooks/usePrices' import useStore from 'store' import { BNCoin } from 'types/classes/BNCoin' import { calculateAccountApr, calculateAccountBalanceValue, calculateAccountLeverage, } from 'utils/accounts' export default function AccountDetailsController() { const address = useStore((s) => s.address) const { isLoading } = useAccounts(address) const accountId = useAccountId() const account = useCurrentAccount() const focusComponent = useStore((s) => s.focusComponent) if (!address || focusComponent) return null if ((isLoading && accountId && !focusComponent) || !account) return return } interface Props { account: Account } function AccountDetails(props: Props) { const { account } = props const [reduceMotion] = useLocalStorage(REDUCE_MOTION_KEY, DEFAULT_SETTINGS.reduceMotion) const updatedAccount = useStore((s) => s.updatedAccount) const accountDetailsExpanded = useStore((s) => s.accountDetailsExpanded) const { health } = useHealthComputer(account) const { health: updatedHealth } = useHealthComputer(updatedAccount || account) const { data: prices } = usePrices() const accountBalanceValue = useMemo( () => calculateAccountBalanceValue(updatedAccount ?? account, prices), [updatedAccount, account, prices], ) const coin = BNCoin.fromDenomAndBigNumber(ORACLE_DENOM, accountBalanceValue) const leverage = useMemo(() => calculateAccountLeverage(account, prices), [account, prices]) const updatedLeverage = useMemo(() => { if (!updatedAccount) return null const updatedLeverage = calculateAccountLeverage(updatedAccount, prices) if (updatedLeverage.eq(leverage)) return null return updatedLeverage }, [updatedAccount, prices, leverage]) const { availableAssets: borrowAvailableAssets, accountBorrowedAssets } = useBorrowMarketAssetsTableData() const { availableAssets: lendingAvailableAssets, accountLentAssets } = useLendingMarketAssetsTableData() const borrowAssetsData = useMemo( () => [...borrowAvailableAssets, ...accountBorrowedAssets], [borrowAvailableAssets, accountBorrowedAssets], ) const lendingAssetsData = useMemo( () => [...lendingAvailableAssets, ...accountLentAssets], [lendingAvailableAssets, accountLentAssets], ) const apr = useMemo( () => calculateAccountApr(account, borrowAssetsData, lendingAssetsData, prices), [account, borrowAssetsData, lendingAssetsData, prices], ) function AccountDetailsHeader() { const onClose = useCallback(() => useStore.setState({ accountDetailsExpanded: false }), []) return (
{`Credit Account ${account.id}`}
) } return (
useStore.setState({ accountDetailsExpanded: !accountDetailsExpanded })} >
Account Health
Net worth
Leverage
APR
{!accountDetailsExpanded && }
{glowElement(!reduceMotion)}
}> Balances
) }