Twan07 commited on
Commit
81afeb2
·
verified ·
1 Parent(s): b3734a2

Upload useFileUpload.ts

Browse files
Files changed (1) hide show
  1. hooks/useFileUpload.ts +72 -0
hooks/useFileUpload.ts ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useState, useCallback } from 'react';
2
+ import { FileItem, UploadStatus } from '../types';
3
+ import { uploadFileToHub } from '../services/hfService';
4
+
5
+ export const useFileUpload = () => {
6
+ // Local Upload State
7
+ const [files, setFiles] = useState<FileItem[]>([]);
8
+ const [isUploading, setIsUploading] = useState(false);
9
+
10
+ // --- UPLOAD LOGIC ---
11
+
12
+ const addFiles = useCallback((newFilesList: FileItem[]) => {
13
+ setFiles((prev) => [...prev, ...newFilesList]);
14
+ }, []);
15
+
16
+ const removeFile = useCallback((id: string) => {
17
+ setFiles((prev) => prev.filter((f) => f.id !== id));
18
+ }, []);
19
+
20
+ const updateFilePath = useCallback((id: string, newPath: string) => {
21
+ setFiles((prev) => prev.map((f) => (f.id === id ? { ...f, path: newPath } : f)));
22
+ }, []);
23
+
24
+ const startUpload = useCallback(async () => {
25
+ const filesToUpload = files.filter(
26
+ (f) => f.status === UploadStatus.IDLE || f.status === UploadStatus.ERROR
27
+ );
28
+
29
+ if (filesToUpload.length === 0) return;
30
+
31
+ setIsUploading(true);
32
+
33
+ const uploadPromises = filesToUpload.map(async (item) => {
34
+ setFiles((prev) =>
35
+ prev.map((f) =>
36
+ f.id === item.id ? { ...f, status: UploadStatus.UPLOADING, error: undefined } : f
37
+ )
38
+ );
39
+
40
+ try {
41
+ const url = await uploadFileToHub({
42
+ file: item.file,
43
+ path: item.path
44
+ });
45
+
46
+ setFiles((prev) =>
47
+ prev.map((f) =>
48
+ f.id === item.id ? { ...f, status: UploadStatus.SUCCESS, url } : f
49
+ )
50
+ );
51
+ } catch (err: any) {
52
+ setFiles((prev) =>
53
+ prev.map((f) =>
54
+ f.id === item.id ? { ...f, status: UploadStatus.ERROR, error: err.message } : f
55
+ )
56
+ );
57
+ }
58
+ });
59
+
60
+ await Promise.allSettled(uploadPromises);
61
+ setIsUploading(false);
62
+ }, [files]);
63
+
64
+ return {
65
+ files,
66
+ isUploading,
67
+ addFiles,
68
+ removeFile,
69
+ updateFilePath,
70
+ startUpload
71
+ };
72
+ };