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' import { Serum3Market } from '@blockworks-foundation/mango-v4' const RecentTrades = () => { const { t } = useTranslation(['common', 'trade']) const [trades, setTrades] = useState([]) const selectedMarket = mangoStore((s) => s.selectedMarket.current) const market = useMemo(() => { const group = mangoStore.getState().group if (!group || !selectedMarket) return if (selectedMarket instanceof Serum3Market) { return group?.getSerum3ExternalMarket(selectedMarket.serumMarketExternal) } else { return selectedMarket } }, [selectedMarket]) const baseSymbol = useMemo(() => { return selectedMarket?.name.split('/')[0] }, [selectedMarket]) const quoteSymbol = useMemo(() => { return selectedMarket?.name.split('/')[1] }, [selectedMarket]) const fetchTradesForChart = useCallback(async () => { if (!market) return try { const response = await fetch( `https://event-history-api-candles.herokuapp.com/trades/address/${market.publicKey}` ) 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) } } catch (e) { console.error('Unable to fetch recent trades', e) } }, [market, trades]) useEffect(() => { if (CLUSTER === 'mainnet-beta') { fetchTradesForChart() } }, [fetchTradesForChart]) useInterval(async () => { if (CLUSTER === 'mainnet-beta') { fetchTradesForChart() } }, 5000) return (
{`${t('price')} (${quoteSymbol})`}
{t('trade:size')} ({baseSymbol})
{t('time')}
{!!trades.length && (
{trades.map((trade: ChartTradeType, i: number) => { const formattedPrice = market?.tickSize ? floorToDecimal(trade.price, getDecimalCount(market.tickSize)) : new Decimal(trade?.price || 0) const formattedSize = market?.minOrderSize ? floorToDecimal(trade.size, getDecimalCount(market.minOrderSize)) : new Decimal(trade?.size || 0) return (
{formattedPrice.toFixed()}
{formattedSize.toFixed()}
{trade.time && new Date(trade.time).toLocaleTimeString()}
) })}
)}
) } export default RecentTrades