import React, { useState } from 'react'; import { Plus, FileText, CheckCircle, Loader2, Search, Globe, BookOpen, Download } from 'lucide-react'; import { ingestPDF, searchPapers, importPaper } from '../api'; const DocumentsPanel = ({ documents, setDocuments, notebookId }) => { const [activeTab, setActiveTab] = useState('sources'); // sources, search const [isUploading, setIsUploading] = useState(false); // Search State const [searchQuery, setSearchQuery] = useState(''); const [searchMode, setSearchMode] = useState('academic'); // academic, web const [searchResults, setSearchResults] = useState([]); const [isSearching, setIsSearching] = useState(false); const [importingIds, setImportingIds] = useState({}); // Hidden file input handler const handleFileUpload = async (e) => { const file = e.target.files[0]; if (!file) return; setIsUploading(true); try { const result = await ingestPDF(file, notebookId); setDocuments(prev => [{ id: result.paper_id, title: file.name, date: new Date().toLocaleDateString(), active: true, filename: file.name }, ...prev]); } catch (error) { console.error("Upload failed", error); alert("Failed to upload paper"); } finally { setIsUploading(false); } }; const handleSearch = async (e) => { e.preventDefault(); if (!searchQuery.trim()) return; setIsSearching(true); try { const results = await searchPapers(searchQuery, searchMode); setSearchResults(results); } catch (error) { console.error("Search failed", error); } finally { setIsSearching(false); } }; const handleImport = async (paper) => { setImportingIds(prev => ({ ...prev, [paper.id]: true })); try { const result = await importPaper(notebookId, paper); setDocuments(prev => [{ id: result.doc_id, title: paper.title, date: new Date().toLocaleDateString(), active: true, filename: paper.title + ".txt" }, ...prev]); // Switch back to sources list to see the new file setActiveTab('sources'); } catch (error) { console.error("Import failed", error); alert("Failed to import paper"); } finally { setImportingIds(prev => ({ ...prev, [paper.id]: false })); } }; return (
{doc.date || (doc.uploaded_at ? new Date(doc.uploaded_at * 1000).toLocaleDateString() : 'Just now')}
No sources added.
{result.venue} • {result.year}
{result.abstract}