mango-v4-ui/components/stats/TokenStatsCharts.tsx

166 lines
5.5 KiB
TypeScript
Raw Normal View History

2023-02-23 16:28:49 -08:00
import mangoStore from '@store/mangoStore'
import { useTranslation } from 'next-i18next'
import dynamic from 'next/dynamic'
import { useEffect, useMemo, useState } from 'react'
import dayjs from 'dayjs'
2023-01-19 02:42:39 -08:00
import { formatYAxis } from 'utils/formatting'
2023-01-29 20:13:38 -08:00
import useBanksWithBalances from 'hooks/useBanksWithBalances'
2023-02-23 16:28:49 -08:00
import { TokenStatsItem } from 'types'
import useMangoGroup from 'hooks/useMangoGroup'
2023-04-23 23:21:05 -07:00
import { toUiDecimals } from '@blockworks-foundation/mango-v4'
const DetailedAreaChart = dynamic(
() => import('@components/shared/DetailedAreaChart'),
{ ssr: false }
)
interface TotalValueItem {
date: string
borrowValue: number
depositValue: number
2023-04-23 23:21:05 -07:00
feesCollected: number
}
2023-04-23 23:21:05 -07:00
const TokenStatsCharts = () => {
const { t } = useTranslation(['common', 'token', 'trade'])
const { group } = useMangoGroup()
2023-02-09 16:38:20 -08:00
const tokenStats = mangoStore((s) => s.tokenStats.data)
const initialStatsLoad = mangoStore((s) => s.tokenStats.initialLoad)
2023-02-09 16:38:20 -08:00
const loadingStats = mangoStore((s) => s.tokenStats.loading)
const [borrowDaysToShow, setBorrowDaysToShow] = useState('30')
const [depositDaysToShow, setDepositDaysToShow] = useState('30')
2023-01-29 20:13:38 -08:00
const banks = useBanksWithBalances()
useEffect(() => {
if (group && !initialStatsLoad) {
const actions = mangoStore.getState().actions
actions.fetchTokenStats()
}
}, [group, initialStatsLoad])
2023-04-23 23:21:05 -07:00
const tokenStatsValues = useMemo(() => {
if (!tokenStats || !banks.length) return []
const values: TotalValueItem[] = tokenStats.reduce(
(a: TotalValueItem[], c: TokenStatsItem) => {
2023-04-23 23:21:05 -07:00
const bank = banks.find(
(b) => b.bank.tokenIndex === c.token_index
)?.bank
const hasDate = a.find((d: TotalValueItem) => d.date === c.date_hour)
if (!hasDate) {
a.push({
date: c.date_hour,
depositValue: Math.floor(c.total_deposits * c.price),
borrowValue: Math.floor(c.total_borrows * c.price),
2023-04-23 23:21:05 -07:00
feesCollected: c.collected_fees * bank!.uiPrice,
})
} else {
hasDate.depositValue =
hasDate.depositValue + Math.floor(c.total_deposits * c.price)
hasDate.borrowValue =
hasDate.borrowValue + Math.floor(c.total_borrows * c.price)
2023-04-23 23:21:05 -07:00
hasDate.feesCollected =
hasDate.feesCollected + c.collected_fees * bank!.uiPrice
}
return a.sort(
(a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()
)
},
[]
)
return values
2023-04-23 23:21:05 -07:00
}, [banks, tokenStats])
2023-04-23 23:21:05 -07:00
const [
currentTotalDepositValue,
currentTotalBorrowValue,
currentCollectedFeesValue,
] = useMemo(() => {
if (banks.length) {
return [
2023-01-29 20:13:38 -08:00
banks.reduce((a, c) => a + c.bank.uiPrice * c.bank.uiDeposits(), 0),
banks.reduce((a, c) => a + c.bank.uiPrice * c.bank.uiBorrows(), 0),
2023-04-23 23:21:05 -07:00
banks.reduce(
(a, c) =>
a +
c.bank.uiPrice *
toUiDecimals(c.bank.collectedFeesNative, c.bank.mintDecimals),
0
),
]
}
2023-04-23 23:21:05 -07:00
return [0, 0, 0]
}, [banks])
2023-04-23 23:21:05 -07:00
return tokenStatsValues.length ? (
<>
2023-04-23 23:21:05 -07:00
<div className="col-span-2 border-b border-th-bkg-3 py-4 px-6 md:col-span-1 md:border-r">
<DetailedAreaChart
2023-04-23 23:21:05 -07:00
data={tokenStatsValues.concat([
{
date: dayjs().toISOString(),
depositValue: Math.floor(currentTotalDepositValue),
borrowValue: Math.floor(currentTotalBorrowValue),
2023-04-23 23:21:05 -07:00
feesCollected: currentCollectedFeesValue,
},
])}
daysToShow={depositDaysToShow}
setDaysToShow={setDepositDaysToShow}
2023-01-19 16:56:22 -08:00
loading={loadingStats}
heightClass="h-64"
2023-01-19 16:56:22 -08:00
loaderHeightClass="h-[350px]"
prefix="$"
2023-01-19 02:42:39 -08:00
tickFormat={(x) => `$${formatYAxis(x)}`}
title={t('total-deposit-value')}
xKey="date"
yKey={'depositValue'}
/>
</div>
2023-04-23 23:21:05 -07:00
<div className="col-span-2 border-b border-th-bkg-3 py-4 px-6 md:col-span-1 md:pl-6">
<DetailedAreaChart
2023-04-23 23:21:05 -07:00
data={tokenStatsValues.concat([
{
date: dayjs().toISOString(),
borrowValue: Math.floor(currentTotalBorrowValue),
depositValue: Math.floor(currentTotalDepositValue),
2023-04-23 23:21:05 -07:00
feesCollected: currentCollectedFeesValue,
},
])}
daysToShow={borrowDaysToShow}
setDaysToShow={setBorrowDaysToShow}
heightClass="h-64"
2023-01-19 16:56:22 -08:00
loaderHeightClass="h-[350px]"
loading={loadingStats}
prefix="$"
2023-01-19 02:42:39 -08:00
tickFormat={(x) => `$${formatYAxis(x)}`}
title={t('total-borrow-value')}
xKey="date"
yKey={'borrowValue'}
/>
</div>
2023-04-23 23:21:05 -07:00
<div className="col-span-2 border-b border-th-bkg-3 py-4 px-6 md:col-span-1 md:border-r md:pl-6">
<DetailedAreaChart
data={tokenStatsValues.concat([
{
date: dayjs().toISOString(),
borrowValue: Math.floor(currentTotalBorrowValue),
depositValue: Math.floor(currentTotalDepositValue),
feesCollected: currentCollectedFeesValue,
},
])}
daysToShow={borrowDaysToShow}
setDaysToShow={setBorrowDaysToShow}
heightClass="h-64"
loaderHeightClass="h-[350px]"
loading={loadingStats}
prefix="$"
tickFormat={(x) => `$${formatYAxis(x)}`}
title={t('token:token-fees-collected')}
xKey="date"
yKey={'feesCollected'}
/>
</div>
</>
) : null
}
2023-04-23 23:21:05 -07:00
export default TokenStatsCharts