openreplay/frontend/app/components/ui/Pagination/Pagination.tsx
Delirium a2fce7e291
Assist stats UI (#1489)
* feat(ui): start assist stats

* feat(ui): design mock up for stats

* feat(ui): naming...

* feat(ui): types, api service, some changes for recs and loaders

* feat(ui): csv export button/request

* feat(ui): csv export button/request

* feat(ui): format dates

* feat(ui): some fixes for stats requests

* fix(tracker): fix test

* fix(tracker): fix ci build

* fix(tracker): fix assist tests

* fix(tracker): bump test coverage, fix minor bug

* fix(ui): more cypress fixes

* fix(ui): add proj id to socket connection

* fix(ui): remove console log

* fix(ui): update filters

* feat(ui):fix some api keys for stats

* feat(ui): fix type

* feat(ui): remove unused

* feat(ui): some fixes

* feat(ui): some fixes 2

* fix(ui): some search fixes

* fix(ui): change api keys

* fix(ui): change api keys

* fix(ui): pdf button fix

* fix(ui): pdf button fix

* fix(ui): some ui fixes after review

* fix(ui): fix csv export

* fix(ui): change header for pds export for stats

* fix(ui): change header width for exports
2023-10-16 13:54:37 +02:00

64 lines
2.2 KiB
TypeScript

import React from 'react';
import { Icon, Tooltip } from 'UI';
import cn from 'classnames';
import { debounce } from 'App/utils';
import { numberWithCommas } from 'App/utils';
interface Props {
page: number;
totalPages: number;
onPageChange: (page: number) => void;
limit?: number;
debounceRequest?: number;
}
export default function Pagination(props: Props) {
const { page, totalPages, onPageChange, limit = 5, debounceRequest = 0 } = props;
const [currentPage, setCurrentPage] = React.useState(page);
React.useMemo(() => setCurrentPage(page), [page]);
const debounceChange = React.useCallback(debounce(onPageChange, debounceRequest), []);
const changePage = (page: number) => {
if (page > 0 && page <= totalPages) {
setCurrentPage(page);
debounceChange(page);
}
};
const isFirstPage = currentPage <= 1;
const isLastPage = currentPage === totalPages;
return (
<div className="flex items-center">
<Tooltip title="Previous Page">
<button
className={cn('py-2 px-3', { 'opacity-50 cursor-default': isFirstPage })}
disabled={isFirstPage}
onClick={() => changePage(currentPage - 1)}
>
<Icon name="chevron-left" size="18" color={isFirstPage ? 'gray-medium' : 'teal'} />
</button>
</Tooltip>
<span className="mr-2 color-gray-medium">Page</span>
<input
type="number"
className={cn('py-1 px-2 bg-white border border-gray-light rounded w-16', {
'opacity-50 cursor-default': totalPages === 1,
})}
value={currentPage}
min={1}
max={totalPages ? totalPages : 1}
onChange={(e) => changePage(parseInt(e.target.value))}
/>
<span className="mx-3 color-gray-medium">of</span>
<span>{numberWithCommas(totalPages)}</span>
<Tooltip title="Next Page">
<button
className={cn('py-2 px-3', { 'opacity-50 cursor-default': isLastPage })}
disabled={isLastPage}
onClick={() => changePage(currentPage + 1)}
>
<Icon name="chevron-right" size="18" color={isLastPage ? 'gray-medium' : 'teal'} />
</button>
</Tooltip>
</div>
);
}