box-ui-elements-mlh
Version:
70 lines (57 loc) • 1.75 kB
Flow
/**
* @flow
* @file Offset Based Pagination component
* @author Box
*/
import React from 'react';
import noop from 'lodash/noop';
import PaginationControls from './PaginationControls';
import { DEFAULT_PAGE_SIZE } from '../../constants';
type Props = {
offset?: number,
onOffsetChange?: Function,
pageSize?: number,
totalCount?: number,
};
const OffsetBasedPagination = ({
offset = 0,
onOffsetChange = noop,
pageSize = DEFAULT_PAGE_SIZE,
totalCount = 0,
}: Props) => {
const pageCount = Math.ceil(totalCount / pageSize);
if (pageCount <= 1) return null;
const pageByOffset = Math.floor(offset / pageSize) + 1;
const pageNumber = pageByOffset > 0 ? Math.min(pageCount, pageByOffset) : 1;
const hasNextPage = pageNumber < pageCount;
const hasPreviousPage = pageNumber > 1;
const updateOffset = (newPageNumber: number) => {
let newOffset = (newPageNumber - 1) * pageSize;
if (newOffset <= 0) {
newOffset = 0;
}
if (newOffset >= totalCount) {
newOffset = totalCount - pageSize;
}
onOffsetChange(newOffset);
};
const handleNextClick = () => {
updateOffset(pageNumber + 1);
};
const handlePreviousClick = () => {
updateOffset(pageNumber - 1);
};
return (
<PaginationControls
handleNextClick={handleNextClick}
handlePreviousClick={handlePreviousClick}
hasNextPage={hasNextPage}
hasPreviousPage={hasPreviousPage}
isOffsetBasedPagination
onPageClick={updateOffset}
pageCount={pageCount}
pageNumber={pageNumber}
/>
);
};
export default OffsetBasedPagination;