From 46457a8bdce4949398a20bb7ac00e4d80da21eb4 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 11:50:51 -0600 Subject: [PATCH] feat: jump to score --- src/app/tools/ratings/page.tsx | 132 +++++++++++++++++++++++---------- 1 file changed, 93 insertions(+), 39 deletions(-) diff --git a/src/app/tools/ratings/page.tsx b/src/app/tools/ratings/page.tsx index 96e445896..fc8059a89 100644 --- a/src/app/tools/ratings/page.tsx +++ b/src/app/tools/ratings/page.tsx @@ -7,7 +7,7 @@ import { } from '@radix-ui/react-icons'; import { Button, Dialog, Flex, Select, TextField } from '@radix-ui/themes'; import { produce } from 'immer'; -import { debounce, range } from 'lodash'; +import { debounce, findLastIndex, range } from 'lodash'; import { ChangeEvent, useEffect, useRef, useState } from 'react'; import useSWR from 'swr'; import { create } from 'zustand'; @@ -80,6 +80,7 @@ export default function Page() { page * rowsPerPage + rowsPerPage, ); const positionInput = useRef(null); + const scoreInput = useRef(null); const previousPage = () => setPage((page) => Math.max(page - 1, 0)); const nextPage = () => setPage((page) => @@ -154,6 +155,8 @@ export default function Page() { } } const handleJumpToPosition = () => { + if (!players.data) return; + const rawPosition = positionInput.current!.valueAsNumber - 1; const position = Math.max( 0, @@ -166,6 +169,22 @@ export default function Page() { } }; const [jumpToPositionOpen, setJumpToPositionOpen] = useState(false); + const handleJumpToScore = () => { + if (!players.data) return; + + const playerIndex = findLastIndex(players.data, (player) => { + return player.score >= scoreInput.current!.valueAsNumber; + }); + + if (playerIndex === -1) return; + + setPage(Math.floor(playerIndex / rowsPerPage)); + + if (players.data) { + setHighlightedPlayerId(players.data[playerIndex].id); + } + }; + const [jumpToScoreOpen, setJumpToScoreOpen] = useState(false); useEffect(() => { setPage(0); @@ -180,37 +199,6 @@ export default function Page() { return ( - - - Page - { - setPage( - Math.max( - 0, - Math.min( - Math.floor((players.data?.length ?? 0) / rowsPerPage), - event.target.valueAsNumber - 1, - ), - ), - ); - }} - onKeyDown={(event) => { - if (event.key === 'Enter') { - (event.target as HTMLInputElement).blur(); - } - }} - /> - - out of {Math.ceil((players.data?.length ?? 0) / rowsPerPage)} - - setRowsPerPage(parseInt(value))} defaultValue={`${rowsPerPage}`} @@ -225,9 +213,43 @@ export default function Page() { ))} - + + + + + Page + { + setPage( + Math.max( + 0, + Math.min( + Math.floor((players.data?.length ?? 0) / rowsPerPage), + event.target.valueAsNumber - 1, + ), + ), + ); + }} + onKeyDown={(event) => { + if (event.key === 'Enter') { + (event.target as HTMLInputElement).blur(); + } + }} + /> + + out of {Math.ceil((players.data?.length ?? 0) / rowsPerPage)} + + + + ); } @@ -282,13 +304,45 @@ export default function Page() { - + + + + + + + + + { + if (event.key === 'Enter') { + handleJumpToScore(); + setJumpToScoreOpen(false); + } + }} + /> + + + + + + + + + + + + + - + @@ -320,7 +374,7 @@ export default function Page() { - + @@ -373,7 +427,7 @@ export default function Page() { - +