"use client"; import React, { useState } from "react"; import { Card, CardHeader, CardContent } from "../ui/Card"; import { Button } from "../ui/Button"; import type { RAGEngine } from "../../rag"; interface UploadResult { filename: string; success: boolean; chunks?: number; id?: string; error?: string; } interface DocumentUploaderProps { ragEngine?: RAGEngine; onDocumentUploaded?: () => void; onDocumentDeleted?: () => void; } export function DocumentUploader({ ragEngine, onDocumentUploaded, onDocumentDeleted, }: DocumentUploaderProps = {}) { const [dragActive, setDragActive] = useState(false); const [uploading, setUploading] = useState(false); const [uploadResults, setUploadResults] = useState([]); const handleFileUpload = async (files: FileList | File[]) => { setUploading(true); setUploadResults([]); try { const formData = new FormData(); Array.from(files).forEach((file) => { formData.append("files", file); }); const response = await fetch("/api/rag/upload", { method: "POST", body: formData, }); const result = await response.json(); if (result.success) { setUploadResults(result.results || []); onDocumentUploaded?.(); } else { setUploadResults([ { filename: "업로드 실패", success: false, error: result.error || "알 수 없는 오류", }, ]); } } catch (error) { console.error("파일 업로드 오류:", error); setUploadResults([ { filename: "네트워크 오류", success: false, error: "서버와 연결할 수 없습니다.", }, ]); } finally { setUploading(false); } }; const handleFileSelect = (e: React.ChangeEvent) => { const files = e.target.files; if (files && files.length > 0) { handleFileUpload(files); } }; const handleDrag = (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 = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setDragActive(false); const files = e.dataTransfer.files; if (files && files.length > 0) { handleFileUpload(files); } }; return (

📁 문서 업로드

PDF, TXT, DOCX 파일을 업로드하여 RAG 시스템에 추가할 수 있습니다.

{/* 드래그 앤 드롭 영역 */}

파일을 여기에 드래그하거나 클릭하여 업로드

PDF, TXT, DOCX 파일 지원 (최대 10MB)

{/* 업로드 결과 */} {uploadResults.length > 0 && (

업로드 결과:

{uploadResults.map((result, index) => (
{result.success ? "✅" : "❌"} {result.filename}
{result.success && result.chunks && ( {result.chunks}개 청크 생성 )}
{result.error && (

{result.error}

)}
))}
)}
); }