Files
blitzkit/src/app/tools/tankopedia/components/PageTurner.tsx
T

81 lines
2.4 KiB
TypeScript
Raw Normal View History

2023-12-04 12:39:14 -06:00
import { CaretLeftIcon, CaretRightIcon } from '@radix-ui/react-icons';
import { Button, Flex, TextField } from '@radix-ui/themes';
import { useEffect, useRef } from 'react';
2023-12-14 22:19:01 -06:00
import { TankDefinition } from '../../../../core/blitzkrieg/tankDefinitions';
2024-01-21 10:34:52 -06:00
import mutateTankopediaPersistent, {
useTankopediaPersistent,
} from '../../../../stores/tankopedia';
2023-12-04 12:39:14 -06:00
interface PageTurnerProps {
2023-12-14 22:19:01 -06:00
searchedList: TankDefinition[];
2023-12-04 12:39:14 -06:00
tanksPerPage: number;
}
2024-01-21 10:34:52 -06:00
export function PageTurner({ searchedList, tanksPerPage }: PageTurnerProps) {
const page = useTankopediaPersistent((state) => state.filters.page);
2023-12-04 12:39:14 -06:00
const pageInput = useRef<HTMLInputElement>(null);
useEffect(() => {
if (pageInput.current) pageInput.current.value = `${page + 1}`;
}, [page]);
return (
<Flex align="center" justify="center" gap="2">
<Button
variant="soft"
disabled={page === 0}
2024-01-21 10:34:52 -06:00
onClick={() => {
mutateTankopediaPersistent((draft) => {
draft.filters.page = Math.max(0, page - 1);
});
}}
2023-12-04 12:39:14 -06:00
>
<CaretLeftIcon />
</Button>
<TextField.Root>
<TextField.Slot>Page</TextField.Slot>
<TextField.Input
defaultValue={1}
type="number"
ref={pageInput}
min={1}
max={Math.floor(searchedList.length / tanksPerPage) + 1}
style={{ width: 64, textAlign: 'center' }}
onBlur={(event) => {
2024-01-21 10:34:52 -06:00
mutateTankopediaPersistent((draft) => {
draft.filters.page = Math.max(
2023-12-04 12:39:14 -06:00
0,
Math.min(
Math.floor(searchedList.length / tanksPerPage),
event.target.valueAsNumber - 1,
),
2024-01-21 10:34:52 -06:00
);
});
2023-12-04 12:39:14 -06:00
}}
onKeyDown={(event) => {
if (event.key === 'Enter') {
(event.target as HTMLInputElement).blur();
}
}}
/>
<TextField.Slot>
out of {Math.floor(searchedList.length / tanksPerPage) + 1}
</TextField.Slot>
</TextField.Root>
<Button
variant="soft"
disabled={Math.floor(searchedList.length / tanksPerPage) === page}
2024-01-21 10:34:52 -06:00
onClick={() => {
mutateTankopediaPersistent((draft) => {
draft.filters.page = Math.min(
Math.floor(searchedList.length / tanksPerPage),
page + 1,
);
});
}}
2023-12-04 12:39:14 -06:00
>
<CaretRightIcon />
</Button>
</Flex>
);
}