✨ implemented pagination component
Co-authored-by: Sindre Kjelsrud <kjelsrudsindre@gmail.com>
This commit is contained in:
parent
596e07bbf9
commit
dcf43ec508
3 changed files with 35 additions and 8 deletions
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
)
|
)
|
||||||
|
|
Reference in a new issue