✨ 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
	
	 haraldnilsen
						haraldnilsen