import { useEffect, useMemo, useState } from 'react' import dayjs from 'dayjs' import { usdFormatter } from '../utils' import { MedalIcon, ProfileIcon } from './icons' import { useTranslation } from 'next-i18next' import { ChartPieIcon, ExternalLinkIcon, TrendingUpIcon, } from '@heroicons/react/outline' import { getProfilePicture } from '@solflare-wallet/pfp' import useMangoStore from '../stores/useMangoStore' import { connectionSelector } from '../stores/selectors' const utc = require('dayjs/plugin/utc') dayjs.extend(utc) const LeaderboardTable = ({ range = '29' }) => { const [pnlLeaderboardData, setPnlLeaderboardData] = useState([]) const [perpPnlLeaderboardData, setPerpPnlLeaderboardData] = useState( [] ) const [leaderboardType, setLeaderboardType] = useState('total-pnl') const [loading, setLoading] = useState(false) const connection = useMangoStore(connectionSelector) const fetchPnlLeaderboard = async () => { setLoading(true) const response = await fetch( `https://mango-transaction-log.herokuapp.com/v3/stats/pnl-leaderboard?start-date=${dayjs() .utc() .hour(0) .minute(0) .subtract(parseInt(range), 'day') .add(1, 'hour') .format('YYYY-MM-DDThh:00:00')}` ) const parsedResponse = await response.json() const leaderboardData = [] as any[] for (const item of parsedResponse) { const { isAvailable, url } = await getProfilePicture( connection, item.wallet_pk ) leaderboardData.push({ ...item, pfp: { isAvailable: isAvailable, url: url }, }) } setPnlLeaderboardData(leaderboardData) setLoading(false) } const fetchPerpPnlLeaderboard = async () => { setLoading(true) const response = await fetch( `https://mango-transaction-log.herokuapp.com/v3/stats/perp-pnl-leaderboard?start-date=${dayjs() .hour(0) .minute(0) .utc() .subtract(parseInt(range), 'day') .format('YYYY-MM-DDThh:00:00')}` ) const parsedResponse = await response.json() setPerpPnlLeaderboardData(parsedResponse) setLoading(false) } useEffect(() => { if (leaderboardType === 'total-pnl') { fetchPnlLeaderboard() } else { fetchPerpPnlLeaderboard() } }, [range, leaderboardType]) useEffect(() => { fetchPerpPnlLeaderboard() }, []) const leaderboardData = useMemo( () => leaderboardType === 'total-pnl' ? pnlLeaderboardData : perpPnlLeaderboardData, [leaderboardType, pnlLeaderboardData, perpPnlLeaderboardData] ) return (
} /> } />
{!loading ? (
{leaderboardData.map((acc, i) => ( ))}
) : (
)}
) } export default LeaderboardTable const AccountCard = ({ rank, acc, pnl, pfp, rawPnl }) => { const medalColors = rank === 1 ? { darkest: '#E4AF11', dark: '#F2C94C', light: '#FFCF40', lightest: '#FDE877', } : rank === 2 ? { darkest: '#B8B8B8', dark: '#C0C0C0', light: '#C7C7C7', lightest: '#D8D6D6', } : { darkest: '#CD7F32', dark: '#E5994E', light: '#DBA36B', lightest: '#EFBF8D', } return (

{rank}

{rank < 4 ? ( ) : null} {pfp?.isAvailable ? ( ) : ( )}

{`${acc.slice(0, 5)}...${acc.slice( -5 )}`}

0 ? 'text-th-green' : 'text-th-red' }`} > {pnl}
) } const LeaderboardTypeButton = ({ leaderboardType, setLeaderboardType, range, icon, label, }) => { const { t } = useTranslation('common') return ( ) }