From 466f68701f49a6826e6b18657ff8c4bd7aa1dfd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 7 Nov 2023 10:32:01 -0600 Subject: [PATCH] feat: archived player lookup --- src/app/tools/ratings/page.tsx | 113 ++++++++++++++++++++++++++------- 1 file changed, 90 insertions(+), 23 deletions(-) diff --git a/src/app/tools/ratings/page.tsx b/src/app/tools/ratings/page.tsx index 6ad802b1d..d06299c75 100644 --- a/src/app/tools/ratings/page.tsx +++ b/src/app/tools/ratings/page.tsx @@ -5,19 +5,29 @@ import { CaretRightIcon, MagnifyingGlassIcon, } from '@radix-ui/react-icons'; -import { Button, Flex, Popover, Select, TextField } from '@radix-ui/themes'; +import { + Button, + Dialog, + Flex, + Popover, + Select, + TextField, +} from '@radix-ui/themes'; import { produce } from 'immer'; -import { range } from 'lodash'; -import { useEffect, useRef, useState } from 'react'; +import { debounce, range } from 'lodash'; +import { ChangeEvent, useEffect, useRef, useState } from 'react'; import useSWR from 'swr'; import { create } from 'zustand'; import * as Leaderboard from '../../../components/Leaderboard'; import PageWrapper from '../../../components/PageWrapper'; import { FIRST_ARCHIVED_RATINGS_SEASON } from '../../../constants/ratings'; import { REGIONS, REGION_NAMES, Region } from '../../../constants/regions'; +import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; +import fetchBlitz from '../../../core/blitz/fetchBlitz'; import { getAccountInfo } from '../../../core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../../../core/blitz/getClanAccountInfo'; import getRatingsInfo from '../../../core/blitz/getRatingsInfo'; +import { AccountList } from '../../../core/blitz/searchPlayersAcrossRegions'; import getArchivedRatingsInfoAPI from '../../../core/blitzkrieg/getArchivedRatingsInfoAPI'; import { getArchivedRatingsLeaderboardAPI } from '../../../core/blitzkrieg/getArchivedRatingsLeaderboardAPI'; import { numberFetcher } from '../../../core/blitzkrieg/numberFetcher'; @@ -66,6 +76,9 @@ export default function Page() { } }); const [page, setPage] = useState(0); + const [highlightedPlayerId, setHighlightedPlayerId] = useState( + null, + ); const playerSlice = players.data?.slice( page * rowsPerPage, page * rowsPerPage + rowsPerPage, @@ -75,6 +88,34 @@ export default function Page() { setPage((page) => Math.min(page + 1, Math.floor((players.data?.length ?? 0) / rowsPerPage)), ); + const [searchResults, setSearchResults] = useState( + undefined, + ); + const handleSearchPlayerChange = debounce( + async (event: ChangeEvent) => { + const trimmedSearch = event.target.value.trim(); + + if (trimmedSearch) { + const encodedSearch = encodeURIComponent(trimmedSearch); + const accountList = await fetchBlitz( + `https://api.wotblitz.com/wotb/account/list/?application_id=${WARGAMING_APPLICATION_ID}&search=${encodedSearch}&limit=100`, + ); + + setSearchResults( + accountList.filter( + (searchedPlayer) => + players.data?.some( + (leaderboardPlayer) => + leaderboardPlayer.id === searchedPlayer.account_id, + ), + ), + ); + } else { + setSearchResults(undefined); + } + }, + 500, + ); cachePage(page - 1); cachePage(page); @@ -156,7 +197,7 @@ export default function Page() { } return ( - + - - - - - - + + - + - - + + - + - - - - + + {searchResults?.map((player) => ( + + - + setPage(playerPage); + setHighlightedPlayerId(player.account_id); + }} + > + {player.nickname} + + + ))} + + {searchResults?.length === 0 && ( + + )} + + + + + + - - + + )) )}