import ArrowBackIcon from '@mui/icons-material/ArrowBackIosNew'; import ArrowForwardIcon from '@mui/icons-material/ArrowForwardIos'; import { CircularProgress, Link, Typography } from '@mui/material'; import { equals, isEmpty, isNil } from 'ramda'; import { useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import buildListingEndpoint from '../api/buildListingEndpoint'; import type { Listing } from '../api/models'; import useFetchQuery from '../api/useFetchQuery'; import IconButton from '../Button/Icon'; import { labelNextPage, labelNoResultFound, labelPreviousPage } from '../Listing/translatedLabels'; import { truncate } from '../utils'; import { useStyles } from './Pagination.styles'; interface Props { api: { baseEndpoint: string; queryKey: Array; searchConditions?: Array< import('../api/buildListingEndpoint/models').ConditionsSearchParameter >; }; labelHasNoElements?: string; onItemClick?: ({ id }: { id: number }) => void; } const limit = 6; const Pagination = ({ api: { baseEndpoint, queryKey, searchConditions }, labelHasNoElements = labelNoResultFound, onItemClick }: Props) => { const { t } = useTranslation(); const { cx, classes } = useStyles(); const [page, setPage] = useState(1); const { data, isLoading } = useFetchQuery< Listing<{ id: number; name: string }> >({ getEndpoint: (parameters): string => buildListingEndpoint({ baseEndpoint: baseEndpoint, parameters: { ...parameters, limit, page, ...(searchConditions ? { search: { conditions: searchConditions } } : {}), sort: { status: 'DESC' } } }), getQueryKey: () => [...queryKey, page], queryOptions: { suspense: false } }); const pagesCount = Math.ceil((data?.meta?.total ?? 0) / limit); const arePaginationComponentsDisplayed = !equals(pagesCount, 1); const hasNoElements = useMemo( () => isEmpty(data?.result) || isNil(data?.result), [data] ); if (hasNoElements) { return (
{t(labelHasNoElements)}
); } return (
{arePaginationComponentsDisplayed && (
setPage(page - 1)} >
)}
{isLoading ? ( ) : ( data?.result.map(({ id, name }) => ( onItemClick?.({ id })} variant="body2" > {truncate({ content: name, maxLength: 25 })} )) )}
{arePaginationComponentsDisplayed && (
setPage(page + 1)} >
)}
{arePaginationComponentsDisplayed && ( {`Page ${page}/${pagesCount}`} )}
); }; export default Pagination;