import ButtonGroup from '@components/forms/ButtonGroup' import { LinkButton } from '@components/shared/Button' import SheenLoader from '@components/shared/SheenLoader' import { NoSymbolIcon } from '@heroicons/react/20/solid' import { useInfiniteQuery } from '@tanstack/react-query' import { useTranslation } from 'next-i18next' import { useMemo, useState } from 'react' import { EmptyObject } from 'types' import { MANGO_DATA_API_URL } from 'utils/constants' import LeaderboardTable from './LeaderboardTable' export interface LeaderboardRes { date_hour: string mango_account: string pnl: number profile_image_url: string | null profile_name: string start_date_hour: string trader_category: string wallet_pk: string } type DaysToShow = '1DAY' | '1WEEK' | 'ALLTIME' const isLeaderboard = ( response: null | EmptyObject | LeaderboardRes[] ): response is LeaderboardRes[] => { if (response && Array.isArray(response)) { return true } return false } const fetchLeaderboard = async ( daysToShow: DaysToShow, offset = 0 ): Promise> => { const data = await fetch( `${MANGO_DATA_API_URL}/leaderboard-pnl?over_period=${daysToShow}&offset=${offset}` ) const parsedData: null | EmptyObject | LeaderboardRes[] = await data.json() let leaderboardData if (isLeaderboard(parsedData)) { leaderboardData = parsedData } return leaderboardData ?? [] } const LeaderboardPage = () => { const { t } = useTranslation(['common', 'leaderboard']) const [daysToShow, setDaysToShow] = useState('ALLTIME') const { data, isLoading, isFetching, isFetchingNextPage, fetchNextPage } = useInfiniteQuery( ['leaderboard', daysToShow], ({ pageParam }) => fetchLeaderboard(daysToShow, pageParam), { cacheTime: 1000 * 60 * 10, staleTime: 1000 * 60 * 5, retry: 3, refetchOnWindowFocus: false, keepPreviousData: true, getNextPageParam: (_lastPage, pages) => pages.length * 20, } ) const leaderboardData = useMemo(() => { if (data?.pages.length) { return data.pages.flat() } return [] }, [data, daysToShow]) const handleDaysToShow = (days: DaysToShow) => { setDaysToShow(days) } return (

{t('leaderboard')}

{t('leaderboard:leaderboard-desc')}

handleDaysToShow(v)} names={['24h', '7d', '30d', t('all')]} values={['1DAY', '1WEEK', 'ALLTIME']} />
{leaderboardData.length ? ( ) : !isFetching && !isLoading ? (

{t('leaderboard:leaderboard-unavailable')}

) : null} {isLoading || isFetchingNextPage ? (
{[...Array(20)].map((x, i) => (
))}
) : null} {leaderboardData.length && leaderboardData.length < 100 ? ( fetchNextPage()} > {t('show-more')} ) : null}
) } export default LeaderboardPage