import React, { useCallback, useMemo } from 'react';
import PropTypes from 'prop-types';
import { withTranslation } from 'react-i18next';
import { Pagination, PaginationItem, PaginationLink } from 'reactstrap';
function PaginationWrapper(props) {
const paginationNumbers = {};
const {
activePage, changePage, totalItemsCount, limit, align,
} = props;
// super(props);
// this.state = {
// activePage: 1,
// totalItemsCount: 0,
// paginationNumbers: {},
// limit: this.props.pagingLimit || Infinity,
// };
// this.calculatePagination = this.calculatePagination.bind(this);
// }
// componentWillReceiveProps(nextProps) {
// this.setState({
// activePage: nextProps.activePage,
// totalItemsCount: nextProps.totalItemsCount,
// limit: nextProps.pagingLimit,
// }, () => {
// const activePage = this.state.activePage;
// const totalCount = this.state.totalItemsCount;
// const limit = this.state.limit;
// const paginationNumbers = this.calculatePagination(limit, totalCount, activePage);
// this.setState({ paginationNumbers });
// });
// }
// calculatePagination(limit, totalCount, activePage) {
// // calc totalPageNumber
// const totalPage = Math.floor(totalCount / limit) + (totalCount % limit === 0 ? 0 : 1);
// let paginationStart = activePage - 2;
// let maxViewPageNum = activePage + 2;
// // if pagiNation Number area size = 5 , pageNumber is calculated here
// // activePage Position calculate ex. 4 5 [6] 7 8 (Page8 over is Max), 3 4 5 [6] 7 (Page7 is Max)
// if (paginationStart < 1) {
// const diff = 1 - paginationStart;
// paginationStart += diff;
// maxViewPageNum = Math.min(totalPage, maxViewPageNum + diff);
// }
// if (maxViewPageNum > totalPage) {
// const diff = maxViewPageNum - totalPage;
// maxViewPageNum -= diff;
// paginationStart = Math.max(1, paginationStart - diff);
// }
// return {
// totalPage,
// paginationStart,
// maxViewPageNum,
// };
// }
/**
* generate Elements of Pagination First Prev
* ex. << < 1 2 3 > >>
* this function set << & <
*/
const generateFirstPrev = useCallback(() => {
if (activePage !== 1) {
return (
<>
{ return changePage(1) }} />
{ return changePage(activePage - 1) }} />
>
);
}
return (
<>
>
);
}, [activePage, changePage]);
/**
* generate Elements of Pagination First Prev
* ex. << < 4 5 6 7 8 > >>, << < 1 2 3 4 > >>
* this function set numbers
*/
const generatePaginations = (activePage, paginationStart, maxViewPageNum) => {
const paginationItems = [];
for (let number = paginationStart; number <= maxViewPageNum; number++) {
paginationItems.push(
{ return props.changePage(number) }}>
{number}
,
);
}
return paginationItems;
};
/**
* generate Elements of Pagination First Prev
* ex. << < 1 2 3 > >>
* this function set > & >>
*/
const generateNextLast = (activePage, totalPage) => {
const paginationItems = [];
if (totalPage !== activePage) {
paginationItems.push(
{ return props.changePage(activePage + 1) }} />
,
{ return props.changePage(totalPage) }} />
,
);
}
else {
paginationItems.push(
,
,
);
}
return paginationItems;
};
const getListClassName = useMemo(() => {
const listClassNames = [];
if (align === 'center') {
listClassNames.push('justify-content-center');
}
if (align === 'right') {
listClassNames.push('justify-content-end');
}
return listClassNames.join(' ');
}, [align]);
const paginationItems = [];
const totalPage = paginationNumbers.totalPage;
const paginationStart = paginationNumbers.paginationStart;
const maxViewPageNum = paginationNumbers.maxViewPageNum;
const paginations = generatePaginations(activePage, paginationStart, maxViewPageNum);
paginationItems.push(paginations);
const nextLastItems = generateNextLast(activePage, totalPage);
paginationItems.push(nextLastItems);
return (
{generateFirstPrev()}
{paginationItems}
);
}
PaginationWrapper.propTypes = {
activePage: PropTypes.number.isRequired,
changePage: PropTypes.func.isRequired,
totalItemsCount: PropTypes.number.isRequired,
pagingLimit: PropTypes.number.isRequired,
align: PropTypes.string,
size: PropTypes.string,
};
PaginationWrapper.defaultProps = {
align: 'left',
size: 'md',
};
export default withTranslation()(PaginationWrapper);