mango-v4-ui/components/trade/RecentTrades.tsx

119 lines
3.8 KiB
TypeScript
Raw Normal View History

2022-09-20 13:05:50 -07:00
import useInterval from '@components/shared/useInterval'
import mangoStore, { CLUSTER } from '@store/mangoStore'
import { useCallback, useEffect, useMemo, useState } from 'react'
import isEqual from 'lodash/isEqual'
import { floorToDecimal, getDecimalCount } from 'utils/numbers'
import Decimal from 'decimal.js'
import { ChartTradeType } from 'types'
import { useTranslation } from 'next-i18next'
2022-10-10 19:16:13 -07:00
import { Serum3Market } from '@blockworks-foundation/mango-v4'
2022-09-20 13:05:50 -07:00
const RecentTrades = () => {
2022-10-03 03:38:05 -07:00
const { t } = useTranslation(['common', 'trade'])
2022-09-20 13:05:50 -07:00
const [trades, setTrades] = useState<any[]>([])
const selectedMarket = mangoStore((s) => s.selectedMarket.current)
2022-10-10 19:16:13 -07:00
const market = useMemo(() => {
2022-09-20 13:05:50 -07:00
const group = mangoStore.getState().group
2022-10-10 19:16:13 -07:00
if (!group || !selectedMarket) return
if (selectedMarket instanceof Serum3Market) {
return group?.getSerum3ExternalMarket(selectedMarket.serumMarketExternal)
} else {
return selectedMarket
}
}, [selectedMarket])
2022-09-20 13:05:50 -07:00
const baseSymbol = useMemo(() => {
return selectedMarket?.name.split('/')[0]
}, [selectedMarket])
const quoteSymbol = useMemo(() => {
return selectedMarket?.name.split('/')[1]
}, [selectedMarket])
const fetchTradesForChart = useCallback(async () => {
2022-10-10 19:16:13 -07:00
if (!market) return
2022-09-20 13:05:50 -07:00
2022-09-28 09:45:38 -07:00
try {
const response = await fetch(
2022-10-10 19:16:13 -07:00
`https://event-history-api-candles.herokuapp.com/trades/address/${market.publicKey}`
2022-09-28 09:45:38 -07:00
)
const parsedResp = await response.json()
const newTrades = parsedResp.data
if (!newTrades) return null
2022-09-20 13:05:50 -07:00
2022-09-28 09:45:38 -07:00
if (newTrades.length && trades.length === 0) {
setTrades(newTrades)
} else if (newTrades?.length && !isEqual(newTrades[0], trades[0])) {
setTrades(newTrades)
}
} catch (e) {
console.error('Unable to fetch recent trades', e)
2022-09-20 13:05:50 -07:00
}
2022-10-10 19:16:13 -07:00
}, [market, trades])
2022-09-20 13:05:50 -07:00
useEffect(() => {
if (CLUSTER === 'mainnet-beta') {
fetchTradesForChart()
}
}, [fetchTradesForChart])
useInterval(async () => {
if (CLUSTER === 'mainnet-beta') {
fetchTradesForChart()
}
}, 5000)
return (
2022-11-20 03:06:54 -08:00
<div className="thin-scroll h-full overflow-y-scroll px-2">
<table className="min-w-full">
<thead>
<tr className="text-right text-xxs text-th-fgd-4">
<th className="py-2 font-normal">{`${t(
'price'
)} (${quoteSymbol})`}</th>
<th className="py-2 font-normal">
{t('trade:size')} ({baseSymbol})
</th>
<th className="py-2 font-normal">{t('time')}</th>
</tr>
</thead>
<tbody>
{!!trades.length &&
trades.map((trade: ChartTradeType, i: number) => {
const formattedPrice = market?.tickSize
? floorToDecimal(trade.price, getDecimalCount(market.tickSize))
: new Decimal(trade?.price || 0)
2022-09-20 13:05:50 -07:00
2022-11-20 03:06:54 -08:00
const formattedSize = market?.minOrderSize
? floorToDecimal(
trade.size,
getDecimalCount(market.minOrderSize)
)
: new Decimal(trade?.size || 0)
return (
<tr className="font-mono text-xs" key={i}>
<td
className={`pb-1.5 text-right ${
trade.side === 'buy' ? `text-th-green` : `text-th-red`
}`}
>
{formattedPrice.toFixed()}
</td>
<td className="pb-1.5 text-right">
{formattedSize.toFixed()}
</td>
<td className="pb-1.5 text-right text-th-fgd-4">
{trade.time && new Date(trade.time).toLocaleTimeString()}
</td>
</tr>
)
})}
</tbody>
</table>
2022-09-22 14:45:25 -07:00
</div>
2022-09-20 13:05:50 -07:00
)
}
export default RecentTrades