import { useState } from 'react'; import { useDocuments, useCreateDocument, useDeleteDocument, useAnalyzeDocument, useDocumentAnalysis } from '@/hooks/useDocuments'; import { Button } from '@/components/Button'; import { Input } from '@/components/Input'; import { Card } from '@/components/Card'; import { Plus, Trash2, Search, Sparkles, Tag, FolderOpen } from 'lucide-react'; import { useSearchDocuments } from '@/hooks/useDocuments'; import type { Document } from '@/types'; export default function DocumentsPage() { const { data: documents } = useDocuments(); const createDocument = useCreateDocument(); const deleteDocument = useDeleteDocument(); const analyzeDocument = useAnalyzeDocument(); const searchDocuments = useSearchDocuments(); const [showCreateForm, setShowCreateForm] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [searchResults, setSearchResults] = useState([]); const [analyzingDocs, setAnalyzingDocs] = useState>(new Set()); const [expandedAnalyses, setExpandedAnalyses] = useState>(new Set()); const [formData, setFormData] = useState({ title: '', content: '', }); const handleCreate = async (e: React.FormEvent) => { e.preventDefault(); try { await createDocument.mutateAsync(formData); setFormData({ title: '', content: '' }); setShowCreateForm(false); } catch (err: any) { alert(err.message || '创建失败'); } }; const handleDelete = async (id: string) => { if (confirm('确定要删除这个文档吗?')) { try { await deleteDocument.mutateAsync(id); } catch (err: any) { alert(err.message || '删除失败'); } } }; const handleSearch = async (e: React.FormEvent) => { e.preventDefault(); if (!searchQuery.trim()) { setSearchResults([]); return; } try { const results = await searchDocuments.mutateAsync(searchQuery); setSearchResults(results); } catch (err: any) { alert(err.message || '搜索失败'); } }; const handleAnalyze = async (docId: string) => { setAnalyzingDocs((prev) => new Set(prev).add(docId)); try { await analyzeDocument.mutateAsync({ id: docId, options: { generate_summary: true } }); setExpandedAnalyses((prev) => new Set(prev).add(docId)); } catch (err: any) { alert(err.message || 'AI 分析失败,请检查配置'); } finally { setAnalyzingDocs((prev) => { const next = new Set(prev); next.delete(docId); return next; }); } }; const toggleAnalysis = (docId: string) => { setExpandedAnalyses((prev) => { const next = new Set(prev); if (next.has(docId)) { next.delete(docId); } else { next.add(docId); } return next; }); }; // DocumentCard 组件 const DocumentCard = ({ doc }: { doc: Document }) => { const { data: analysis } = useDocumentAnalysis(doc.id); const isAnalyzing = analyzingDocs.has(doc.id); const isExpanded = expandedAnalyses.has(doc.id); return (

{doc.title || '无标题'}

{doc.content}

{/* AI 分析结果 */} {analysis && (
{isExpanded && (
{analysis.suggested_tags && analysis.suggested_tags.length > 0 && (
{analysis.suggested_tags.map((tag, idx) => ( {tag} ))}
)} {analysis.suggested_category && (
建议分类: {analysis.suggested_category}
)} {analysis.summary && (
摘要: {analysis.summary}
)}

由 {analysis.provider} ({analysis.model}) 分析

)}
)}

{new Date(doc.created_at).toLocaleString()}

); }; const displayDocuments = searchResults.length > 0 ? searchResults : documents; return (

文档管理

管理您的文档资料

{/* Search */}
setSearchQuery(e.target.value)} />
{/* Create Form */} {showCreateForm && (
setFormData({ ...formData, title: e.target.value })} placeholder="文档标题" />