sort markets in drop down by notional volume

This commit is contained in:
saml33 2024-02-07 12:39:36 +11:00
parent 72457a419b
commit 239b0f99b6
4 changed files with 21 additions and 9 deletions

View File

@ -53,13 +53,14 @@ const MARKET_LINK_CLASSES =
const MARKET_LINK_DISABLED_CLASSES = const MARKET_LINK_DISABLED_CLASSES =
'flex w-full items-center justify-between py-2 px-4 md:hover:cursor-not-allowed' 'flex w-full items-center justify-between py-2 px-4 md:hover:cursor-not-allowed'
export const DEFAULT_SORT_KEY: AllowedKeys = 'notionalQuoteVolume'
const MarketSelectDropdown = () => { const MarketSelectDropdown = () => {
const { t } = useTranslation(['common', 'trade']) const { t } = useTranslation(['common', 'trade'])
const { selectedMarket } = useSelectedMarket() const { selectedMarket } = useSelectedMarket()
const [spotOrPerp, setSpotOrPerp] = useState( const [spotOrPerp, setSpotOrPerp] = useState(
selectedMarket instanceof PerpMarket ? 'perp' : 'spot', selectedMarket instanceof PerpMarket ? 'perp' : 'spot',
) )
const defaultSortByKey: AllowedKeys = 'quote_volume_24h'
const [search, setSearch] = useState('') const [search, setSearch] = useState('')
const [isOpen, setIsOpen] = useState(false) const [isOpen, setIsOpen] = useState(false)
const { group } = useMangoGroup() const { group } = useMangoGroup()
@ -81,7 +82,7 @@ const MarketSelectDropdown = () => {
const unsortedPerpMarketsToShow = useMemo(() => { const unsortedPerpMarketsToShow = useMemo(() => {
if (!perpMarketsWithData.length) return [] if (!perpMarketsWithData.length) return []
return sortPerpMarkets(perpMarketsWithData, defaultSortByKey) return sortPerpMarkets(perpMarketsWithData, DEFAULT_SORT_KEY)
}, [perpMarketsWithData]) }, [perpMarketsWithData])
const spotQuoteTokens: string[] = useMemo(() => { const spotQuoteTokens: string[] = useMemo(() => {
@ -109,11 +110,11 @@ const MarketSelectDropdown = () => {
}) })
return search return search
? startSearch(filteredMarkets, search) ? startSearch(filteredMarkets, search)
: sortSpotMarkets(filteredMarkets, defaultSortByKey) : sortSpotMarkets(filteredMarkets, DEFAULT_SORT_KEY)
} else { } else {
return search return search
? startSearch(serumMarketsWithData, search) ? startSearch(serumMarketsWithData, search)
: sortSpotMarkets(serumMarketsWithData, defaultSortByKey) : sortSpotMarkets(serumMarketsWithData, DEFAULT_SORT_KEY)
} }
}, [group, search, serumMarketsWithData, spotBaseFilter]) }, [group, search, serumMarketsWithData, spotBaseFilter])
@ -369,9 +370,9 @@ const MarketSelectDropdown = () => {
</p> </p>
<p className="col-span-1 hidden sm:flex sm:justify-end"> <p className="col-span-1 hidden sm:flex sm:justify-end">
<SortableColumnHeader <SortableColumnHeader
sortKey="marketData.quote_volume_24h" sortKey="marketData.notionalQuoteVolume"
sort={() => sort={() =>
requestSerumSort('marketData.quote_volume_24h') requestSerumSort('marketData.notionalQuoteVolume')
} }
sortConfig={serumSortConfig} sortConfig={serumSortConfig}
title={t('daily-volume')} title={t('daily-volume')}

View File

@ -67,6 +67,7 @@ export default function useListedMarketsWithMarketData() {
const serumMarketsWithData = useMemo(() => { const serumMarketsWithData = useMemo(() => {
if (!serumMarkets || !serumMarkets.length) return [] if (!serumMarkets || !serumMarkets.length) return []
const group = mangoStore.getState().group
const allSpotMarkets: SerumMarketWithMarketData[] = const allSpotMarkets: SerumMarketWithMarketData[] =
serumMarkets as SerumMarketWithMarketData[] serumMarkets as SerumMarketWithMarketData[]
if (spotData && birdeyeSpotDailyPrices?.length) { if (spotData && birdeyeSpotDailyPrices?.length) {
@ -74,6 +75,15 @@ export default function useListedMarketsWithMarketData() {
const spotEntries = Object.entries(spotData).find( const spotEntries = Object.entries(spotData).find(
(e) => e[0].toLowerCase() === market.name.toLowerCase(), (e) => e[0].toLowerCase() === market.name.toLowerCase(),
) )
const marketData = spotEntries
? spotEntries[1][0]
: ({} as MarketsDataItem)
const quoteBankPrice = group?.getFirstBankByTokenIndex(
market.quoteTokenIndex,
)?.uiPrice
marketData.notionalQuoteVolume = marketData?.quote_volume_24h
? marketData?.quote_volume_24h * (quoteBankPrice || 1)
: 0
const birdeyePrices = birdeyeSpotDailyPrices.find( const birdeyePrices = birdeyeSpotDailyPrices.find(
(prices) => prices.marketIndex === market.marketIndex, (prices) => prices.marketIndex === market.marketIndex,
) )
@ -98,10 +108,9 @@ export default function useListedMarketsWithMarketData() {
const change = currentPrice const change = currentPrice
? ((currentPrice - pastPrice) / pastPrice) * 100 ? ((currentPrice - pastPrice) / pastPrice) * 100
: 0 : 0
market.rollingChange = change market.rollingChange = change
market.priceHistory = priceHistory market.priceHistory = priceHistory
market.marketData = spotEntries ? spotEntries[1][0] : undefined market.marketData = marketData
} }
} }
return [...allSpotMarkets].sort((a, b) => a.name.localeCompare(b.name)) return [...allSpotMarkets].sort((a, b) => a.name.localeCompare(b.name))
@ -132,7 +141,7 @@ export default function useListedMarketsWithMarketData() {
.sort((a, b) => .sort((a, b) =>
a.oracleLastUpdatedSlot == 0 ? -1 : a.name.localeCompare(b.name), a.oracleLastUpdatedSlot == 0 ? -1 : a.name.localeCompare(b.name),
) )
}, [perpData, perpMarkets]) }, [currentPrices, perpData, perpMarkets])
const isLoading = loadingMarketsData || loadingBirdeyeSpotDailyPrices const isLoading = loadingMarketsData || loadingBirdeyeSpotDailyPrices

View File

@ -535,6 +535,7 @@ export type MarketsDataItem = {
price_history: { price: number; time: string }[] | undefined price_history: { price: number; time: string }[] | undefined
quote_volume_1h: number quote_volume_1h: number
quote_volume_24h: number quote_volume_24h: number
notionalQuoteVolume: number | undefined
} }
export type cumOrderbookSide = { export type cumOrderbookSide = {

View File

@ -4,6 +4,7 @@ import {
} from 'hooks/useListedMarketsWithMarketData' } from 'hooks/useListedMarketsWithMarketData'
export type AllowedKeys = export type AllowedKeys =
| 'notionalQuoteVolume'
| 'quote_volume_24h' | 'quote_volume_24h'
| 'quote_volume_1h' | 'quote_volume_1h'
| 'change_24h' | 'change_24h'