70 lines
2.4 KiB
TypeScript
70 lines
2.4 KiB
TypeScript
import { MarketData, MarketsDataItem } from 'types'
|
|
import useMarketsData from './useMarketsData'
|
|
import { useMemo } from 'react'
|
|
import mangoStore from '@store/mangoStore'
|
|
import { PerpMarket, Serum3Market } from '@blockworks-foundation/mango-v4'
|
|
|
|
type ApiData = {
|
|
marketData: MarketsDataItem | undefined
|
|
}
|
|
|
|
export type SerumMarketWithMarketData = Serum3Market & ApiData
|
|
|
|
export type PerpMarketWithMarketData = PerpMarket & ApiData
|
|
|
|
export default function useListedMarketsWithMarketData() {
|
|
const { data: marketsData, isLoading, isFetching } = useMarketsData()
|
|
const serumMarkets = mangoStore((s) => s.serumMarkets)
|
|
const perpMarkets = mangoStore((s) => s.perpMarkets)
|
|
|
|
const perpData: MarketData = useMemo(() => {
|
|
if (!marketsData) return []
|
|
return marketsData?.perpData || []
|
|
}, [marketsData])
|
|
|
|
const spotData: MarketData = useMemo(() => {
|
|
if (!marketsData) return []
|
|
return marketsData?.spotData || []
|
|
}, [marketsData])
|
|
|
|
const serumMarketsWithData = useMemo(() => {
|
|
if (!serumMarkets || !serumMarkets.length) return []
|
|
const allSpotMarkets: SerumMarketWithMarketData[] =
|
|
serumMarkets as SerumMarketWithMarketData[]
|
|
if (spotData) {
|
|
for (const market of allSpotMarkets) {
|
|
const spotEntries = Object.entries(spotData).find(
|
|
(e) => e[0].toLowerCase() === market.name.toLowerCase(),
|
|
)
|
|
market.marketData = spotEntries ? spotEntries[1][0] : undefined
|
|
}
|
|
}
|
|
return [...allSpotMarkets].sort((a, b) => a.name.localeCompare(b.name))
|
|
}, [spotData, serumMarkets])
|
|
|
|
const perpMarketsWithData = useMemo(() => {
|
|
if (!perpMarkets || !perpMarkets.length) return []
|
|
const allPerpMarkets: PerpMarketWithMarketData[] =
|
|
perpMarkets as PerpMarketWithMarketData[]
|
|
if (perpData) {
|
|
for (const market of allPerpMarkets) {
|
|
const perpEntries = Object.entries(perpData).find(
|
|
(e) => e[0].toLowerCase() === market.name.toLowerCase(),
|
|
)
|
|
market.marketData = perpEntries ? perpEntries[1][0] : undefined
|
|
}
|
|
}
|
|
return allPerpMarkets
|
|
.filter(
|
|
(p) =>
|
|
p.publicKey.toString() !==
|
|
'9Y8paZ5wUpzLFfQuHz8j2RtPrKsDtHx9sbgFmWb5abCw',
|
|
)
|
|
.sort((a, b) =>
|
|
a.oracleLastUpdatedSlot == 0 ? -1 : a.name.localeCompare(b.name),
|
|
)
|
|
}, [perpData, perpMarkets])
|
|
|
|
return { perpMarketsWithData, serumMarketsWithData, isLoading, isFetching }
|
|
}
|