import { useCallback, useEffect, useMemo, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; import { ArrowLeft, Copy, ImageIcon, KeyRound, MessageCircle, Pencil, Plus, Search, X } from 'lucide-react'; import type { Note, Project, ReviewStatus } from '@shared/types'; import { api } from '@/api/client'; import StatusBadge from '@/components/StatusBadge'; const projectStatus = { draft: '待提交', reviewing: '验收中', completed: '验收完毕', archived: '已归档' } as const; export default function ProjectPage() { const id = Number(useParams().projectId); const [project, setProject] = useState(null); const [works, setWorks] = useState([]); const [q, setQ] = useState(''); const [status, setStatus] = useState(''); const [editOpen, setEditOpen] = useState(false); const [accessOpen, setAccessOpen] = useState(false); const [projectName, setProjectName] = useState(''); const [projectDesc, setProjectDesc] = useState(''); const [accessEnabled, setAccessEnabled] = useState(false); const [accessPassword, setAccessPassword] = useState(''); const [expiresAt, setExpiresAt] = useState(''); const [message, setMessage] = useState(''); const load = useCallback(async () => { const [nextProject, nextWorks] = await Promise.all([api.getProject(id), api.listProjectWorks(id)]); setProject(nextProject); setWorks(nextWorks); }, [id]); useEffect(() => { void load(); }, [load]); const filtered = useMemo(() => works.filter((work) => (!q || work.title.toLowerCase().includes(q.toLowerCase())) && (!status || work.review_status === status)), [works, q, status]); if (!project) return
正在打开项目…
; const reviewUrl = `${window.location.origin}/review/${project.slug}`; const openAccess = () => { setAccessEnabled(Boolean(project.customer_access_enabled)); setAccessPassword(''); setExpiresAt(project.access_expires_at?.slice(0, 16) || ''); setMessage(''); setAccessOpen(true); }; return
返回项目

Project / {project.slug}

{projectStatus[project.review_status]}

{project.name}

{project.client_description}

{([['','全部作品'],['pending','待验收'],['changes_requested','需修改'],['approved','已通过']] as [ReviewStatus|'',string][]).map(([value,label]) => )}
{project.status === 'active' && 上传作品}
{project.review_status === 'completed' &&
项目内所有已提交作品均已通过,客户验收页面当前为只读状态。新增作品或新轮次后会自动恢复验收。
}
{filtered.map((work) =>
{work.cover_image ? {work.title} :
}
{work.image_count > 1 && {work.image_count} 图}

{work.title}

{work.annotation_count + work.comment_count}第 {work.version_number} 轮
)}
{!filtered.length &&
{works.length ? '没有符合筛选条件的作品' : '项目还没有作品,上传第一件作品开始验收。'}
}
{editOpen && setEditOpen(false)}>