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'
|
|
|
|
|
|
|
|
const RecentTrades = () => {
|
|
|
|
const { t } = useTranslation('common')
|
|
|
|
const [trades, setTrades] = useState<any[]>([])
|
|
|
|
const selectedMarket = mangoStore((s) => s.selectedMarket.current)
|
|
|
|
const selectedMarketPk = selectedMarket?.serumMarketExternal.toBase58()
|
|
|
|
|
|
|
|
const serum3MarketExternal = useMemo(() => {
|
|
|
|
const group = mangoStore.getState().group
|
|
|
|
if (!group || !selectedMarketPk) return
|
|
|
|
return group.serum3MarketExternalsMap.get(selectedMarketPk)
|
|
|
|
}, [selectedMarketPk])
|
|
|
|
|
|
|
|
const baseSymbol = useMemo(() => {
|
|
|
|
return selectedMarket?.name.split('/')[0]
|
|
|
|
}, [selectedMarket])
|
|
|
|
|
|
|
|
const quoteSymbol = useMemo(() => {
|
|
|
|
return selectedMarket?.name.split('/')[1]
|
|
|
|
}, [selectedMarket])
|
|
|
|
|
|
|
|
const fetchTradesForChart = useCallback(async () => {
|
|
|
|
if (!selectedMarketPk) return
|
|
|
|
|
|
|
|
const response = await fetch(
|
|
|
|
`https://event-history-api-candles.herokuapp.com/trades/address/${selectedMarketPk}`
|
|
|
|
)
|
|
|
|
const parsedResp = await response.json()
|
|
|
|
const newTrades = parsedResp.data
|
|
|
|
if (!newTrades) return null
|
|
|
|
|
|
|
|
if (newTrades.length && trades.length === 0) {
|
|
|
|
setTrades(newTrades)
|
|
|
|
} else if (newTrades?.length && !isEqual(newTrades[0], trades[0])) {
|
|
|
|
setTrades(newTrades)
|
|
|
|
}
|
|
|
|
}, [selectedMarketPk, trades])
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
if (CLUSTER === 'mainnet-beta') {
|
|
|
|
fetchTradesForChart()
|
|
|
|
}
|
|
|
|
}, [fetchTradesForChart])
|
|
|
|
|
|
|
|
useInterval(async () => {
|
|
|
|
if (CLUSTER === 'mainnet-beta') {
|
|
|
|
fetchTradesForChart()
|
|
|
|
}
|
|
|
|
}, 5000)
|
|
|
|
return (
|
2022-09-22 14:45:25 -07:00
|
|
|
<div className="h-full overflow-y-scroll ">
|
2022-09-21 21:46:30 -07:00
|
|
|
<div className={`mb-1 grid grid-cols-3 px-4 pt-2 text-xxs text-th-fgd-4`}>
|
2022-09-22 14:45:25 -07:00
|
|
|
<div className="text-right">{`${t('price')} (${quoteSymbol})`} </div>
|
2022-09-20 13:05:50 -07:00
|
|
|
<div className={`text-right`}>
|
|
|
|
{t('size')} ({baseSymbol})
|
|
|
|
</div>
|
|
|
|
<div className={`text-right`}>{t('time')}</div>
|
|
|
|
</div>
|
|
|
|
{!!trades.length && (
|
2022-09-22 03:46:51 -07:00
|
|
|
<div className="px-4 font-mono text-xs">
|
2022-09-20 13:05:50 -07:00
|
|
|
{trades.map((trade: ChartTradeType, i: number) => {
|
|
|
|
const formattedPrice = serum3MarketExternal?.tickSize
|
|
|
|
? floorToDecimal(
|
|
|
|
trade.price,
|
|
|
|
getDecimalCount(serum3MarketExternal.tickSize)
|
|
|
|
)
|
|
|
|
: new Decimal(trade?.price || 0)
|
|
|
|
|
|
|
|
const formattedSize = serum3MarketExternal?.minOrderSize
|
|
|
|
? floorToDecimal(
|
|
|
|
trade.size,
|
|
|
|
getDecimalCount(serum3MarketExternal.minOrderSize)
|
|
|
|
)
|
|
|
|
: new Decimal(trade?.size || 0)
|
|
|
|
return (
|
|
|
|
<div key={i} className={`grid grid-cols-3 leading-6`}>
|
|
|
|
<div
|
2022-09-22 14:45:25 -07:00
|
|
|
className={`text-right ${
|
2022-09-20 13:05:50 -07:00
|
|
|
trade.side === 'buy' ? `text-th-green` : `text-th-red`
|
|
|
|
}`}
|
|
|
|
>
|
|
|
|
{formattedPrice.toFixed()}
|
|
|
|
</div>
|
2022-09-21 21:46:30 -07:00
|
|
|
<div className={`text-right text-th-fgd-2`}>
|
2022-09-20 13:05:50 -07:00
|
|
|
{formattedSize.toFixed()}
|
|
|
|
</div>
|
2022-09-21 21:46:30 -07:00
|
|
|
<div className={`text-right text-th-fgd-4`}>
|
2022-09-20 13:05:50 -07:00
|
|
|
{trade.time && new Date(trade.time).toLocaleTimeString()}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
})}
|
|
|
|
</div>
|
|
|
|
)}
|
2022-09-22 14:45:25 -07:00
|
|
|
</div>
|
2022-09-20 13:05:50 -07:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
export default RecentTrades
|