import React from 'react'; import { useSelector, useDispatch } from 'react-redux'; import classNames from 'classnames'; import clamp from '@1studio/utils/math/clamp'; import { useAppContext } from '../../context'; /* !- Redux Actions */ import { goToPage } from '../../grid/actions'; /* !- React Elements */ const Page = ({ active, onClick, page }) => {page}; /* !- Types */ const defaultProps = { className: 'pages', limit: 0, UI: Page, }; type PropTypes = Partial & { id?: string, page: number, totalPage: number, goToPage: (page: number, id: string) => void, } /** * [Pages description] */ export const Pages = ({ id, limit, UI, className, page, totalPage, goToPage, } : PropTypes) => { if (totalPage < 2) { return ; } const nodes = []; let start = 0; let end = totalPage; if (limit) { const half = Math.floor(limit / 2); start = clamp(page - 1 - half, 0, totalPage - limit); end = clamp(page + half, Math.min(limit, totalPage), totalPage); } if (end > 0) { for (let i = start; i < end; i += 1) { const thisPage = i + 1; nodes.push( React.createElement(UI, { key: i, page: thisPage, active: thisPage === page, onClick: (e) => { e.preventDefault(); goToPage(thisPage, id); }, }) ); } } return (
{nodes}
); }; Pages.defaultProps = defaultProps; export const ConnectedPages = (props) => { const { id } = props; const dispatch = useDispatch(); const { pages, totalPage } = useSelector( (state) => { const grid = state.grid[id] || {}; return ({ totalPage: grid.totalPage, page: grid.page, }); } ); const goToPageHandler = (page, id) => { dispatch(goToPage(page, id)); } return ( ); }; export default ConnectedPages;