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;
|