import { PerpMarket } from '@blockworks-foundation/mango-v4' import { IconButton, LinkButton } from '@components/shared/Button' import Change from '@components/shared/Change' import { getOneDayPerpStats } from '@components/stats/PerpMarketsInfoTable' import { ChartBarIcon, InformationCircleIcon } from '@heroicons/react/20/solid' import mangoStore from '@store/mangoStore' import useSelectedMarket from 'hooks/useSelectedMarket' import { useTranslation } from 'next-i18next' import { useEffect, useMemo, useState } from 'react' import { numberCompacter } from 'utils/numbers' import MarketSelectDropdown from './MarketSelectDropdown' import PerpFundingRate from './PerpFundingRate' import { useBirdeyeMarketPrices } from 'hooks/useBirdeyeMarketPrices' import SheenLoader from '@components/shared/SheenLoader' import usePrevious from '@components/shared/usePrevious' import PerpMarketDetailsModal from '@components/modals/PerpMarketDetailsModal' import useMangoGroup from 'hooks/useMangoGroup' import OraclePrice from './OraclePrice' import SpotMarketDetailsModal from '@components/modals/SpotMarketDetailsModal' const AdvancedMarketHeader = ({ showChart, setShowChart, }: { showChart?: boolean setShowChart?: (x: boolean) => void }) => { const { t } = useTranslation(['common', 'trade']) const perpStats = mangoStore((s) => s.perpStats.data) const loadingPerpStats = mangoStore((s) => s.perpStats.loading) const { serumOrPerpMarket, price: stalePrice, selectedMarket, } = useSelectedMarket() const selectedMarketName = mangoStore((s) => s.selectedMarket.name) const [changePrice, setChangePrice] = useState(stalePrice) const { data: birdeyePrices, isLoading: loadingPrices } = useBirdeyeMarketPrices() const previousMarketName = usePrevious(selectedMarketName) const [showMarketDetails, setShowMarketDetails] = useState(false) const { group } = useMangoGroup() useEffect(() => { if (group) { const actions = mangoStore.getState().actions actions.fetchPerpStats() } }, [group]) const birdeyeData = useMemo(() => { if ( !birdeyePrices?.length || !selectedMarket || selectedMarket instanceof PerpMarket ) return return birdeyePrices.find( (m) => m.mint === selectedMarket.serumMarketExternal.toString() ) }, [birdeyePrices, selectedMarket]) const change = useMemo(() => { if ( !changePrice || !serumOrPerpMarket || selectedMarketName !== previousMarketName ) return 0 if (serumOrPerpMarket instanceof PerpMarket) { const changeData = getOneDayPerpStats(perpStats, selectedMarketName) return changeData.length ? ((changePrice - changeData[0].price) / changeData[0].price) * 100 : 0 } else { if (!birdeyeData) return 0 return ( ((changePrice - birdeyeData.data[0].value) / birdeyeData.data[0].value) * 100 ) } }, [ birdeyeData, changePrice, serumOrPerpMarket, perpStats, previousMarketName, selectedMarketName, ]) return ( <>
<>
{t('rolling-change')}
{!loadingPrices && !loadingPerpStats ? ( ) : (
)}
{serumOrPerpMarket instanceof PerpMarket ? ( <>
{t('trade:open-interest')}
$ {numberCompacter.format( serumOrPerpMarket.baseLotsToUi( serumOrPerpMarket.openInterest ) * serumOrPerpMarket.uiPrice )} | {numberCompacter.format( serumOrPerpMarket.baseLotsToUi( serumOrPerpMarket.openInterest ) )}{' '} {serumOrPerpMarket.name.split('-')[0]}
) : null}
setShowMarketDetails(true)} > {t('trade:market-details', { market: '' })} {setShowChart ? ( setShowChart(!showChart)} hideBg > ) : null}
{showMarketDetails ? ( selectedMarket instanceof PerpMarket ? ( setShowMarketDetails(false)} market={selectedMarket} /> ) : ( setShowMarketDetails(false)} market={selectedMarket} /> ) ) : null} ) } export default AdvancedMarketHeader