import { CloseCircle, DocumentUpload, Gallery } from 'iconsax-react' import { type FC, useCallback, useEffect, useState } from 'react' import { useDropzone } from 'react-dropzone'; import { useTranslation } from 'react-i18next'; import { clx } from '../helpers/utils'; type Props = { label: string; onChange: (file: File[]) => void; isMultiple?: boolean; isFile?: boolean, preview?: string[], onChangePreview?: (preview: string[]) => void, getCover?: (url: string) => void, coverUrl?: string, imageSize?: 'small' | 'medium' | 'large' } 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 onDrop = useCallback((acceptedFiles: File[]) => { if (props.isMultiple) { const array = [...files] array.push(acceptedFiles[0]) setFiles(array) props.onChange(array) } else { setFiles([acceptedFiles[0]]) props.onChange([acceptedFiles[0]]) } // eslint-disable-next-line react-hooks/exhaustive-deps }, [files]) 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); } } useEffect(() => { if (props.preview && props.preview.length > 0 && !isFill) { setPerviews(props.preview) console.log('preview', props.preview); setIsFill(true) } }, [props.preview, isFill]) useEffect(() => { setCover(props.coverUrl ? props.coverUrl : '') }, [props.coverUrl]) return (
{props.label}
{t('upload')}
{ files.length > 0 || perviews ? (
{ perviews && perviews.map((item, index) => { const imageSizeClass = props.imageSize === 'large' ? 'w-full h-32 rounded-lg' : props.imageSize === 'medium' ? 'size-20 rounded-lg' : 'size-10 rounded-full' return (
{ if (props.getCover) { setCover(item) props.getCover(item) } }} src={item} className={clx( imageSizeClass, 'object-cover cursor-pointer', 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 cursor-pointer z-10'>
) }) } { files.map((file, index) => { if (props.isFile) { return (
{file.name}
handleDelete(index)} className='size-4 ' color='red' />
) } else { const imageSizeClass = props.imageSize === 'large' ? 'w-full h-32 rounded-lg' : props.imageSize === 'medium' ? 'size-20 rounded-lg' : 'size-10 rounded-full' return (
{file.name}
handleDelete(index)} className='size-4 ' color='red' />
) } }) }
) : null }
) } export default UploadBoxDraggble