'use client' import Link from 'next/link' import { Clock, Users, Mic } from 'lucide-react' import type { Meeting } from '@/lib/mock-data' import { formatDuration } from '@/lib/mock-data' import { cn } from '@/lib/utils' const statusConfig = { pending: { label: '排队中', color: 'text-muted-foreground', dot: 'bg-muted-foreground/60' }, uploading: { label: '上传中', color: 'text-info', dot: 'bg-info' }, transcribing: { label: '转写中', color: 'text-warning', dot: 'bg-warning animate-pulse' }, summarizing: { label: '总结中', color: 'text-warning', dot: 'bg-warning animate-pulse' }, done: { label: '已完成', color: 'text-success', dot: 'bg-success' }, failed: { label: '失败 · 重试', color: 'text-danger', dot: 'bg-danger' }, } export function MeetingCard({ meeting }: { meeting: Meeting }) { const cfg = statusConfig[meeting.status] const time = new Date(meeting.date).toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit', hour12: false, }) const isProcessing = meeting.status === 'transcribing' || meeting.status === 'summarizing' return (

{meeting.title}

{time} · {formatDuration(meeting.duration)} {meeting.participants && meeting.participants.length > 0 && ( {meeting.participants.join(' · ')} )}
{cfg.label} {isProcessing && meeting.chunksTotal ? ` ${meeting.chunksDone}/${meeting.chunksTotal} 片` : ''}
{/* Progress bar for processing */} {isProcessing && meeting.progress != null && (
)} {/* Summary preview for done */} {meeting.status === 'done' && meeting.summary && ( <>

{meeting.summary.preview}

{meeting.summary.keywords.map((kw) => ( #{kw} ))}
)} ) }