import { Upload, Button, Flex, Typography, Space, Progress, Card } from 'antd' import PropTypes from 'prop-types' import { ApiServerContext } from '../context/ApiServerContext' import UploadIcon from '../../Icons/UploadIcon' import { useContext, useState, useEffect } from 'react' import ObjectSelect from './ObjectSelect' import FileList from './FileList' import PlusIcon from '../../Icons/PlusIcon' import { LoadingOutlined } from '@ant-design/icons' const { Text } = Typography const FileUpload = ({ value, onChange, multiple = true, defaultPreviewOpen = false, showPreview = true, showInfo }) => { const { uploadFile } = useContext(ApiServerContext) const [uploading, setUploading] = useState(false) const [uploadProgress, setUploadProgress] = useState(0) // Track current files using useState const [currentFiles, setCurrentFiles] = useState(() => { if (multiple) { return Array.isArray(value) ? value : [] } else { return value || null } }) // Update currentFiles when value prop changes useEffect(() => { if (multiple) { setCurrentFiles(Array.isArray(value) ? value : []) } else { setCurrentFiles(value || null) } }, [value, multiple]) // Track if there are no items in the list const [hasNoItems, setHasNoItems] = useState(false) // Track the selected file from ObjectSelect const [selectedFile, setSelectedFile] = useState(null) // Update hasNoItems when currentFiles changes useEffect(() => { const noItems = multiple ? !currentFiles || !Array.isArray(currentFiles) || currentFiles.length === 0 : !currentFiles setHasNoItems(noItems) }, [currentFiles, multiple]) const handleFileUpload = async (file) => { try { setUploading(true) const uploadedFile = await uploadFile(file, {}, (progress) => { setUploadProgress(progress) }) setUploading(false) if (uploadedFile) { if (multiple) { // For multiple files, add to existing array const newFiles = [...currentFiles, uploadedFile] setCurrentFiles(newFiles) onChange(newFiles) } else { // For single file, replace the value setCurrentFiles(uploadedFile) onChange(uploadedFile) } } } catch (error) { console.error('File upload failed:', error) } return false // Prevent default upload behavior } // Handle adding selected file to the list const handleAddSelectedFile = () => { if (selectedFile) { if (multiple) { // For multiple files, add to existing array const newFiles = [...currentFiles, selectedFile] setCurrentFiles(newFiles) onChange(newFiles) } else { // For single file, replace the value setCurrentFiles(selectedFile) onChange(selectedFile) } // Clear the selection setSelectedFile(null) } } return ( {hasNoItems && uploading == false ? ( ) : null} {uploading == true ? ( Uploading... {uploadProgress > 0 ? ( <> {uploadProgress >= 0 && uploadProgress < 100 ? ( <> {uploadProgress}% ) : null} {uploadProgress == 100 ? : null} ) : null} ) : null} { setCurrentFiles(updatedFiles) }} /> ) } FileUpload.propTypes = { value: PropTypes.oneOfType([PropTypes.object, PropTypes.array]), onChange: PropTypes.func, multiple: PropTypes.bool, showPreview: PropTypes.bool, showInfo: PropTypes.bool, defaultPreviewOpen: PropTypes.bool } export default FileUpload