From e740274e5acb131d30062148092b6669931430f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 1 May 2024 17:20:08 -0500 Subject: [PATCH] feat: table --- src/app/tools/session/page.tsx | 307 ++++++++++++++++++++++++------- src/core/blitz/getAccountInfo.ts | 2 +- src/core/blitz/getTankStats.ts | 1 - 3 files changed, 240 insertions(+), 70 deletions(-) diff --git a/src/app/tools/session/page.tsx b/src/app/tools/session/page.tsx index 66c0d9c78..21651b99f 100644 --- a/src/app/tools/session/page.tsx +++ b/src/app/tools/session/page.tsx @@ -1,33 +1,46 @@ 'use client'; -import { InfoCircledIcon, MagnifyingGlassIcon } from '@radix-ui/react-icons'; +import { + ArrowDownIcon, + InfoCircledIcon, + MagnifyingGlassIcon, +} from '@radix-ui/react-icons'; import { AlertDialog, Button, Card, Flex, + Heading, Link, + Table, Text, TextField, } from '@radix-ui/themes'; import { debounce } from 'lodash'; -import { useEffect, useRef, useState } from 'react'; +import { use, useEffect, useMemo, useRef, useState } from 'react'; import PageWrapper from '../../../components/PageWrapper'; import { UNLOCALIZED_REGION_NAMES_SHORT } from '../../../constants/regions'; import { authURL } from '../../../core/blitz/authURL'; -import { getAccountInfo } from '../../../core/blitz/getAccountInfo'; +import { + getAccountInfo, + IndividualAccountInfo, +} from '../../../core/blitz/getAccountInfo'; import getTankStats from '../../../core/blitz/getTankStats'; import { idToRegion } from '../../../core/blitz/idToRegion'; import searchPlayersAcrossRegions, { AccountListWithServer, } from '../../../core/blitz/searchPlayersAcrossRegions'; +import { tankDefinitions } from '../../../core/blitzkit/tankDefinitions'; +import { tankIcon } from '../../../core/blitzkit/tankIcon'; import { useApp } from '../../../stores/app'; import mutateSession, { SessionTracking, useSession, } from '../../../stores/session'; +import { IndividualTankStats } from '../../../types/tanksStats'; export default function Page() { + const awaitedTankDefinitions = use(tankDefinitions); const [showSearch, setShowSearch] = useState(false); const [searching, setSearching] = useState(false); const [searchResults, setSearchResults] = useState([]); @@ -35,6 +48,21 @@ export default function Page() { const input = useRef(null); const session = useSession(); const login = useApp((state) => state.login); + const [tankStatsB, setTankStatsB] = useState( + null, + ); + const accountInfoPromise = useMemo( + () => + new Promise(async (resolve) => { + resolve( + session.tracking + ? await getAccountInfo(session.player.region, session.player.id) + : null, + ); + }), + [session.tracking && session.player.id], + ); + const accountInfo = use(accountInfoPromise); const search = debounce(async () => { if (!input.current) return; @@ -78,6 +106,20 @@ export default function Page() { } } })(); + + if (session.tracking) { + const interval = setInterval(async () => { + const tankStats = await getTankStats( + idToRegion(session.player.id), + session.player.id, + ); + setTankStatsB(tankStats); + + // TODO: make refresh rate configurable + }, 1000); + + return () => clearInterval(interval); + } }, [session.tracking && session.player.id]); return ( @@ -130,82 +172,211 @@ export default function Page() { )} - { - if (!input.current) return; + {!session.tracking && ( + + + Look up a player to get started + + - const sanitized = input.current.value.trim(); - - if (sanitized.length > 0) { - setShowSearch(true); - setSearching(true); - search(); - } else { - setShowSearch(false); - } - }} - > - - - - - {showSearch && ( - { + if (!input.current) return; + + const sanitized = input.current.value.trim(); + + if (sanitized.length > 0) { + setShowSearch(true); + setSearching(true); + search(); + } else { + setShowSearch(false); + } }} > - {searching && ( - - Searching... - + + + + + {showSearch && ( + + {searching && ( + + Searching... + + )} + + {!searching && searchResults.length === 0 && ( + + No players found + + )} + + {!searching && searchResults.length > 0 && ( + + {searchResults.map((player) => ( + + ))} + + )} + )} + + + )} - {!searching && searchResults.length === 0 && ( - - No players found - - )} + {session.tracking && ( + + Tracking {accountInfo?.nickname} + + + )} - {!searching && searchResults.length > 0 && ( - - {searchResults.map((player) => ( - - ))} - - )} - - )} - + + + +
+ + + {tank.name} + + + {stat.all.battles} + + {((100 * stat.all.wins) / stat.all.battles).toFixed(0)}% + + + ); + })} + + + )} + + {session.tracking && tankStatsB && tankStatsB.length === 0 && ( + + No battles + Go ahead and play a game + + )} ); } diff --git a/src/core/blitz/getAccountInfo.ts b/src/core/blitz/getAccountInfo.ts index df03b7242..80ab17977 100644 --- a/src/core/blitz/getAccountInfo.ts +++ b/src/core/blitz/getAccountInfo.ts @@ -71,7 +71,7 @@ export interface RatingStats { dropped_capture_points: number; } -interface IndividualAccountInfo { +export interface IndividualAccountInfo { account_id: number; created_at: number; updated_at: number; diff --git a/src/core/blitz/getTankStats.ts b/src/core/blitz/getTankStats.ts index 5ba5f52f2..61e73f9e4 100644 --- a/src/core/blitz/getTankStats.ts +++ b/src/core/blitz/getTankStats.ts @@ -5,7 +5,6 @@ import fetchBlitz, { FetchBlitzParams } from './fetchBlitz'; export default async function getTankStats( region: Region, id: number, - params?: FetchBlitzParams, ) { const tankStats = await fetchBlitz(region, 'tanks/stats', {