import FormatNumericValue from '@components/shared/FormatNumericValue' import { Table, Td, Th, TrBody, TrHead } from '@components/shared/TableElements' 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 MarketLogos from '@components/trade/MarketLogos' import { HealthContribution } from 'types' const MarketsHealthTable = ({ initMarkets, maintMarkets, handleLegendClick, handleLegendMouseEnter, handleLegendMouseLeave, }: { initMarkets: HealthContribution[] maintMarkets: 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 ? ( {maintMarkets .sort((a, b) => b.contribution - a.contribution) .map((cont) => { const { asset, contribution, isAsset } = cont const market = group.getSerum3MarketByName(asset) const bank = group.banksMapByTokenIndex.get( market.baseTokenIndex, )?.[0] let initAssetWeight = 0 let initLiabWeight = 0 let maintAssetWeight = 0 let maintLiabWeight = 0 if (bank) { initAssetWeight = bank .scaledInitAssetWeight(bank.price) .toNumber() initLiabWeight = bank .scaledInitLiabWeight(bank.price) .toNumber() maintAssetWeight = bank.maintAssetWeight.toNumber() maintLiabWeight = bank.maintLiabWeight.toNumber() } const assetOrLiabMultiplier = isAsset ? 1 : -1 const initContribution = (initMarkets.find((cont) => cont.asset === asset) ?.contribution || 0) * assetOrLiabMultiplier const maintContribution = contribution * assetOrLiabMultiplier return ( handleLegendClick(cont)} onMouseEnter={() => handleLegendMouseEnter(cont)} onMouseLeave={handleLegendMouseLeave} > ) })}
{t('market')}
{t('account:init-health-contribution')}
{t('account:maint-health-contribution')}

{asset}

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

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

) : (
{maintMarkets .sort((a, b) => b.contribution - a.contribution) .map((cont) => { const { asset, contribution, isAsset } = cont const market = group.getSerum3MarketByName(asset) const bank = group.banksMapByTokenIndex.get( market.baseTokenIndex, )?.[0] let initAssetWeight = 0 let initLiabWeight = 0 let maintAssetWeight = 0 let maintLiabWeight = 0 if (bank) { initAssetWeight = bank .scaledInitAssetWeight(bank.price) .toNumber() initLiabWeight = bank.scaledInitLiabWeight(bank.price).toNumber() maintAssetWeight = bank.maintAssetWeight.toNumber() maintLiabWeight = bank.maintLiabWeight.toNumber() } const assetOrLiabMultiplier = isAsset ? 1 : -1 const initContribution = (initMarkets.find((cont) => cont.asset === asset)?.contribution || 0) * assetOrLiabMultiplier const maintContribution = contribution * assetOrLiabMultiplier return ( {({ open }) => ( <>

{asset}

{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 MarketsHealthTable