/** * @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; uploadDocument: ( file: File, metadata?: Partial ) => Promise; isUploading: boolean; clearUploads: () => void; removeUpload: (fileId: string) => void; } export function useUpload(): UseUploadReturn { const { uploadDocument: contextUploadDocument, storage } = useChatbot(); const [uploads, setUploads] = useState>({}); const uploadDocument = useCallback( async (file: File, metadata?: Partial) => { 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, }; }