import FormatNumericValue from '@components/shared/FormatNumericValue' import { Table, Td, Th, TrBody, TrHead } from '@components/shared/TableElements' import TokenLogo from '@components/shared/TokenLogo' import Tooltip from '@components/shared/Tooltip' import { Disclosure, Transition } from '@headlessui/react' import { ChevronDownIcon } from '@heroicons/react/20/solid' import { useTranslation } from 'next-i18next' import useMangoGroup from 'hooks/useMangoGroup' import useMangoAccount from 'hooks/useMangoAccount' import { useViewport } from 'hooks/useViewport' import { MouseEventHandler } from 'react' import { ContributionDetails, HealthContribution } from 'types' const TokensHealthTable = ({ initTokens, maintTokens, handleLegendClick, handleLegendMouseEnter, handleLegendMouseLeave, }: { initTokens: HealthContribution[] maintTokens: HealthContribution[] handleLegendClick: (cont: HealthContribution) => void handleLegendMouseEnter: (cont: HealthContribution) => void handleLegendMouseLeave: MouseEventHandler }) => { const { t } = useTranslation(['common', 'account', 'trade']) const { group } = useMangoGroup() const { mangoAccount } = useMangoAccount() const { isMobile } = useViewport() return group && mangoAccount ? ( !isMobile ? ( {maintTokens .sort((a, b) => b.contribution - a.contribution) .map((cont) => { const { asset, contribution, contributionDetails, isAsset, hasPerp, } = cont const bank = group.banksMapByName.get(asset)?.[0] let initAssetWeight = 0 let initLiabWeight = 0 let maintAssetWeight = 0 let maintLiabWeight = 0 let balance = 0 if (bank) { initAssetWeight = bank .scaledInitAssetWeight(bank.price) .toNumber() initLiabWeight = bank .scaledInitLiabWeight(bank.price) .toNumber() maintAssetWeight = bank.maintAssetWeight.toNumber() maintLiabWeight = bank.maintLiabWeight.toNumber() balance = mangoAccount.getTokenBalanceUi(bank) } const assetOrLiabMultiplier = isAsset ? 1 : -1 const initToken = initTokens.find((cont) => cont.asset === asset) const initContribution = (initToken?.contribution || 0) * assetOrLiabMultiplier const maintContribution = contribution * assetOrLiabMultiplier return ( handleLegendClick(cont)} onMouseEnter={() => handleLegendMouseEnter(cont)} onMouseLeave={handleLegendMouseLeave} > ) })}
{t('token')} {t('trade:notional')}
{t('account:init-health-contribution')}
{t('account:maint-health-contribution')}

{asset}

{bank ? (

{' '}

) : ( '–' )}
} >

{initContribution > 0 ? initAssetWeight.toFixed(2) : initContribution < 0 ? initLiabWeight.toFixed(2) : 0} x

} >

{maintContribution > 0 ? maintAssetWeight.toFixed(2) : maintContribution < 0 ? maintLiabWeight.toFixed(2) : 0} x

) : (
{maintTokens .sort((a, b) => b.contribution - a.contribution) .map((cont) => { const { asset, contribution, contributionDetails, isAsset, hasPerp, } = cont const bank = group.banksMapByName.get(asset)?.[0] let initAssetWeight = 0 let initLiabWeight = 0 let maintAssetWeight = 0 let maintLiabWeight = 0 let balance = 0 if (bank) { initAssetWeight = bank .scaledInitAssetWeight(bank.price) .toNumber() initLiabWeight = bank.scaledInitLiabWeight(bank.price).toNumber() maintAssetWeight = bank.maintAssetWeight.toNumber() maintLiabWeight = bank.maintLiabWeight.toNumber() balance = mangoAccount.getTokenBalanceUi(bank) } const assetOrLiabMultiplier = isAsset ? 1 : -1 const initToken = initTokens.find((cont) => cont.asset === asset) const initContribution = (initToken?.contribution || 0) * assetOrLiabMultiplier const maintContribution = contribution * assetOrLiabMultiplier return ( {({ open }) => ( <>

{asset}

{t('trade:notional')}

{bank ? ( {' '} ) : ( '–' )}

{t('account:init-health-contribution')}

} >

{initContribution > 0 ? initAssetWeight.toFixed(2) : initContribution < 0 ? initLiabWeight.toFixed(2) : 0} x

{t('account:maint-health-contribution')}

} >

{maintContribution > 0 ? maintAssetWeight.toFixed(2) : maintContribution < 0 ? maintLiabWeight.toFixed(2) : 0} x

)}
) })}
) ) : null } export default TokensHealthTable const UsdcTooltipContent = ({ contributions, }: { contributions: ContributionDetails | undefined }) => { const { t } = useTranslation('common') if (!contributions) return null const { perpMarketContributions, spotUi } = contributions return ( <>

{t('spot')}

{perpMarketContributions .filter((cont) => Math.abs(cont.contributionUi) > 0.01) .map((perp) => (

{perp.market}

))}
) }