import { CaretLeftIcon, CaretRightIcon, SymbolIcon, } from '@radix-ui/react-icons'; import { Button, Flex, TextField } from '@radix-ui/themes'; import { range } from 'lodash'; import { useEffect, useRef } from 'react'; import { infiniteSpin } from './index.css'; interface PageTurnerProps { leaderboard: Record; page: number; rowsPerPage: number; pages: number; onPageChange: (page: number, isButtonClick: boolean) => void; totalPlayers: number; } export function PageTurner({ page, rowsPerPage, onPageChange, pages, leaderboard, totalPlayers, }: PageTurnerProps) { const pageInput = useRef(null); const rightLoading = range( page * rowsPerPage, Math.min(totalPlayers - 1, page * rowsPerPage + rowsPerPage + 1), ).some((index) => !(index in leaderboard)); const leftLoading = range( Math.max(0, page * rowsPerPage - 1), Math.max(0, page * rowsPerPage - rowsPerPage - 1) + 1, ).some((index) => !(index in leaderboard)); useEffect(() => { if (pageInput.current) pageInput.current.value = `${page + 1}`; }, [page]); return ( Page { onPageChange( Math.max( 0, Math.min(pages - 1, event.target.valueAsNumber - 1), ), false, ); }} onKeyDown={(event) => { if (event.key === 'Enter') { (event.target as HTMLInputElement).blur(); } }} /> out of {pages} ); }