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.
		
		
		
		
		
			
		
			
				
					
					
						
							40 lines
						
					
					
						
							1.1 KiB
						
					
					
				
			
		
		
	
	
							40 lines
						
					
					
						
							1.1 KiB
						
					
					
				| 'use client';
 | |
| 
 | |
| import { useState } from 'react';
 | |
| import { type Post } from 'contentlayer/generated';
 | |
| 
 | |
| import { PageControls } from '@/components/page-controls';
 | |
| import { PostCard } from '@/components/post-card';
 | |
| 
 | |
| type PostPaginatorProps = {
 | |
|   posts: Post[];
 | |
|   postsPerPage?: number;
 | |
| };
 | |
| 
 | |
| export function PostPaginator({ posts, postsPerPage = 5 }: PostPaginatorProps) {
 | |
|   const [currentPage, setCurrentPage] = useState(1);
 | |
|   const lastPage = Math.ceil(posts.length / postsPerPage);
 | |
| 
 | |
|   return (
 | |
|     <section className="flex h-full w-full flex-col space-y-4">
 | |
|       <PageControls
 | |
|         setCurrentPage={setCurrentPage}
 | |
|         currentPage={currentPage}
 | |
|         lastPage={lastPage}
 | |
|       />
 | |
|       <div className="flex h-full w-full flex-col space-y-4">
 | |
|         {posts
 | |
|           .slice((currentPage - 1) * postsPerPage, currentPage * postsPerPage)
 | |
|           .map((post) => (
 | |
|             <PostCard key={post._id} post={post} />
 | |
|           ))}
 | |
|       </div>
 | |
|       <PageControls
 | |
|         setCurrentPage={setCurrentPage}
 | |
|         currentPage={currentPage}
 | |
|         lastPage={lastPage}
 | |
|         bottom
 | |
|       />
 | |
|     </section>
 | |
|   );
 | |
| }
 | |
| 
 |