import { useState, useEffect } from 'react' import { useParams, useNavigate } from 'react-router-dom' import api from '@/services/api' import type { Project, ProjectMember, Issue, Milestone, PaginatedResponse } from '@/types' import dayjs from 'dayjs' export default function ProjectDetailPage() { const { id } = useParams() const navigate = useNavigate() const [project, setProject] = useState(null) const [members, setMembers] = useState([]) const [issues, setIssues] = useState([]) const [milestones, setMilestones] = useState([]) const [editing, setEditing] = useState(false) const [editForm, setEditForm] = useState({ name: '', description: '', repo: '' }) useEffect(() => { api.get(`/projects/${id}`).then(({ data }) => { setProject(data) setEditForm({ name: data.name, description: data.description || '', repo: data.repo || '' }) }) api.get(`/projects/${id}/members`).then(({ data }) => setMembers(data)) api.get>(`/issues?project_id=${id}&page_size=10`).then(({ data }) => setIssues(data.items)) api.get(`/milestones?project_id=${id}`).then(({ data }) => setMilestones(data)) }, [id]) const updateProject = async (e: React.FormEvent) => { e.preventDefault() const { data } = await api.patch(`/projects/${id}`, editForm) setProject(data) setEditing(false) } if (!project) return
加载中...
return (
{editing ? (
setEditForm({ ...editForm, name: e.target.value })} required /> setEditForm({ ...editForm, description: e.target.value })} placeholder="描述" /> setEditForm({ ...editForm, repo: e.target.value })} placeholder="仓库地址" />
) : ( <>

📁 {project.name}

{project.description || '暂无描述'}

{project.repo &&

📦 {project.repo}

} )}

成员 ({members.length})

{members.length > 0 ? (
{members.map((m) => ( {`用户 #${m.user_id} (${m.role})`} ))}
) : (

暂无成员

)}

里程碑 ({milestones.length})

{milestones.map((ms) => (
navigate(`/milestones/${ms.id}`)}> {ms.status} {ms.title} {ms.due_date && · 截止 {dayjs(ms.due_date).format('YYYY-MM-DD')}}
))} {milestones.length === 0 &&

暂无里程碑

}

最近 Issues

{issues.map((i) => ( navigate(`/issues/${i.id}`)}> ))}
#标题状态优先级
{i.id} {i.title} {i.status} {i.priority}
) }