Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | import { useState } from 'react' import { MessageEntity } from '../entities/entities/message.entity' import MessageList from './MessageList' import ReactPaginate from 'react-paginate' import EN from '../locales/en' import FR from '../locales/fr' import React from 'react' import { useEffect } from 'react' interface PaginatedMessagesProps { messageEntities: MessageEntity[] locale: string messagesPerPage: number pageRangeDisplayed: number } const PaginatedMessages = ({ messageEntities, locale, messagesPerPage, pageRangeDisplayed, }: PaginatedMessagesProps) => { const localizedStrings = locale === 'en' ? EN : FR //TODO do pagination from scratch according to one of these? https://design-system.alpha.canada.ca/en/components/pagination/ or https://wet-boew.github.io/wet-boew-styleguide/design/pagination-en.html useEffect(() => { const paginationListElement = document.querySelector( "ul[aria-label='Pagination']", ) if (paginationListElement && paginationListElement.children.length <= 3) { paginationListElement.setAttribute('style', 'display: none') } else { const previousLabel = localizedStrings.inbox.paginationText.previousAriaLabel const nextLabel = localizedStrings.inbox.paginationText.nextAriaLabel const currentLabel = localizedStrings.inbox.paginationText.currentPageAriaLabel paginationListElement?.removeAttribute('role') const paginationListElements = document.querySelectorAll( "ul[aria-label='Pagination']>li", ) paginationListElements.forEach((element) => { element.className += ' inline-block px-4 py-2' }) const paginationSelectedElement = document.querySelector( "ul[aria-label='Pagination']>li.selected", ) const paginationSelectedLinkElement = document.querySelector( "ul[aria-label='Pagination']>li.selected>a", ) Iif (paginationSelectedElement !== null) { paginationSelectedElement.className += ' bg-[rgba(34,51,70,1)] text-white' const selectedElementNewAriaLabel = localizedStrings.inbox.paginationText.page + Array.prototype.indexOf.call( paginationListElements, paginationSelectedElement, ) + currentLabel paginationSelectedLinkElement?.setAttribute( 'aria-label', selectedElementNewAriaLabel, ) } const previousLinkElement = document.querySelector( "ul[aria-label='Pagination']>li:first-child a", ) const nextLinkElement = document.querySelector( "ul[aria-label='Pagination']>li:last-child a", ) const extraLinkClasses = ' flex items-center rounded-sm py-1 text-deep-blue-dark underline hover:text-blue-hover focus:outline-1 focus:outline-blue-hover' previousLinkElement ? (previousLinkElement.className += extraLinkClasses) : '' nextLinkElement ? (nextLinkElement.className += extraLinkClasses) : '' previousLinkElement?.setAttribute('aria-label', previousLabel) nextLinkElement?.setAttribute('aria-label', nextLabel) } }) const language = locale === 'en' ? EN : FR const [itemOffset, setItemOffset] = useState(0) const endOffset = itemOffset + messagesPerPage const currentItems = messageEntities.slice(itemOffset, endOffset) const pageCount = Math.ceil(messageEntities.length / messagesPerPage) const handlePageClick = (selectedItem: { selected: number }) => { const pageSelected = selectedItem.selected const newOffset = pageSelected * messagesPerPage setItemOffset(newOffset) } return ( <> <MessageList messageEntities={currentItems} locale={locale} /> <ReactPaginate breakLabel="..." nextLabel={language.inbox.paginationText.nextLink} previousLabel={language.inbox.paginationText.previousLink} onPageChange={handlePageClick} pageRangeDisplayed={pageRangeDisplayed} pageCount={pageCount} renderOnZeroPageCount={null} /> </> ) } export default PaginatedMessages |