'use client'; import { useState, useEffect } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import Link from 'next/link'; import { boardApi, BoardPostListItem, BoardCategory, BoardPostListResponse, BoardCategoryListResponse } from '@/lib/api'; import { useAuthStore } from '@/lib/store'; import { useTranslate } from '@/lib/useTranslate'; import { useLanguageStore } from '@/lib/i18n'; export default function BoardPage() { const router = useRouter(); const searchParams = useSearchParams(); const { user, token } = useAuthStore(); const isLoggedIn = !!token && !!user; const { translate } = useTranslate(); const { language } = useLanguageStore(); const [posts, setPosts] = useState([]); const [notices, setNotices] = useState([]); const [categories, setCategories] = useState([]); const [total, setTotal] = useState(0); const [totalPages, setTotalPages] = useState(1); const [loading, setLoading] = useState(true); const page = parseInt(searchParams.get('page') || '1'); const categoryId = searchParams.get('category') ? parseInt(searchParams.get('category')!) : undefined; const search = searchParams.get('search') || ''; const getCategoryName = (cat: BoardCategory) => { if (language === 'en' && cat.name_en) return cat.name_en; if (language === 'mn' && cat.name_mn) return cat.name_mn; if (language === 'ru' && cat.name_ru) return cat.name_ru; return cat.name; }; useEffect(() => { const fetchData = async () => { setLoading(true); try { const [postsRes, categoriesRes] = await Promise.all([ boardApi.getPosts({ page, page_size: 20, category_id: categoryId, search }), boardApi.getCategories(), ]); setPosts(postsRes.posts); setNotices(postsRes.notices); setTotal(postsRes.total); setTotalPages(postsRes.total_pages); setCategories(categoriesRes.categories); } catch (error) { console.error('Failed to fetch board data:', error); } finally { setLoading(false); } }; fetchData(); }, [page, categoryId, search]); const formatDate = (dateStr: string) => { const date = new Date(dateStr); const now = new Date(); const diff = now.getTime() - date.getTime(); const days = Math.floor(diff / (1000 * 60 * 60 * 24)); if (days === 0) { return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); } else if (days < 7) { return `${days}d ago`; } else { return date.toLocaleDateString(); } }; const handleCategoryChange = (catId: number | undefined) => { const params = new URLSearchParams(); if (catId) params.set('category', catId.toString()); if (search) params.set('search', search); router.push(`/board?${params.toString()}`); }; const handleSearch = (e: React.FormEvent) => { e.preventDefault(); const formData = new FormData(e.currentTarget); const searchValue = formData.get('search') as string; const params = new URLSearchParams(); if (categoryId) params.set('category', categoryId.toString()); if (searchValue) params.set('search', searchValue); router.push(`/board?${params.toString()}`); }; const renderPostRow = (post: BoardPostListItem, isNotice: boolean = false) => ( router.push(`/board/${post.id}`)} > {isNotice ? ( Notice ) : ( post.id )}
{post.is_pinned && !isNotice && ( )} {post.title}
{post.category_name || '-'} {post.author_name || 'Unknown'} {post.view_count} {formatDate(post.created_at)} ); return (
{/* Header */}

{translate('Board')}

{isLoggedIn && ( {translate('Write')} )}
{/* Categories & Search */}
{/* Category Tabs */}
{categories.map((cat) => ( ))}
{/* Search */}
{/* Posts Table */}
{loading ? (
) : notices.length === 0 && posts.length === 0 ? (
{translate('No posts yet')}
) : ( {notices.map((notice) => renderPostRow(notice, true))} {posts.map((post) => renderPostRow(post, false))}
# {translate('Title')} {translate('Category')} {translate('Author')} {translate('Views')} {translate('Date')}
)}
{/* Pagination */} {totalPages > 1 && (
)} {/* Login prompt for non-logged in users */} {!isLoggedIn && (

{translate('Please login to write a post')}.{' '} {translate('Login')}

)}
); }