1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-10-27 11:02:16 +01:00
unleash.unleash/frontend/src/component/common/PaginateUI/PaginateUI.tsx
olav 3959e846e8 refactor: fix misc TS errors (#729)
* 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
2022-02-25 10:55:39 +01:00

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;