'use client'; import { createGlobalState } from 'react-global-hooks'; import { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react'; import { FaUpload } from 'react-icons/fa'; import { useCallback, useState } from 'react'; import { useDropzone } from 'react-dropzone'; import { apiClient } from '@/utils/api'; export interface AddImagesModalState { datasetName: string; onComplete?: () => void; } export const addImagesModalState = createGlobalState(null); export const openImagesModal = (datasetName: string, onComplete: () => void) => { addImagesModalState.set({ datasetName, onComplete }); }; export default function AddImagesModal() { const [addImagesModalInfo, setAddImagesModalInfo] = addImagesModalState.use(); const [uploadProgress, setUploadProgress] = useState(0); const [isUploading, setIsUploading] = useState(false); const open = addImagesModalInfo !== null; const onCancel = () => { if (!isUploading) { setAddImagesModalInfo(null); } }; const onDone = () => { if (addImagesModalInfo?.onComplete && !isUploading) { addImagesModalInfo.onComplete(); setAddImagesModalInfo(null); } }; const onDrop = useCallback( async (acceptedFiles: File[]) => { if (acceptedFiles.length === 0) return; setIsUploading(true); setUploadProgress(0); const formData = new FormData(); acceptedFiles.forEach(file => { formData.append('files', file); }); formData.append('datasetName', addImagesModalInfo?.datasetName || ''); try { await apiClient.post(`/api/datasets/upload`, formData, { headers: { 'Content-Type': 'multipart/form-data', }, onUploadProgress: progressEvent => { const percentCompleted = Math.round((progressEvent.loaded * 100) / (progressEvent.total || 100)); setUploadProgress(percentCompleted); }, timeout: 0, // Disable timeout }); onDone(); } catch (error) { console.error('Upload failed:', error); } finally { setIsUploading(false); setUploadProgress(0); } }, [addImagesModalInfo], ); const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, accept: { 'image/*': ['.png', '.jpg', '.jpeg', '.gif', '.bmp', '.webp'], 'video/*': ['.mp4', '.avi', '.mov', '.mkv', '.wmv', '.m4v', '.flv'], 'text/*': ['.txt'], }, multiple: true, }); return (
Add Images to: {addImagesModalInfo?.datasetName}

{isDragActive ? 'Drop the files here...' : 'Drag & drop files here, or click to select files'}

{isUploading && (

Uploading... {uploadProgress}%

)}
); }