Spaces:
Running
Running
| import { useState, useCallback } from 'react'; | |
| import { FileItem, UploadStatus } from '../types'; | |
| import { uploadFileToHub } from '../services/hfService'; | |
| export const useFileUpload = () => { | |
| // Local Upload State | |
| const [files, setFiles] = useState<FileItem[]>([]); | |
| const [isUploading, setIsUploading] = useState(false); | |
| // --- UPLOAD LOGIC --- | |
| const addFiles = useCallback((newFilesList: FileItem[]) => { | |
| setFiles((prev) => [...prev, ...newFilesList]); | |
| }, []); | |
| const removeFile = useCallback((id: string) => { | |
| setFiles((prev) => prev.filter((f) => f.id !== id)); | |
| }, []); | |
| const updateFilePath = useCallback((id: string, newPath: string) => { | |
| setFiles((prev) => prev.map((f) => (f.id === id ? { ...f, path: newPath } : f))); | |
| }, []); | |
| const startUpload = useCallback(async () => { | |
| const filesToUpload = files.filter( | |
| (f) => f.status === UploadStatus.IDLE || f.status === UploadStatus.ERROR | |
| ); | |
| if (filesToUpload.length === 0) return; | |
| setIsUploading(true); | |
| const uploadPromises = filesToUpload.map(async (item) => { | |
| setFiles((prev) => | |
| prev.map((f) => | |
| f.id === item.id ? { ...f, status: UploadStatus.UPLOADING, error: undefined } : f | |
| ) | |
| ); | |
| try { | |
| const url = await uploadFileToHub({ | |
| file: item.file, | |
| path: item.path | |
| }); | |
| setFiles((prev) => | |
| prev.map((f) => | |
| f.id === item.id ? { ...f, status: UploadStatus.SUCCESS, url } : f | |
| ) | |
| ); | |
| } catch (err: any) { | |
| setFiles((prev) => | |
| prev.map((f) => | |
| f.id === item.id ? { ...f, status: UploadStatus.ERROR, error: err.message } : f | |
| ) | |
| ); | |
| } | |
| }); | |
| await Promise.allSettled(uploadPromises); | |
| setIsUploading(false); | |
| }, [files]); | |
| return { | |
| files, | |
| isUploading, | |
| addFiles, | |
| removeFile, | |
| updateFilePath, | |
| startUpload | |
| }; | |
| }; |