import { useState, type ButtonHTMLAttributes } from 'react'; import { Link, useParams } from 'react-router-dom'; import orderBy from 'lodash/orderBy'; import { Splash, truncateMiddle, Loader } from '@vegaprotocol/ui-toolkit'; import { DispatchMetricLabels, type DispatchMetric } from '@vegaprotocol/types'; import classNames from 'classnames'; import { useT } from '../../lib/use-t'; import { Table } from '../../components/table'; import { formatNumber, getDateTimeFormat } from '@vegaprotocol/utils'; import { useTeam, type TeamStats as ITeamStats, type Team as TeamType, type Member, } from '../../lib/hooks/use-team'; import { DApp, EXPLORER_PARTIES, useLinks } from '@vegaprotocol/environment'; import { TeamAvatar } from '../../components/competitions/team-avatar'; import { TeamStats } from '../../components/competitions/team-stats'; import { usePageTitle } from '../../lib/hooks/use-page-title'; import { ErrorBoundary } from '../../components/error-boundary'; import { LayoutWithGradient } from '../../components/layouts-inner'; import { useVegaWallet } from '@vegaprotocol/wallet'; import { JoinTeam } from './join-team'; import { UpdateTeamButton } from './update-team-button'; import { type TeamGame, useGames, areTeamGames, } from '../../lib/hooks/use-games'; export const CompetitionsTeam = () => { const t = useT(); const { teamId } = useParams<{ teamId: string }>(); usePageTitle([t('Competitions'), t('Team')]); return ( ); }; const TeamPageContainer = ({ teamId }: { teamId: string | undefined }) => { const t = useT(); const { pubKey } = useVegaWallet(); const { data, team, partyTeam, stats, members, loading, refetch } = useTeam( teamId, pubKey || undefined ); const { data: games, loading: gamesLoading } = useGames(teamId); // only show spinner on first load so when users join teams its smoother if (!data && loading) { return ( ); } if (!team) { return (

{t('Page not found')}

); } return ( ); }; const TeamPage = ({ team, partyTeam, stats, members, games, gamesLoading, refetch, }: { team: TeamType; partyTeam?: TeamType; stats?: ITeamStats; members?: Member[]; games?: TeamGame[]; gamesLoading?: boolean; refetch: () => void; }) => { const t = useT(); const [showGames, setShowGames] = useState(true); return (

{team.name}

setShowGames(true)} data-testid="games-toggle" > {t('Games {{games}}', { replace: { games: gamesLoading ? '' : games ? `(${games.length})` : '(0)', }, })} setShowGames(false)} data-testid="members-toggle" > {t('Members ({{count}})', { count: members ? members.length : 0, })}
{showGames ? ( ) : ( )}
); }; const Games = ({ games, gamesLoading, }: { games?: TeamGame[]; gamesLoading?: boolean; }) => { const t = useT(); if (gamesLoading) { return (
); } if (!games?.length) { return

{t('No games')}

; } return ( ({ rank: game.team.rank, epoch: game.epoch, type: DispatchMetricLabels[game.team.rewardMetric as DispatchMetric], amount: formatNumber(game.team.totalRewardsEarned), participatingTeams: game.entities.length, participatingMembers: game.numberOfParticipants, }))} noCollapse={true} /> ); }; const Members = ({ members }: { members?: Member[] }) => { const t = useT(); if (!members?.length) { return

{t('No members')}

; } const data = orderBy( members.map((m) => ({ referee: , rewards: formatNumber(m.totalQuantumRewards), volume: formatNumber(m.totalQuantumVolume), gamesPlayed: formatNumber(m.totalGamesPlayed), joinedAt: getDateTimeFormat().format(new Date(m.joinedAt)), joinedAtEpoch: Number(m.joinedAtEpoch), })), 'joinedAtEpoch', 'desc' ); return (
); }; const RefereeLink = ({ pubkey, isCreator, }: { pubkey: string; isCreator: boolean; }) => { const t = useT(); const linkCreator = useLinks(DApp.Explorer); const link = linkCreator(EXPLORER_PARTIES.replace(':id', pubkey)); return ( <> {truncateMiddle(pubkey)} {' '} {isCreator ? t('Owner') : ''} ); }; const ToggleButton = ({ active, ...props }: ButtonHTMLAttributes & { active: boolean }) => { return (