import { useState, useEffect } from 'react' import { useParams, useNavigate } from 'react-router-dom' import api from '@/services/api' import type { Issue, Comment } from '@/types' import dayjs from 'dayjs' export default function IssueDetailPage() { const { id } = useParams() const navigate = useNavigate() const [issue, setIssue] = useState(null) const [comments, setComments] = useState([]) const [newComment, setNewComment] = useState('') useEffect(() => { api.get(`/issues/${id}`).then(({ data }) => setIssue(data)) api.get(`/issues/${id}/comments`).then(({ data }) => setComments(data)) }, [id]) const addComment = async () => { if (!newComment.trim() || !issue) return await api.post('/comments', { content: newComment, issue_id: issue.id, author_id: 1 }) setNewComment('') const { data } = await api.get(`/issues/${id}/comments`) setComments(data) } const transition = async (newStatus: string) => { await api.post(`/issues/${id}/transition?new_status=${newStatus}`) const { data } = await api.get(`/issues/${id}`) setIssue(data) } if (!issue) return
加载中...
const statusActions: Record = { open: ['in_progress', 'blocked'], in_progress: ['resolved', 'blocked'], blocked: ['open', 'in_progress'], resolved: ['closed', 'open'], closed: ['open'], } return (

#{issue.id} {issue.title}

{issue.status} {issue.priority} {issue.issue_type} {issue.tags && {issue.tags}}

描述

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

详情

创建时间
{dayjs(issue.created_at).format('YYYY-MM-DD HH:mm')}
{issue.due_date && <>
截止日期
{dayjs(issue.due_date).format('YYYY-MM-DD')}
} {issue.updated_at && <>
更新时间
{dayjs(issue.updated_at).format('YYYY-MM-DD HH:mm')}
}

状态变更

{(statusActions[issue.status] || []).map((s) => ( ))}

评论 ({comments.length})

{comments.map((c) => (
用户 #{c.author_id} · {dayjs(c.created_at).format('MM-DD HH:mm')}

{c.content}

))}