mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	* refactor: update test deps * refactor: remove unused ts-expect-error annotations * refactor: add missing arg and return types * refactor: the loading prop is optional * refactor: add missing arg and return types * reafactor: fix value arg type * refactor: fix missing array type * refactor: the parameters field is an array * refactor: use undefined instead of null in state * refactor: add missing params type * refactor: add missing children prop * refactor: add missing array type * refactor: add missing React imports * refactor: use correct IProjectEnvironment type * refactor: type errors as unknown * refactor: the index prop is required * refactor: fix date prop type * refactor: fix tooltip placement prop type * refactor: fix environments state type * refactor: add missing arg types * refactor: add guard for undefined field * refactor: fix ChangePassword prop types * refactor: fix MUI import paths * refactor: add missing arg type * refactor: fix showDialog prop type * refactor: remove unused openUpdateDialog prop * refactor: add missing non-null assertion * refactor: remove unused types prop * refactor: stricten API error handler types * refactor: add missing undefined check * refactor: add missing IProject id field * refactor: fix ConditionallyRender condition prop types * refactor: remove unused args * refactor: add AddVariant prop types * refactor: add types to UIContext * refactor: fix event arg type * refactor: add missing default impressionData field * refactor: fix handleDeleteEnvironment prop args * refactor: fix IFeatureMetrics field requirements * refactor: add missing element types to ConditionallyRender * refactor: remove unused ProjectAccess projectId prop * refactor: add missing undefined check * refactor: fix getCreateTogglePath arg type * refactor: add missing IStrategyPayload import * refactor: remove unused user arg * refactor: add missing event arg type * refactor: add missing style object types * refactor: improve userApiErrors prop type * refactor: the Dialogue onClose prop is optional * refactor: fix the AddonEvents setEventValue prop type
		
			
				
	
	
		
			169 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import React, { useEffect, useState } from 'react';
 | |
| import ConditionallyRender from '../ConditionallyRender';
 | |
| import classnames from 'classnames';
 | |
| import { useStyles } from './PaginationUI.styles';
 | |
| 
 | |
| import ArrowBackIosIcon from '@material-ui/icons/ArrowBackIos';
 | |
| import ArrowForwardIosIcon from '@material-ui/icons/ArrowForwardIos';
 | |
| 
 | |
| import DoubleArrowIcon from '@material-ui/icons/DoubleArrow';
 | |
| import { useMediaQuery, useTheme } from '@material-ui/core';
 | |
| 
 | |
| interface IPaginateUIProps {
 | |
|     pages: any[];
 | |
|     pageIndex: number;
 | |
|     prevPage: () => void;
 | |
|     setPageIndex: (idx: number) => void;
 | |
|     nextPage: () => void;
 | |
|     style?: React.CSSProperties;
 | |
| }
 | |
| 
 | |
| const PaginateUI = ({
 | |
|     pages,
 | |
|     pageIndex,
 | |
|     prevPage,
 | |
|     setPageIndex,
 | |
|     nextPage,
 | |
|     ...rest
 | |
| }: IPaginateUIProps) => {
 | |
|     const STARTLIMIT = 6;
 | |
|     const theme = useTheme();
 | |
|     const styles = useStyles();
 | |
|     const [limit, setLimit] = useState(STARTLIMIT);
 | |
|     const [start, setStart] = useState(0);
 | |
|     const matches = useMediaQuery(theme.breakpoints.down('sm'));
 | |
| 
 | |
|     useEffect(() => {
 | |
|         if (matches) {
 | |
|             setLimit(4);
 | |
|         }
 | |
|     }, [matches]);
 | |
| 
 | |
|     useEffect(() => {
 | |
|         if (pageIndex === 0 && start !== 0) {
 | |
|             setStart(0);
 | |
|             setLimit(STARTLIMIT);
 | |
|         }
 | |
|     }, [pageIndex, start]);
 | |
| 
 | |
|     return (
 | |
|         <ConditionallyRender
 | |
|             condition={pages.length > 1}
 | |
|             show={
 | |
|                 <div className={styles.pagination} {...rest}>
 | |
|                     <div className={styles.paginationInnerContainer}>
 | |
|                         <ConditionallyRender
 | |
|                             condition={pageIndex > 0}
 | |
|                             show={
 | |
|                                 <>
 | |
|                                     <button
 | |
|                                         className={classnames(
 | |
|                                             styles.idxBtn,
 | |
|                                             styles.idxBtnLeft
 | |
|                                         )}
 | |
|                                         onClick={() => {
 | |
|                                             prevPage();
 | |
|                                             if (start > 0) {
 | |
|                                                 setLimit(prev => prev - 1);
 | |
|                                                 setStart(prev => prev - 1);
 | |
|                                             }
 | |
|                                         }}
 | |
|                                     >
 | |
|                                         <ArrowBackIosIcon
 | |
|                                             className={styles.idxBtnIcon}
 | |
|                                         />
 | |
|                                     </button>
 | |
|                                     <button
 | |
|                                         className={classnames(
 | |
|                                             styles.idxBtn,
 | |
|                                             styles.doubleArrowBtnLeft
 | |
|                                         )}
 | |
|                                         onClick={() => {
 | |
|                                             setPageIndex(0);
 | |
|                                             if (start > 0) {
 | |
|                                                 setLimit(STARTLIMIT);
 | |
|                                                 setStart(0);
 | |
|                                             }
 | |
|                                         }}
 | |
|                                     >
 | |
|                                         <DoubleArrowIcon
 | |
|                                             className={classnames(
 | |
|                                                 styles.arrowIcon,
 | |
|                                                 styles.arrowIconLeft
 | |
|                                             )}
 | |
|                                         />
 | |
|                                     </button>
 | |
|                                 </>
 | |
|                             }
 | |
|                         />
 | |
| 
 | |
|                         {pages
 | |
|                             .map((page, idx) => {
 | |
|                                 const active = pageIndex === idx;
 | |
|                                 return (
 | |
|                                     <button
 | |
|                                         key={idx}
 | |
|                                         className={classnames(
 | |
|                                             styles.paginationButton,
 | |
|                                             {
 | |
|                                                 [styles.paginationButtonActive]:
 | |
|                                                     active,
 | |
|                                             }
 | |
|                                         )}
 | |
|                                         onClick={() => {
 | |
|                                             setPageIndex(idx);
 | |
|                                         }}
 | |
|                                     >
 | |
|                                         {idx + 1}
 | |
|                                     </button>
 | |
|                                 );
 | |
|                             })
 | |
|                             .slice(start, limit)}
 | |
|                         <ConditionallyRender
 | |
|                             condition={pageIndex < pages.length - 1}
 | |
|                             show={
 | |
|                                 <>
 | |
|                                     <button
 | |
|                                         onClick={() => {
 | |
|                                             nextPage();
 | |
|                                             if (limit < pages.length) {
 | |
|                                                 setLimit(prev => prev + 1);
 | |
|                                                 setStart(prev => prev + 1);
 | |
|                                             }
 | |
|                                         }}
 | |
|                                         className={classnames(
 | |
|                                             styles.idxBtn,
 | |
|                                             styles.idxBtnRight
 | |
|                                         )}
 | |
|                                     >
 | |
|                                         <ArrowForwardIosIcon
 | |
|                                             className={styles.idxBtnIcon}
 | |
|                                         />
 | |
|                                     </button>
 | |
|                                     <button
 | |
|                                         className={classnames(
 | |
|                                             styles.idxBtn,
 | |
|                                             styles.doubleArrowBtnRight
 | |
|                                         )}
 | |
|                                         onClick={() => {
 | |
|                                             setPageIndex(pages.length - 1);
 | |
|                                             setLimit(pages.length);
 | |
|                                             setStart(pages.length - STARTLIMIT);
 | |
|                                         }}
 | |
|                                     >
 | |
|                                         <DoubleArrowIcon
 | |
|                                             className={styles.arrowIcon}
 | |
|                                         />
 | |
|                                     </button>
 | |
|                                 </>
 | |
|                             }
 | |
|                         />
 | |
|                     </div>
 | |
|                 </div>
 | |
|             }
 | |
|         />
 | |
|     );
 | |
| };
 | |
| 
 | |
| export default PaginateUI;
 |