"use client"; import React, { useState, useCallback, useRef, useEffect } from "react"; interface DocumentMetadata { title?: string; category?: string; tags?: string[]; description?: string; version?: string; } interface UploadedDocument { id: string; name: string; size: number; uploadedAt: string; metadata: DocumentMetadata; path: string; url?: string; } interface DocumentUploaderClientProps { onDocumentUploaded?: (document: UploadedDocument) => void; onDocumentDeleted?: (documentId: string) => void; apiEndpoint?: string; } // Client-only DocumentUploader that uses API calls instead of RAGEngine export function DocumentUploaderClient({ onDocumentUploaded, onDocumentDeleted, apiEndpoint = "/api/rag", }: DocumentUploaderClientProps) { const [documents, setDocuments] = useState([]); const [isUploading, setIsUploading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); const loadDocuments = useCallback(async () => { try { const response = await fetch(`${apiEndpoint}/documents`); if (!response.ok) throw new Error("Failed to load documents"); const docs = await response.json(); setDocuments(docs); } catch (err) { setError("문서 목록을 불러오는데 실패했습니다."); } }, [apiEndpoint]); useEffect(() => { loadDocuments(); }, [loadDocuments]); return (
{error && (
{error}
)} {success && (
{success}
)}
📄

API 기반 문서 업로드

서버 모듈을 클라이언트에서 분리하여 안전한 업로드를 제공합니다

업로드된 문서 ({documents.length})

{documents.length === 0 ? (

업로드된 문서가 없습니다.

) : ( documents.map((doc) => (

{doc.name}

업로드: {new Date(doc.uploadedAt).toLocaleString()}

)) )}
); }