import { CloseCircle, DocumentUpload, Gallery } from 'iconsax-react' import { FC, useCallback, useEffect, useState } from 'react' import { useDropzone } from 'react-dropzone'; import { useTranslation } from 'react-i18next'; import { clx } from '../helpers/utils'; import { useSingleUpload } from '@/pages/setting/personality/hooks/usePersonalityData'; type Props = { label: string; onChange: (file: File[]) => void; isMultiple?: boolean; isFile?: boolean, preview?: string[], onChangePreview?: (preview: string[]) => void, getCover?: (url: string) => void, coverUrl?: string, isReset?: boolean, useUploadService?: boolean, onUploadComplete?: (urls: string[]) => void, onUploadError?: (error: Error) => void, onDelete?: () => void } const UploadBoxDraggble: FC = (props: Props) => { const { t } = useTranslation('global') const [files, setFiles] = useState([]) const [perviews, setPerviews] = useState(props.preview ? props.preview : []) const [isFill, setIsFill] = useState(false) const [cover, setCover] = useState(props.coverUrl ? props.coverUrl : '') const [isUploading, setIsUploading] = useState(false) const { mutateAsync: singleUpload } = useSingleUpload() const onDrop = useCallback(async (acceptedFiles: File[]) => { if (props.useUploadService) { setIsUploading(true) try { const uploadPromises = acceptedFiles.map(file => singleUpload(file)) const results = await Promise.all(uploadPromises) const urls = results.map(result => result?.data?.url).filter(Boolean) if (props.onUploadComplete) { props.onUploadComplete(urls) } if (props.isMultiple) { const array = [...files] array.push(acceptedFiles[0]) setFiles(array) props.onChange(array) } else { setFiles([acceptedFiles[0]]) props.onChange([acceptedFiles[0]]) } } catch (error) { console.error('Upload failed:', error) if (props.onUploadError) { props.onUploadError(error as Error) } // Fallback to normal file handling if (props.isMultiple) { const array = [...files] array.push(acceptedFiles[0]) setFiles(array) props.onChange(array) } else { setFiles([acceptedFiles[0]]) props.onChange([acceptedFiles[0]]) } } finally { setIsUploading(false) } } else { // Original behavior if (props.isMultiple) { const array = [...files] array.push(acceptedFiles[0]) setFiles(array) props.onChange(array) } else { setFiles([acceptedFiles[0]]) props.onChange([acceptedFiles[0]]) } } }, [files, props.useUploadService, props.onUploadComplete, props.onUploadError, singleUpload]) const { getRootProps, getInputProps } = useDropzone({ onDrop }) const handleDelete = (index: number) => { const array = [...files] array.splice(index, 1) setFiles(array) props.onChange(array) } const handleDeletePreview = (index: number) => { const array = [...perviews]; array.splice(index, 1); setPerviews(array); if (props.onChangePreview) { props.onChangePreview(array); } if (props.onDelete) { props.onDelete() } } useEffect(() => { if (props.preview && props.preview.length > 0 && !isFill) { setPerviews(props.preview) setIsFill(true) } }, [props.preview, isFill]) useEffect(() => { setCover(props.coverUrl ? props.coverUrl : '') }, [props.coverUrl]) useEffect(() => { if (props.isReset) { setFiles([]) setPerviews([]) } }, [props.isReset]) return (
{isUploading ? 'در حال آپلود...' : props.label}
{t('upload')}
{ (perviews && perviews.length > 0) || files.length > 0 ? (
{/* اگر preview از props وجود دارد، فقط previewها را نمایش بده */} { perviews && perviews.length > 0 ? perviews.map((item, index) => { return (
{ if (props.getCover) { setCover(item) props.getCover(item) } }} src={item} className={clx( 'size-10 rounded-full object-cover', cover === item ? 'border-2 border-red-400' : '' )} />
handleDeletePreview(index)} className='absolute -left-2 -top-2 shadow-md bg-white size-5 rounded-full flex justify-center items-center'>
) }) : files.map((file, index) => { if (props.isFile) { return (
{file.name}
handleDelete(index)} className='size-4 ' color='red' />
) } else return (
{file.name}
handleDelete(index)} className='size-4 ' color='red' />
) }) }
) : null }
) } export default UploadBoxDraggble