All files / components PaginatedMessages.tsx

0% Statements 0/42
0% Branches 0/13
0% Functions 0/4
0% Lines 0/41

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