'use client'; import { useQuery } from '@tanstack/react-query'; import { getPosts } from '@/api/posts'; import { Post } from '@/types'; import { Loader2, Calendar, Archive, FileText, ChevronRight } from 'lucide-react'; import { useMemo } from 'react'; import Link from 'next/link'; import { format } from 'date-fns'; import { clsx } from 'clsx'; export default function ArchivePage() { // 1. 전체 게시글 조회 (최대 1000개) const { data, isLoading } = useQuery({ queryKey: ['posts', 'all'], queryFn: () => getPosts({ page: 0, size: 1000 }), staleTime: 1000 * 60 * 5, // 5분 캐시 }); // 2. 게시글 그룹화 (연도 -> 월) const archiveGroups = useMemo(() => { if (!data?.content) return {}; const groups: { [year: string]: { [month: string]: Post[] } } = {}; data.content.forEach((post) => { const date = new Date(post.createdAt); const year = date.getFullYear().toString(); const month = (date.getMonth() + 1).toString().padStart(2, '0'); // '01', '02' 형식 if (!groups[year]) groups[year] = {}; if (!groups[year][month]) groups[year][month] = []; groups[year][month].push(post); }); return groups; }, [data]); // 3. 연도 내림차순 정렬 const sortedYears = useMemo(() => { return Object.keys(archiveGroups).sort((a, b) => Number(b) - Number(a)); }, [archiveGroups]); // 🛠️ 총 게시글 수 수정 (백엔드 PagedModel 대응) // page 정보가 data 안에 직접 있거나, page 객체 안에 있을 수 있음 const meta = (data as any)?.page || data; const totalPosts = meta?.totalElements || 0; if (isLoading) { return (
); } return (
{/* 헤더 섹션 */}

Archives

지금까지 작성한 {totalPosts}개의 글이 기록되어 있습니다.

{/* 타임라인 컨텐츠 */} {sortedYears.length > 0 ? (
{/* 타임라인 수직선 (좌측 장식) */}
{sortedYears.map((year) => { const months = archiveGroups[year]; // 월 내림차순 정렬 const sortedMonths = Object.keys(months).sort((a, b) => Number(b) - Number(a)); return (
{/* 연도 헤더 */}

{year}

{/* 월별 그룹 */}
{sortedMonths.map((month) => { const posts = months[month]; // 게시글 날짜 내림차순 정렬 const sortedPosts = posts.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()); return (

{month}월 {posts.length}

{sortedPosts.map((post) => (

{post.title}

{post.categoryName} {format(new Date(post.createdAt), 'yyyy.MM.dd')}
))}
); })}
); })}
) : (

아직 작성된 기록이 없습니다.

)}
); }