import { useEffect, useMemo, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; import { ArrowLeft, ImageIcon, MessageCircle, Pencil, Plus, Search, X } from 'lucide-react'; import type { Note, Project, ReviewStatus, WorkCollection } from '@shared/types'; import { api } from '@/api/client'; import StatusBadge from '@/components/StatusBadge'; import { useAuthStore } from '@/store/useAuthStore'; import CollectionStatusBadge from '@/components/CollectionStatusBadge'; export default function CollectionPage(){ const {projectId,collectionId}=useParams(); const pid=Number(projectId),cid=Number(collectionId); const [project,setProject]=useState(null); const [collection,setCollection]=useState(null); const [works,setWorks]=useState([]); const [q,setQ]=useState(''); const [status,setStatus]=useState(''); const [editing,setEditing]=useState(false); const [editName,setEditName]=useState(''); const [editDesc,setEditDesc]=useState(''); const user=useAuthStore(state=>state.user); useEffect(()=>{Promise.all([api.getProject(pid),api.listCollections(pid),api.listNotes({collectionId:cid})]).then(([p,cs,w])=>{setProject(p);setCollection(cs.find(x=>x.id===cid)||null);setWorks(w)})},[pid,cid]); const filtered=useMemo(()=>works.filter(w=>(!q||w.title.toLowerCase().includes(q.toLowerCase()))&&(!status||w.review_status===status)),[works,q,status]); if(!project||!collection)return null; return
{project.name}

Collection / Review Board

{collection.name}

{collection.client_description}

{collection.work_count ? `${collection.approved_count}/${collection.work_count} 件作品已通过` : '上传首件作品后自动进入验收'}

{user&&
上传作品
}
{([['','全部'],['pending','待验收'],['changes_requested','需修改'],['approved','已通过']] as [ReviewStatus|'',string][]).map(([v,l])=>)}
{filtered.map((work,i)=>
{work.cover_image?{work.title}:
}
{work.image_count>1&&{work.image_count} 图}

{work.title}

{work.annotation_count+work.comment_count}{work.tags.slice(0,2).map(t=>#{t})}
)}
{editing&&

编辑作品交付集