|
|
import { useState, useCallback } from 'react'; |
|
|
import { FileItem, UploadStatus } from '../types'; |
|
|
import { uploadFileToHub } from '../services/hfService'; |
|
|
|
|
|
export const useFileUpload = () => { |
|
|
|
|
|
const [files, setFiles] = useState<FileItem[]>([]); |
|
|
const [isUploading, setIsUploading] = useState(false); |
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
}; |
|
|
}; |