// @flow import React from 'react'; import { withRouter } from 'react-router'; import { Form, FormField } from 'component/common/form'; import ReactPaginate from 'react-paginate'; import { useIsMobile } from 'effects/use-screensize'; const PAGINATE_PARAM = 'page'; type Props = { totalPages: number, location: { search: string }, history: { push: (string) => void }, onPageChange?: (number) => void, disableHistory?: boolean, // Disables the use of '&page=' param and history stack. }; function Paginate(props: Props) { const { totalPages = 1, location, history, onPageChange, disableHistory } = props; const { search } = location; const [textValue, setTextValue] = React.useState(''); const urlParams = new URLSearchParams(search); const urlParamPage = Number(urlParams.get(PAGINATE_PARAM)); const initialPage = disableHistory ? 1 : urlParamPage || 1; const [currentPage, setCurrentPage] = React.useState(initialPage); const isMobile = useIsMobile(); function handleChangePage(newPageNumber: number) { if (onPageChange) { onPageChange(newPageNumber); } if (currentPage !== newPageNumber) { setCurrentPage(newPageNumber); if (!disableHistory) { const params = new URLSearchParams(search); params.set(PAGINATE_PARAM, newPageNumber.toString()); history.push('?' + params.toString()); } } } function handlePaginateKeyUp() { const newPage = Number(textValue); if (newPage && newPage > 0 && newPage <= totalPages) { handleChangePage(newPage); } } React.useEffect(() => { if (urlParamPage) { setCurrentPage(urlParamPage); } }, [urlParamPage, setCurrentPage]); return ( // Hide the paginate controls if we are loading or there is only one page // It should still be rendered to trigger the onPageChange callback
); } export default withRouter(Paginate);