From d08949c5978dfc027673858ca1100d009f2ffd10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 8 Nov 2023 11:16:51 -0600 Subject: [PATCH] feat: jump to league for current season --- src/app/tools/ratings/page.tsx | 187 +++++++++--------- .../Leaderboard/components/Item.tsx | 24 +-- src/core/blitzkrieg/withCORSProxy.ts | 2 + 3 files changed, 105 insertions(+), 108 deletions(-) diff --git a/src/app/tools/ratings/page.tsx b/src/app/tools/ratings/page.tsx index c8a020b63..172e4bf66 100644 --- a/src/app/tools/ratings/page.tsx +++ b/src/app/tools/ratings/page.tsx @@ -58,6 +58,7 @@ export default function Page() { const usernameCache = useUsernameCache(); const clanCache = useClanCache(); const [region, setRegion] = useState('com'); + const leaguePositionCache = useRef>({}); // null being the latest season const [season, setSeason] = useState(null); const { data: ratingsInfo } = useSWR( @@ -110,39 +111,36 @@ export default function Page() { useEffect(() => { // league caching if (season === null) { - Promise.all( - range(0, 4).map(async (league: number) => { - const leaguePlayers = await getRatingsLeague(region, league); - useUsernameCache.setState( - produce((draft: UsernameCache) => { - leaguePlayers.result.forEach((player) => { - draft[region][player.spa_id] = player.nickname; - }); - }), - ); - useClanCache.setState( - produce((draft: ClanCache) => { - leaguePlayers.result.forEach((player) => { - draft[region][player.spa_id] = player.clan_tag; - }); - }), - ); + (async () => { + const newUsernameCache: Record = {}; + const newClanCache: Record = {}; + const results = await Promise.all( + range(0, 5).map(async (league: number) => { + const leaguePlayers = await getRatingsLeague(region, league); - return leaguePlayers.result.reduce< - Record - >( - (accumulator, player) => ({ - ...accumulator, + leaguePositionCache.current[league] = + leaguePlayers.result[0].number - 1; - [player.number - 1]: { - id: player.spa_id, - score: player.score, - } satisfies BlitzkriegRatingsLeaderboardEntry, - }), - {}, - ); - }), - ).then((results) => { + leaguePlayers.result.forEach((player) => { + newUsernameCache[player.spa_id] = player.nickname; + newClanCache[player.spa_id] = player.clan_tag; + }); + + return leaguePlayers.result.reduce< + Record + >( + (accumulator, player) => ({ + ...accumulator, + + [player.number - 1]: { + id: player.spa_id, + score: player.score, + } satisfies BlitzkriegRatingsLeaderboardEntry, + }), + {}, + ); + }), + ); const newPlayers = results.reduce< Record >( @@ -154,13 +152,59 @@ export default function Page() { ); setPlayers(newPlayers); - }); + useUsernameCache.setState((old) => ({ + ...old, + [region]: { ...old[region], ...newUsernameCache }, + })); + useClanCache.setState((old) => ({ + ...old, + [region]: { ...old[region], ...newClanCache }, + })); + })(); } else { getArchivedRatingsLeaderboard(region, season).then((result) => setPlayers({ ...result }), ); } }, []); + + async function cacheNeighbors(id: number, size: number) { + const { neighbors } = await getRatingsNeighbors(region, id, size); + + setPlayers( + produce((draft) => { + draft = draft ?? {}; + + neighbors.forEach((neighbor) => { + draft![neighbor.number - 1] = { + id: neighbor.spa_id, + score: neighbor.score, + } satisfies BlitzkriegRatingsLeaderboardEntry; + }); + }), + ); + + useUsernameCache.setState( + produce((draft: UsernameCache) => { + neighbors.forEach((neighbor) => { + if (neighbor.nickname) { + draft[region][neighbor.spa_id] = neighbor.nickname; + } + }); + }), + ); + + useClanCache.setState( + produce((draft: ClanCache) => { + neighbors.forEach((neighbor) => { + if (neighbor.clan_tag) { + draft[region][neighbor.spa_id] = neighbor.clan_tag; + } + }); + }), + ); + } + useEffect(() => { // TODO: caches twice on initial load if (!players || !ratingsInfo || ratingsInfo?.detail) return; @@ -172,42 +216,7 @@ export default function Page() { const middleId = players[middleIndex].id; - getRatingsNeighbors(region, middleId, rowsPerPage * 3).then( - ({ neighbors }) => { - setPlayers( - produce((draft) => { - draft = draft ?? {}; - - neighbors.forEach((neighbor) => { - draft![neighbor.number - 1] = { - id: neighbor.spa_id, - score: neighbor.score, - } satisfies BlitzkriegRatingsLeaderboardEntry; - }); - }), - ); - - useUsernameCache.setState( - produce((draft: UsernameCache) => { - neighbors.forEach((neighbor) => { - if (neighbor.nickname) { - draft[region][neighbor.spa_id] = neighbor.nickname; - } - }); - }), - ); - - useClanCache.setState( - produce((draft: ClanCache) => { - neighbors.forEach((neighbor) => { - if (neighbor.clan_tag) { - draft[region][neighbor.spa_id] = neighbor.clan_tag; - } - }); - }), - ); - }, - ); + cacheNeighbors(middleId, rowsPerPage * 3); } else { const ids = range( Math.max(0, (page - 1) * rowsPerPage), @@ -244,7 +253,7 @@ export default function Page() { }); } } - }, [page, players]); + }, [page]); const handleJumpToPosition = () => { if (!players || !ratingsInfo || ratingsInfo?.detail) return; @@ -509,34 +518,18 @@ export default function Page() {