'use client'; import { useEffect, useState } from 'react'; import Link from 'next/link'; import { useParams } from 'next/navigation'; import { Skeleton } from '@/components/ui/skeleton'; import { API_BASE } from '@/lib/config'; interface Post { id: number; title: string; content: string; tags?: string; viewCount: number; likeCount: number; createdAt: string; user?: { id: number; nickname: string; avatar?: string }; } export default function CircleDetail() { const params = useParams(); const circleId = Number(params.id); const [circle, setCircle] = useState(null); const [posts, setPosts] = useState([]); const [loading, setLoading] = useState(true); const [isMember, setIsMember] = useState(false); const [showCreateForm, setShowCreateForm] = useState(false); const [formTitle, setFormTitle] = useState(''); const [formContent, setFormContent] = useState(''); useEffect(() => { loadData(); }, [circleId]); async function loadData() { try { const token = localStorage.getItem('token'); const headers: Record = {}; if (token) headers['Authorization'] = `Bearer ${token}`; const [circleRes, postsRes] = await Promise.all([ fetch(`${API_BASE}/circles/${circleId}`, { headers }), fetch(`${API_BASE}/circles/${circleId}/posts`, { headers }), ]); if (circleRes.ok) setCircle(await circleRes.json()); if (postsRes.ok) { const data = await postsRes.json(); setPosts(data.items || []); } if (token) { const memRes = await fetch(`${API_BASE}/circles/${circleId}/membership`, { headers: { Authorization: `Bearer ${token}` }, }); if (memRes.ok) { const memData = await memRes.json(); setIsMember(memData.isMember); } } } catch (e) { console.error(e) } setLoading(false); } async function toggleJoin() { const token = localStorage.getItem('token'); if (!token) return; const method = isMember ? 'POST' : 'POST'; const url = isMember ? `${API_BASE}/circles/${circleId}/leave` : `${API_BASE}/circles/${circleId}/join`; try { const res = await fetch(url, { method, headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' }, }); if (res.ok) { setIsMember(!isMember); loadData(); } } catch (e) { console.error(e) } } async function handleCreatePost() { const token = localStorage.getItem('token'); if (!token || !formTitle || !formContent) return; try { const res = await fetch(`${API_BASE}/community/posts`, { method: 'POST', headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ title: formTitle, content: formContent, circleId }), }); if (res.ok) { setFormTitle(''); setFormContent(''); setShowCreateForm(false); loadData(); } } catch (e) { console.error(e) } } if (loading) return (
); return (
← 返回圈子列表

{circle?.name || '圈子详情'}

{circle?.description}

{circle?._count?.members || 0} 人加入 {circle?._count?.posts || 0} 帖子
{showCreateForm && (
setFormTitle(e.target.value)} placeholder="标题" className="w-full px-4 py-2 border border-border rounded-lg mb-3 text-sm" />