import { useEffect, useState } from 'react' import { useParams, useNavigate } from 'react-router-dom' import { ArrowLeft, Download, Calendar, Clock, Users, Search, FileText, AlignLeft, Loader2, User, Sparkles, Edit2, Check, X, ChevronDown, Copy, CheckCheck } from 'lucide-react' import { useAppStore } from '../store/useAppStore' import { getMeeting, downloadMarkdown, formatDuration, formatTimestamp, generateSummary, updateMeetingTitle } from '../api/meeting' import Button from '../components/Button' export default function MeetingDetail() { const { id } = useParams() const navigate = useNavigate() const { currentMeeting, loading, setCurrentMeeting, refreshMeetings } = useAppStore() const [search, setSearch] = useState('') const [summarizing, setSummarizing] = useState(false) const [editingTitle, setEditingTitle] = useState(false) const [titleInput, setTitleInput] = useState('') const [summaryCollapsed, setSummaryCollapsed] = useState(false) const [briefCopied, setBriefCopied] = useState(false) const [detailedCopied, setDetailedCopied] = useState(false) useEffect(() => { loadMeeting() }, [id]) const loadMeeting = async () => { const data = await getMeeting(id) setCurrentMeeting(data) } const handleGenerateSummary = async () => { setSummarizing(true) try { const updated = await generateSummary(id) setCurrentMeeting(updated) } catch (err) { alert('生成摘要失败: ' + err.message) } finally { setSummarizing(false) } } const handleEditTitle = () => { setTitleInput(currentMeeting?.title || '') setEditingTitle(true) } const handleSaveTitle = async () => { if (!titleInput.trim()) return try { const updated = await updateMeetingTitle(id, titleInput.trim()) setCurrentMeeting(updated) refreshMeetings() } catch (err) { alert('保存失败: ' + err.message) } setEditingTitle(false) } const handleCancelTitle = () => { setEditingTitle(false) setTitleInput('') } const copyToClipboard = async (text, type) => { await navigator.clipboard.writeText(text) if (type === 'brief') { setBriefCopied(true) setTimeout(() => setBriefCopied(false), 2000) } else { setDetailedCopied(true) setTimeout(() => setDetailedCopied(false), 2000) } } if (loading || !currentMeeting) { return (
请稍候,预计需要几分钟时间
{meeting.brief_summary}
{meeting.detailed_summary}
{filteredSegments.length} / {segments.length} 条
{seg.text}