'use client'; import { useMemo, useState } from 'react'; import type { Post } from 'contentlayer/generated'; import { siteConfig } from '@/lib/config'; import { PostListItem } from './post-list-item'; interface Props { posts: Post[]; pageSize?: number; } type SortOrder = 'new' | 'old'; export function PostListWithControls({ posts, pageSize }: Props) { const [sortOrder, setSortOrder] = useState('new'); const [page, setPage] = useState(1); const size = pageSize ?? siteConfig.postsPerPage ?? 5; const sortedPosts = useMemo(() => { const arr = [...posts]; arr.sort((a, b) => { const aDate = a.published_at ? new Date(a.published_at).getTime() : 0; const bDate = b.published_at ? new Date(b.published_at).getTime() : 0; return sortOrder === 'new' ? bDate - aDate : aDate - bDate; }); return arr; }, [posts, sortOrder]); const totalPages = Math.max(1, Math.ceil(sortedPosts.length / size)); const currentPage = Math.min(page, totalPages); const start = (currentPage - 1) * size; const currentPosts = sortedPosts.slice(start, start + size); const handleChangeSort = (order: SortOrder) => { setSortOrder(order); setPage(1); }; const goToPage = (p: number) => { if (p < 1 || p > totalPages) return; setPage(p); }; return (
排序:
第 {currentPage} / {totalPages} 頁
{totalPages > 1 && ( )}
); }