/** * Context Upload Dialog Component * * Dialog for uploading files or pasting text as context documents */ import React, { useState, useCallback } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Upload, FileText, AlertCircle, Check } from "lucide-react"; import { ContextDocumentType, CONTEXT_DOCUMENT_TYPES } from "@/types/context"; import { useContextDocuments } from "@/hooks/useContextDocuments"; interface ContextUploadDialogProps { isOpen: boolean; onClose: () => void; traceId: string; onSuccess: () => void; } export function ContextUploadDialog({ isOpen, onClose, traceId, onSuccess, }: ContextUploadDialogProps) { const { createDocument, uploadFile, loading, error } = useContextDocuments(); // Form state const [title, setTitle] = useState(""); const [documentType, setDocumentType] = useState("domain_knowledge"); const [content, setContent] = useState(""); const [selectedFile, setSelectedFile] = useState(null); const [dragActive, setDragActive] = useState(false); const resetForm = () => { setTitle(""); setDocumentType("domain_knowledge"); setContent(""); setSelectedFile(null); setDragActive(false); }; const handleClose = () => { resetForm(); onClose(); }; const handleCreateFromText = async () => { if (!title.trim() || !content.trim()) { return; } const result = await createDocument(traceId, { title: title.trim(), document_type: documentType, content: content.trim(), }); if (result) { resetForm(); onSuccess(); } }; const handleFileUpload = async () => { if (!selectedFile || !title.trim()) { return; } const result = await uploadFile( traceId, selectedFile, title.trim(), documentType ); if (result) { resetForm(); onSuccess(); } }; const handleFileSelect = (file: File) => { setSelectedFile(file); if (!title) { setTitle(file.name.replace(/\.[^/.]+$/, "")); } }; const handleDrag = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); if (e.type === "dragenter" || e.type === "dragover") { setDragActive(true); } else if (e.type === "dragleave") { setDragActive(false); } }, []); const handleDrop = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setDragActive(false); if (e.dataTransfer.files && e.dataTransfer.files[0]) { handleFileSelect(e.dataTransfer.files[0]); } }, []); const isValidFile = (file: File) => { const allowedTypes = [".txt", ".md", ".json", ".csv"]; return allowedTypes.some((type) => file.name.toLowerCase().endsWith(type)); }; const formatFileSize = (bytes: number) => { if (bytes === 0) return "0 Bytes"; const k = 1024; const sizes = ["Bytes", "KB", "MB"]; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i]; }; return ( Add Context Document Paste Text Upload File {/* Common Fields */}
setTitle(e.target.value)} placeholder="Enter document title" required />
{/* Tab Content */}