'use client'; import { use, useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { clsx } from 'clsx'; import { ChevronLeft, ChevronRight, LayoutGrid, List, Loader2, Search as SearchIcon } from 'lucide-react'; import { getPostsByCategory } from '@/api/posts'; import PostCard from '@/components/post/PostCard'; import PostListItem from '@/components/post/PostListItem'; import PostSearch from '@/components/post/PostSearch'; import EmptyState from '@/components/ui/EmptyState'; import Surface from '@/components/ui/Surface'; import WindowSurface from '@/components/ui/WindowSurface'; const PAGE_SIZE = 10; const isNoticeCategoryName = (categoryName: string) => { const normalizedName = categoryName.toLowerCase(); return categoryName === '공지' || normalizedName === 'notice' || normalizedName === 'announcement'; }; export default function CategoryPage({ params }: { params: Promise<{ id: string }> }) { const { id } = use(params); const categoryName = decodeURIComponent(id); const apiCategoryName = categoryName === 'uncategorized' ? '미분류' : categoryName; const isNoticeCategory = isNoticeCategoryName(apiCategoryName); const [page, setPage] = useState(0); const [keyword, setKeyword] = useState(''); const [viewMode, setViewMode] = useState<'grid' | 'list'>(() => { if (isNoticeCategory || typeof window === 'undefined') return isNoticeCategory ? 'list' : 'grid'; const savedMode = localStorage.getItem('postViewMode'); return savedMode === 'list' ? 'list' : 'grid'; }); const activeViewMode = isNoticeCategory ? 'list' : viewMode; const handleViewModeChange = (mode: 'grid' | 'list') => { setViewMode(mode); if (!isNoticeCategory) { localStorage.setItem('postViewMode', mode); } }; const handleSearch = (newKeyword: string) => { setKeyword(newKeyword); setPage(0); }; const { data: postsData, isLoading, error, isPlaceholderData } = useQuery({ queryKey: ['posts', 'category', apiCategoryName, page, keyword], queryFn: () => getPostsByCategory(apiCategoryName, page, PAGE_SIZE, keyword), placeholderData: (previousData) => previousData, }); if (isLoading || (postsData === undefined && !error)) { return (