🚧 fixing pagination-logic
Co-authored-by: haraldnilsen <harald_998@hotmail.com>
This commit is contained in:
		
							parent
							
								
									898590ac55
								
							
						
					
					
						commit
						596e07bbf9
					
				
					 3 changed files with 77 additions and 9 deletions
				
			
		
							
								
								
									
										16
									
								
								src/App.tsx
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								src/App.tsx
									
										
									
									
									
								
							|  | @ -2,6 +2,7 @@ import { useEffect, useState } from 'react' | ||||||
| import './App.css' | import './App.css' | ||||||
| import q from 'qjuul' | import q from 'qjuul' | ||||||
| import { PaginationButton } from './components' | import { PaginationButton } from './components' | ||||||
|  | import Pagination from './components/Pagination' | ||||||
| 
 | 
 | ||||||
| function App() { | function App() { | ||||||
|   const API_MOVIE_KEY = 'd92949d8' |   const API_MOVIE_KEY = 'd92949d8' | ||||||
|  | @ -30,15 +31,12 @@ function App() { | ||||||
|       <q.div> |       <q.div> | ||||||
|         <q.div> |         <q.div> | ||||||
|           <q.h1>All movies</q.h1> |           <q.h1>All movies</q.h1> | ||||||
|           <q.h2>Pages</q.h2> |           {!loading && totalPages && ( | ||||||
|           <q.p>{calculatePages(totalPages)}</q.p> |             <Pagination | ||||||
|           <q.div className="flex gap-4"> |               currentPage={currentPage} | ||||||
|             {Array.from(Array(calculatePages(totalPages)).keys()).map( |               totalPages={calculatePages(totalPages)} | ||||||
|               (page) => ( |             /> | ||||||
|                 <PaginationButton pageNumber={page + 1} /> |           )} | ||||||
|               ) |  | ||||||
|             )} |  | ||||||
|           </q.div> |  | ||||||
|         </q.div> |         </q.div> | ||||||
|         {!loading && movies ? ( |         {!loading && movies ? ( | ||||||
|           <q.div> |           <q.div> | ||||||
|  |  | ||||||
							
								
								
									
										70
									
								
								src/components/Pagination/index.tsx
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/components/Pagination/index.tsx
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,70 @@ | ||||||
|  | import q from 'qjuul' | ||||||
|  | import PaginationButton from '../PaginationButton' | ||||||
|  | import { useEffect, useState } from 'react' | ||||||
|  | 
 | ||||||
|  | interface PaginationProps { | ||||||
|  |   currentPage: number | ||||||
|  |   totalPages: number | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const Pagination: React.FC<PaginationProps> = ({ currentPage, totalPages }) => { | ||||||
|  |   const [showLeftDots, setShowLeftDots] = useState(false) | ||||||
|  |   const [showRightDots, setShowRightDots] = useState(false) | ||||||
|  |   const [showingNumbers, setShowingNumbers] = useState([0]) | ||||||
|  | 
 | ||||||
|  |   useEffect(() => { | ||||||
|  |     if (totalPages > 5) { | ||||||
|  |       setShowLeftDots(currentPage > 4 ? true : false) | ||||||
|  |       setShowRightDots(currentPage < totalPages - 4 ? true : false) | ||||||
|  |     } | ||||||
|  |     if (!showLeftDots && !showRightDots) { | ||||||
|  |       setShowingNumbers(Array.from(Array(totalPages).keys())) | ||||||
|  |     } | ||||||
|  |     if (!showLeftDots && showRightDots) { | ||||||
|  |       setShowingNumbers([1, 2, 3, 4, 5]) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (showLeftDots && !showRightDots) { | ||||||
|  |       setShowingNumbers([ | ||||||
|  |         totalPages - 4, | ||||||
|  |         totalPages - 3, | ||||||
|  |         totalPages - 2, | ||||||
|  |         totalPages - 1, | ||||||
|  |         totalPages, | ||||||
|  |       ]) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (showLeftDots && showRightDots) { | ||||||
|  |       setShowingNumbers([currentPage - 1, currentPage, currentPage + 1]) | ||||||
|  |     } | ||||||
|  |   }, []) | ||||||
|  | 
 | ||||||
|  |   return ( | ||||||
|  |     <q.div> | ||||||
|  |       {totalPages > 0 && ( | ||||||
|  |         <q.div className="flex gap-4"> | ||||||
|  |           {showLeftDots && ( | ||||||
|  |             <q.div className="flex"> | ||||||
|  |               <PaginationButton pageNumber={1} /> | ||||||
|  |               ... | ||||||
|  |             </q.div> | ||||||
|  |           )} | ||||||
|  | 
 | ||||||
|  |           {showingNumbers.map((page) => ( | ||||||
|  |             <q.div> | ||||||
|  |               <PaginationButton pageNumber={page} /> | ||||||
|  |             </q.div> | ||||||
|  |           ))} | ||||||
|  |           {showRightDots && ( | ||||||
|  |             <q.div className="flex"> | ||||||
|  |               ... | ||||||
|  |               <PaginationButton pageNumber={totalPages} />{' '} | ||||||
|  |             </q.div> | ||||||
|  |           )} | ||||||
|  |         </q.div> | ||||||
|  |       )} | ||||||
|  |     </q.div> | ||||||
|  |   ) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export default Pagination | ||||||
							
								
								
									
										0
									
								
								src/components/Pagination/styles.css
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/components/Pagination/styles.css
									
										
									
									
									
										Normal file
									
								
							
		Reference in a new issue
	
	 Sindre Kjelsrud
						Sindre Kjelsrud