@restnfeel/agentc-starter-kit
Version:
한국어 기업용 CMS 모듈 - Task Master AI와 함께 빠르게 웹사이트를 구현할 수 있는 재사용 가능한 컴포넌트 시스템
102 lines (87 loc) • 2.49 kB
text/typescript
/**
* @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,
};
}