mango-v4-ui/components/stats/perps/PerpMarketDetails.tsx

113 lines
3.7 KiB
TypeScript
Raw Normal View History

2022-12-30 03:40:52 -08:00
import mangoStore from '@store/mangoStore'
2023-02-10 04:55:06 -08:00
import dayjs from 'dayjs'
2022-12-30 03:40:52 -08:00
import { useTranslation } from 'next-i18next'
2023-02-10 04:55:06 -08:00
import { useMemo, useState } from 'react'
2023-01-24 16:54:24 -08:00
import { formatYAxis } from 'utils/formatting'
2023-03-07 09:48:25 -08:00
import { PerpStatsItem } from 'types'
2023-03-07 15:12:40 -08:00
import { PerpMarket } from '@blockworks-foundation/mango-v4'
import DetailedAreaOrBarChart from '@components/shared/DetailedAreaOrBarChart'
import AverageFundingChart from './AverageFundingChart'
2023-06-05 04:06:37 -07:00
const CHART_WRAPPER_CLASSES =
'col-span-2 lg:col-span-1 border-b border-th-bkg-3 py-4 px-6'
2023-05-02 20:05:23 -07:00
import PerpMarketParams from './PerpMarketParams'
2023-05-31 20:03:56 -07:00
import PerpVolumeChart from './PerpVolumeChart'
2022-12-30 03:40:52 -08:00
const PerpMarketDetails = ({
2023-04-11 20:38:21 -07:00
marketStats,
2023-03-07 15:12:40 -08:00
perpMarket,
2022-12-30 03:40:52 -08:00
}: {
2023-04-11 20:38:21 -07:00
marketStats: PerpStatsItem[]
2023-03-07 15:12:40 -08:00
perpMarket: PerpMarket
2022-12-30 03:40:52 -08:00
}) => {
const { t } = useTranslation(['common', 'trade'])
const loadingPerpStats = mangoStore((s) => s.perpStats.loading)
2023-02-10 04:55:06 -08:00
const [priceDaysToShow, setPriceDaysToShow] = useState('30')
const [oiDaysToShow, setOiDaysToShow] = useState('30')
2022-12-30 03:40:52 -08:00
const openInterestChartData = useMemo(() => {
if (!marketStats || !marketStats.length) return []
const data = []
for (const stat of marketStats) {
const openInterest = stat.open_interest * stat.price
data.push({ date_hour: stat.date_hour, open_interest: openInterest })
}
return data
}, [marketStats])
2023-04-11 20:38:21 -07:00
const lastStat = useMemo(() => {
if (!marketStats.length) return undefined
return marketStats[marketStats.length - 1]
}, [marketStats])
2022-12-30 03:40:52 -08:00
return (
<div className="grid grid-cols-2">
{marketStats?.length && lastStat && perpMarket ? (
2022-12-30 03:40:52 -08:00
<>
2023-06-05 04:06:37 -07:00
<div className={`${CHART_WRAPPER_CLASSES} lg:border-r`}>
2023-05-31 20:03:56 -07:00
<PerpVolumeChart
loading={loadingPerpStats}
marketStats={marketStats}
/>
</div>
<div className={CHART_WRAPPER_CLASSES}>
<DetailedAreaOrBarChart
data={openInterestChartData.concat([
2023-02-10 04:55:06 -08:00
{
date_hour: dayjs().toISOString(),
open_interest:
perpMarket.baseLotsToUi(perpMarket.openInterest) *
perpMarket.uiPrice ||
lastStat.open_interest * lastStat.price,
2023-02-10 04:55:06 -08:00
},
])}
daysToShow={oiDaysToShow}
setDaysToShow={setOiDaysToShow}
2022-12-30 03:40:52 -08:00
heightClass="h-64"
2023-02-10 04:55:06 -08:00
loading={loadingPerpStats}
loaderHeightClass="h-[350px]"
prefix="$"
2023-02-10 04:55:06 -08:00
tickFormat={(x) => formatYAxis(x)}
2022-12-30 03:40:52 -08:00
title={t('trade:open-interest')}
xKey="date_hour"
yKey={'open_interest'}
/>
</div>
2023-06-05 04:06:37 -07:00
<div className={`${CHART_WRAPPER_CLASSES} lg:border-r`}>
<AverageFundingChart
loading={loadingPerpStats}
marketStats={marketStats}
/>
</div>
<div className={CHART_WRAPPER_CLASSES}>
<DetailedAreaOrBarChart
data={marketStats.concat([
{
...lastStat,
date_hour: dayjs().toISOString(),
price: perpMarket.uiPrice || lastStat.price,
},
])}
daysToShow={priceDaysToShow}
setDaysToShow={setPriceDaysToShow}
heightClass="h-64"
loading={loadingPerpStats}
loaderHeightClass="h-[350px]"
prefix="$"
tickFormat={(x) => formatYAxis(x)}
title={t('price')}
xKey="date_hour"
yKey={'price'}
/>
2023-03-29 09:28:52 -07:00
</div>
2022-12-30 03:40:52 -08:00
</>
) : null}
2023-05-02 20:05:23 -07:00
<div className="col-span-2">
<PerpMarketParams market={perpMarket} />
</div>
2022-12-30 03:40:52 -08:00
</div>
)
2022-12-20 00:16:05 -08:00
}
export default PerpMarketDetails