/** * Context Documents Section Component * * Main section for managing context documents in the TraceDetailsModal */ import React, { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { FileText, Plus } from "lucide-react"; import { useContextDocuments } from "@/hooks/useContextDocuments"; import { ContextDocumentCard } from "@/components/features/context/ContextDocumentCard"; import { ContextUploadDialog } from "@/components/features/context/ContextUploadDialog"; import { ContextDocumentModal } from "@/components/features/context/ContextDocumentModal"; import { ContextDocument } from "@/types/context"; interface ContextDocumentsSectionProps { traceId: string; showHeader?: boolean; // New prop to control header visibility triggerAdd?: number; // Prop to trigger add dialog from external button } export function ContextDocumentsSection({ traceId, showHeader = true, // Default to showing header for backward compatibility triggerAdd, }: ContextDocumentsSectionProps) { const { documents, loading, error, loadDocuments, deleteDocument, updateDocument, } = useContextDocuments(); const [isUploadDialogOpen, setIsUploadDialogOpen] = useState(false); const [selectedDocument, setSelectedDocument] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); // Load documents when component mounts or traceId changes useEffect(() => { if (traceId) { loadDocuments(traceId); } }, [traceId, loadDocuments]); // Trigger add dialog when external button is clicked useEffect(() => { if (triggerAdd && triggerAdd > 0) { setIsUploadDialogOpen(true); } }, [triggerAdd]); const handleAddContext = () => { setIsUploadDialogOpen(true); }; const handleDeleteDocument = async (contextId: string) => { const success = await deleteDocument(traceId, contextId); if (success) { // Document has been removed from state by the hook } }; const handleViewEdit = (document: ContextDocument) => { setSelectedDocument(document); setIsModalOpen(true); }; const handleModalClose = () => { setIsModalOpen(false); setSelectedDocument(null); }; const handleDocumentSave = async (updates: any) => { if (!selectedDocument) return false; const updatedDocument = await updateDocument( traceId, selectedDocument.id, updates ); if (updatedDocument) { setSelectedDocument(updatedDocument); return true; } return false; }; const handleDocumentDelete = async () => { if (!selectedDocument) return false; const success = await deleteDocument(traceId, selectedDocument.id); if (success) { setIsModalOpen(false); setSelectedDocument(null); } return success; }; if (error) { return (
Context Documents - Error

{error}

); } return ( <>
{showHeader && (
Context Documents ({documents.length})
)} {loading && documents.length === 0 ? (

Loading context documents...

) : documents.length === 0 ? (

No context documents yet

Add domain knowledge, schemas, or guidelines to improve extraction quality.

) : (
{documents.map((document) => ( handleDeleteDocument(document.id)} onViewEdit={() => handleViewEdit(document)} /> ))}
)}
{/* Upload Dialog */} setIsUploadDialogOpen(false)} traceId={traceId} onSuccess={() => { setIsUploadDialogOpen(false); loadDocuments(traceId); }} /> {/* Context Document Modal */} {selectedDocument && ( )} ); }