"use client"; import { useState, useEffect } from "react"; import { client } from "@/lib/api"; import { useBank } from "@/lib/bank-context"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { X } from "lucide-react"; export function DocumentsView() { const { currentBank } = useBank(); const [documents, setDocuments] = useState([]); const [loading, setLoading] = useState(false); const [searchQuery, setSearchQuery] = useState(""); const [total, setTotal] = useState(0); // Document view panel state const [selectedDocument, setSelectedDocument] = useState(null); const [loadingDocument, setLoadingDocument] = useState(false); const loadDocuments = async () => { if (!currentBank) return; setLoading(true); try { const data: any = await client.listDocuments({ bank_id: currentBank, q: searchQuery, limit: 100, }); setDocuments(data.items || []); setTotal(data.total || 0); } catch (error) { console.error("Error loading documents:", error); alert("Error loading documents: " + (error as Error).message); } finally { setLoading(false); } }; const viewDocumentText = async (documentId: string) => { if (!currentBank) return; setLoadingDocument(true); setSelectedDocument({ id: documentId }); // Set placeholder to show loading try { const doc: any = await client.getDocument(documentId, currentBank); setSelectedDocument(doc); } catch (error) { console.error("Error loading document:", error); alert("Error loading document: " + (error as Error).message); setSelectedDocument(null); } finally { setLoadingDocument(false); } }; // Auto-load documents when component mounts useEffect(() => { if (currentBank) { loadDocuments(); } }, [currentBank]); return (
{/* Documents List Section */} {loading ? (
Loading documents...
) : documents.length > 0 ? (
{total} total documents
) : (
📄
No documents found
)} {/* Documents List and Detail Panel */} {documents.length > 0 && ( <> {/* Documents Table */}
setSearchQuery(e.target.value)} placeholder="Search documents (ID)..." className="max-w-2xl" />
Document ID Created Context Text Length Memory Units Actions {documents.length > 0 ? ( documents.map((doc) => ( viewDocumentText(doc.id)} > {doc.id.length > 30 ? doc.id.substring(0, 30) + "..." : doc.id} {doc.created_at ? new Date(doc.created_at).toLocaleString() : "N/A"} {doc.retain_params?.context || "-"} {doc.text_length?.toLocaleString()} chars {doc.memory_unit_count} )) ) : ( Click "Load Documents" to view data )}
{/* Document Detail Panel - Fixed on Right */} {selectedDocument && (
{/* Header with close button */}

Document Details

Original document text and metadata

{loadingDocument ? (
Loading document...
) : (
{/* Document ID */}
Document ID
{selectedDocument.id}
{/* Created & Memory Units */} {selectedDocument.created_at && (
Created
{new Date(selectedDocument.created_at).toLocaleString()}
Memory Units
{selectedDocument.memory_unit_count}
)} {/* Text Length */} {selectedDocument.original_text && (
Text Length
{selectedDocument.original_text.length.toLocaleString()} characters
)} {/* Retain Parameters */} {selectedDocument.retain_params && (
Retain Parameters
{selectedDocument.retain_params.context && (
Context:{" "} {selectedDocument.retain_params.context}
)} {selectedDocument.retain_params.event_date && (
Event Date:{" "} {new Date(selectedDocument.retain_params.event_date).toLocaleString()}
)} {selectedDocument.retain_params.metadata && (
Metadata:
                                {JSON.stringify(selectedDocument.retain_params.metadata, null, 2)}
                              
)}
)} {/* Original Text */} {selectedDocument.original_text && (
Original Text
                            {selectedDocument.original_text}
                          
)}
)}
)} )}
); }