UNPKG

@restnfeel/agentc-starter-kit

Version:

한국어 기업용 CMS 모듈 - Task Master AI와 함께 빠르게 웹사이트를 구현할 수 있는 재사용 가능한 컴포넌트 시스템

102 lines (87 loc) 2.49 kB
/** * @fileoverview File upload hook * @module hooks/useUpload */ import { useCallback, useState } from "react"; import { useChatbot } from "./useChatbot"; import type { Document } from "../core/contexts/ChatbotContext"; export interface UploadProgress { fileId: string; progress: number; status: "uploading" | "processing" | "completed" | "failed"; error?: string; } export interface UseUploadReturn { uploads: Record<string, UploadProgress>; uploadDocument: ( file: File, metadata?: Partial<Document["metadata"]> ) => Promise<Document>; isUploading: boolean; clearUploads: () => void; removeUpload: (fileId: string) => void; } export function useUpload(): UseUploadReturn { const { uploadDocument: contextUploadDocument, storage } = useChatbot(); const [uploads, setUploads] = useState<Record<string, UploadProgress>>({}); const uploadDocument = useCallback( async (file: File, metadata?: Partial<Document["metadata"]>) => { const fileId = `${Date.now()}_${file.name}`; // Initialize upload progress setUploads((prev) => ({ ...prev, [fileId]: { fileId, progress: 0, status: "uploading", }, })); try { // TODO: Add progress callback integration when available const document = await contextUploadDocument(file, metadata); // Update progress to completed setUploads((prev) => ({ ...prev, [fileId]: { fileId, progress: 100, status: "completed", }, })); return document; } catch (error) { // Update progress to failed setUploads((prev) => ({ ...prev, [fileId]: { fileId, progress: 0, status: "failed", error: error instanceof Error ? error.message : "Upload failed", }, })); throw error; } }, [contextUploadDocument] ); const clearUploads = useCallback(() => { setUploads({}); }, []); const removeUpload = useCallback((fileId: string) => { setUploads((prev) => { const { [fileId]: removed, ...rest } = prev; return rest; }); }, []); const isUploading = Object.values(uploads).some( (upload) => upload.status === "uploading" || upload.status === "processing" ); return { uploads, uploadDocument, isUploading, clearUploads, removeUpload, }; }