File size: 1,935 Bytes
81afeb2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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
  };
};