You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							88 lines
						
					
					
						
							2.7 KiB
						
					
					
				
			
		
		
	
	
							88 lines
						
					
					
						
							2.7 KiB
						
					
					
				| import { ArrowLeft, ArrowRight } from 'lucide-react';
 | |
| 
 | |
| import { cn } from '@/lib/utils';
 | |
| 
 | |
| type PageControlsProps = {
 | |
|   currentPage: number;
 | |
|   lastPage: number;
 | |
|   setCurrentPage: (page: number) => void;
 | |
|   bottom?: boolean;
 | |
| };
 | |
| 
 | |
| export function PageControls({
 | |
|   currentPage,
 | |
|   lastPage,
 | |
|   bottom = false,
 | |
|   setCurrentPage,
 | |
| }: PageControlsProps) {
 | |
|   return (
 | |
|     <div className="grid w-full grid-cols-[6rem,1fr,6rem] items-center justify-between">
 | |
|       <button
 | |
|         onClick={() => {
 | |
|           setCurrentPage(currentPage - 1);
 | |
|           if (bottom) {
 | |
|             document.body.scrollTop = 0;
 | |
|             document.documentElement.scrollTop = 0;
 | |
|           }
 | |
|         }}
 | |
|         disabled={currentPage === 1}
 | |
|         className={cn(
 | |
|           'flex h-6 flex-row items-center space-x-1 justify-self-start',
 | |
|           bottom ? 'place-self-start' : 'place-self-end',
 | |
|           'text-slate-600 enabled:hover:text-accent disabled:text-slate-400',
 | |
|           'dark:text-slate-300 dark:enabled:hover:text-accent-dark dark:disabled:text-slate-500',
 | |
|         )}
 | |
|       >
 | |
|         <ArrowLeft aria-label="Previous page" />
 | |
|         <span>Прошлые</span>
 | |
|       </button>
 | |
|       <div className="flex flex-row flex-wrap justify-center space-x-2 px-2 text-2xl">
 | |
|         {Array.from({ length: currentPage }, (_, i) => (
 | |
|           <span
 | |
|             key={i}
 | |
|             className={cn(
 | |
|               currentPage === i + 1
 | |
|                 ? 'leading-3'
 | |
|                 : currentPage === i + 2
 | |
|                 ? 'leading-4'
 | |
|                 : 'leading-5',
 | |
|               'text-slate-800 dark:text-slate-300',
 | |
|             )}
 | |
|           >
 | |
|             •
 | |
|           </span>
 | |
|         ))}
 | |
|         {Array.from({ length: lastPage - currentPage }, (_, i) => (
 | |
|           <span
 | |
|             key={i}
 | |
|             className={cn(
 | |
|               i === 0 ? 'leading-4' : 'leading-5',
 | |
|               'text-slate-400 dark:text-slate-500',
 | |
|             )}
 | |
|           >
 | |
|             •
 | |
|           </span>
 | |
|         ))}
 | |
|       </div>
 | |
|       <button
 | |
|         onClick={() => {
 | |
|           setCurrentPage(currentPage + 1);
 | |
|           if (bottom) {
 | |
|             document.body.scrollTop = 0;
 | |
|             document.documentElement.scrollTop = 0;
 | |
|           }
 | |
|         }}
 | |
|         disabled={currentPage === lastPage}
 | |
|         className={cn(
 | |
|           'flex h-6 flex-row items-center justify-end space-x-1 justify-self-end',
 | |
|           bottom ? 'place-self-start' : 'place-self-end',
 | |
|           'text-slate-600 enabled:hover:text-accent disabled:text-slate-400',
 | |
|           'dark:text-slate-300 dark:enabled:hover:text-accent-dark dark:disabled:text-slate-500',
 | |
|         )}
 | |
|       >
 | |
|         <span className="h-full">Новые</span>
 | |
|         <ArrowRight aria-label="Next page" />
 | |
|       </button>
 | |
|     </div>
 | |
|   );
 | |
| }
 | |
| 
 |