From 5b6639a3cf9b6c63045cb82e6ef1a43b0742c367 Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Wed, 9 Mar 2022 00:38:02 +0100 Subject: feat: provide pagination for users with js disabled (#13) * chore: add a Pagination component * chore: add blog pages * chore: fallback to page number based navigation if JS disabled * chore: update translation --- src/components/Pagination/Pagination.tsx | 131 +++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 src/components/Pagination/Pagination.tsx (limited to 'src/components/Pagination/Pagination.tsx') diff --git a/src/components/Pagination/Pagination.tsx b/src/components/Pagination/Pagination.tsx new file mode 100644 index 0000000..2c24a8c --- /dev/null +++ b/src/components/Pagination/Pagination.tsx @@ -0,0 +1,131 @@ +import { settings } from '@utils/config'; +import Link from 'next/link'; +import { useRouter } from 'next/router'; +import { useIntl } from 'react-intl'; +import styles from './Pagination.module.scss'; + +const Pagination = ({ baseUrl, total }: { baseUrl: string; total: number }) => { + const intl = useIntl(); + const { asPath } = useRouter(); + const totalPages = Math.floor(total / settings.postsPerPage); + const currentPage = asPath.includes('/page/') + ? Number(asPath.split(`${baseUrl}/page/`)[1]) + : 1; + const hasPreviousPage = currentPage !== 1; + const hasNextPage = currentPage !== totalPages; + + const getPreviousPageItem = () => { + return ( +
  • + + + {intl.formatMessage( + { + defaultMessage: '{icon} Previous page', + description: 'Pagination: previous page link', + }, + { icon: '←' } + )} + + +
  • + ); + }; + + const getNextPageItem = () => { + return ( +
  • + + + {intl.formatMessage( + { + defaultMessage: 'Next page {icon}', + description: 'Pagination: Next page link', + }, + { icon: '→' } + )} + + +
  • + ); + }; + + const getPages = () => { + const pages = []; + for (let i = 1; i <= totalPages; i++) { + if (i === currentPage) { + pages.push({ + id: `page-${i}`, + link: ( + + {intl.formatMessage( + { + defaultMessage: 'Page {number}', + description: 'Pagination: page number', + }, + { + number: i, + a11y: (chunks: string) => ( + {chunks} + ), + } + )} + + ), + }); + } else { + pages.push({ + id: `page-${i}`, + link: ( + + + {intl.formatMessage( + { + defaultMessage: 'Page {number}', + description: 'Pagination: page number', + }, + { + number: i, + a11y: (chunks: string) => ( + {chunks} + ), + } + )} + + + ), + }); + } + } + + return pages; + }; + + const getItems = () => { + const pages = getPages(); + + return pages.map((page) => ( +
  • + {page.link} +
  • + )); + }; + + return ( + + ); +}; + +export default Pagination; -- cgit v1.2.3