implemented pagination component

Co-authored-by: Sindre Kjelsrud <kjelsrudsindre@gmail.com>
This commit is contained in:
haraldnilsen 2023-09-04 15:49:18 +02:00
parent 596e07bbf9
commit dcf43ec508
3 changed files with 35 additions and 8 deletions

View file

@ -26,6 +26,10 @@ function App() {
return Math.round(totalResults / 10) return Math.round(totalResults / 10)
} }
const handlePageChange = (pageNumber: number) => {
setCurrentPage(pageNumber)
}
return ( return (
<> <>
<q.div> <q.div>
@ -35,6 +39,7 @@ function App() {
<Pagination <Pagination
currentPage={currentPage} currentPage={currentPage}
totalPages={calculatePages(totalPages)} totalPages={calculatePages(totalPages)}
handlePageChange={handlePageChange}
/> />
)} )}
</q.div> </q.div>

View file

@ -5,9 +5,14 @@ import { useEffect, useState } from 'react'
interface PaginationProps { interface PaginationProps {
currentPage: number currentPage: number
totalPages: number totalPages: number
handlePageChange: (pageNumber: number) => void
} }
const Pagination: React.FC<PaginationProps> = ({ currentPage, totalPages }) => { const Pagination: React.FC<PaginationProps> = ({
currentPage,
totalPages,
handlePageChange,
}) => {
const [showLeftDots, setShowLeftDots] = useState(false) const [showLeftDots, setShowLeftDots] = useState(false)
const [showRightDots, setShowRightDots] = useState(false) const [showRightDots, setShowRightDots] = useState(false)
const [showingNumbers, setShowingNumbers] = useState([0]) const [showingNumbers, setShowingNumbers] = useState([0])
@ -15,8 +20,9 @@ const Pagination: React.FC<PaginationProps> = ({ currentPage, totalPages }) => {
useEffect(() => { useEffect(() => {
if (totalPages > 5) { if (totalPages > 5) {
setShowLeftDots(currentPage > 4 ? true : false) setShowLeftDots(currentPage > 4 ? true : false)
setShowRightDots(currentPage < totalPages - 4 ? true : false) setShowRightDots(currentPage < totalPages - 3 ? true : false)
} }
console.log('hei')
if (!showLeftDots && !showRightDots) { if (!showLeftDots && !showRightDots) {
setShowingNumbers(Array.from(Array(totalPages).keys())) setShowingNumbers(Array.from(Array(totalPages).keys()))
} }
@ -37,7 +43,7 @@ const Pagination: React.FC<PaginationProps> = ({ currentPage, totalPages }) => {
if (showLeftDots && showRightDots) { if (showLeftDots && showRightDots) {
setShowingNumbers([currentPage - 1, currentPage, currentPage + 1]) setShowingNumbers([currentPage - 1, currentPage, currentPage + 1])
} }
}, []) }, [totalPages, currentPage, showLeftDots, showRightDots])
return ( return (
<q.div> <q.div>
@ -45,20 +51,29 @@ const Pagination: React.FC<PaginationProps> = ({ currentPage, totalPages }) => {
<q.div className="flex gap-4"> <q.div className="flex gap-4">
{showLeftDots && ( {showLeftDots && (
<q.div className="flex"> <q.div className="flex">
<PaginationButton pageNumber={1} /> <PaginationButton
pageNumber={1}
handlePageChange={handlePageChange}
/>
... ...
</q.div> </q.div>
)} )}
{showingNumbers.map((page) => ( {showingNumbers.map((page) => (
<q.div> <q.div>
<PaginationButton pageNumber={page} /> <PaginationButton
pageNumber={page}
handlePageChange={handlePageChange}
/>
</q.div> </q.div>
))} ))}
{showRightDots && ( {showRightDots && (
<q.div className="flex"> <q.div className="flex">
... ...
<PaginationButton pageNumber={totalPages} />{' '} <PaginationButton
pageNumber={totalPages}
handlePageChange={handlePageChange}
/>{' '}
</q.div> </q.div>
)} )}
</q.div> </q.div>

View file

@ -2,11 +2,18 @@ import q from 'qjuul'
interface PaginationButtonProps { interface PaginationButtonProps {
pageNumber: number pageNumber: number
handlePageChange: (pageNumber: number) => void
} }
const PaginationButton: React.FC<PaginationButtonProps> = ({ pageNumber }) => { const PaginationButton: React.FC<PaginationButtonProps> = ({
pageNumber,
handlePageChange,
}) => {
return ( return (
<q.div className="bg-red-400 p-2 rounded-md"> <q.div
onClick={() => handlePageChange(pageNumber)}
className="bg-red-400 p-2 rounded-md"
>
<p>{pageNumber}</p> <p>{pageNumber}</p>
</q.div> </q.div>
) )