'use client'; import { useEffect, useState, useCallback } from 'react'; import { Skeleton } from '@/components/ui/skeleton'; import { API_BASE } from '@/lib/config'; interface PendingComment { id: number; content: string; status: string; createdAt: string; user: { id: number; nickname: string; avatar: string | null }; post: { id: number; title: string }; } export default function AdminCommentsPage() { const [comments, setComments] = useState([]); const [loading, setLoading] = useState(true); const [tab, setTab] = useState<'pending' | 'approved' | 'rejected'>('pending'); const base = API_BASE; function headers() { const t = localStorage.getItem('adminToken'); return { 'Content-Type': 'application/json', ...(t ? { Authorization: `Bearer ${t}` } : {}) }; } const load = useCallback(async () => { setLoading(true); try { const url = tab === 'pending' ? '/admin/comments/pending' : tab === 'approved' ? '/admin/comments?status=PUBLISHED' : '/admin/comments?status=REJECTED'; const res = await fetch(`${base}${url}`, { headers: headers() }); if (res.ok) { const data = await res.json(); setComments(data.items || []); } } catch (e) { console.error(e) } setLoading(false); }, [tab, base]); useEffect(() => { load(); }, [load]); async function approve(id: number) { try { const res = await fetch(`${base}/admin/comments/${id}/approve`, { method: 'PUT', headers: headers(), }); if (res.ok) setComments(prev => prev.filter(c => c.id !== id)); } catch (e) { console.error(e) } } async function reject(id: number) { const reason = prompt('请输入拒绝原因:'); if (!reason) return; try { const res = await fetch(`${base}/admin/comments/${id}/reject`, { method: 'PUT', headers: headers(), body: JSON.stringify({ reason }), }); if (res.ok) setComments(prev => prev.filter(c => c.id !== id)); } catch (e) { console.error(e) } } return ( <>

评论审核

{(['pending', 'approved', 'rejected'] as const).map(t => ( ))}
{loading ? (
{[1,2,3].map(i => (
))}
) : comments.length === 0 ? (

{tab === 'pending' ? '✅' : '📝'}

{tab === 'pending' ? '暂无待审核评论' : tab === 'approved' ? '暂无已通过评论' : '暂无已拒绝评论'}

) : (
{comments.map(c => (
{c.user.nickname?.[0] || 'U'}
{c.user.nickname || '用户'} · {new Date(c.createdAt).toLocaleString('zh-CN')}

{c.content}

来源: {c.post.title} {tab === 'pending' && (
)}
))}
)}
); }