import { type FC, useRef, useState } from 'react' import { Flex, Spin } from 'antd' import { CloseOutlined } from '@ant-design/icons' import clsx from 'clsx' import type { UploadFile, FlexProps } from 'antd' interface FileListProps { fileList: UploadFile[]; onDelete?: (file: UploadFile) => void; wrap?: FlexProps['wrap']; className?: string; } const FileList: FC = ({ fileList, onDelete, wrap, className = "rb:mx-3! rb:mt-3! rb:w-max!" }) => { const [playingUid, setPlayingUid] = useState(null) const mediaRef = useRef(null) const handleClose = () => { mediaRef.current?.pause() setPlayingUid(null) } const playingFile = fileList.find(f => f.uid === playingUid) if (!fileList.length) return null const getFileIconClassName = (file: UploadFile) => { console.log('getFileIconClassName file', file) if (file.status === 'uploading') { return file.type?.includes('audio') ? "rb:bg-[url('@/assets/images/file/audio_disabled.svg')]" : file.type?.includes('video') ? "rb:bg-[url('@/assets/images/file/video_disabled.svg')]" : file.type?.includes('pdf') ? "rb:bg-[url('@/assets/images/file/pdf_disabled.svg')]" : (file.type?.includes('excel') || file.type?.includes('spreadsheetml.sheet')) ? "rb:bg-[url('@/assets/images/file/excel_disabled.svg')]" : file.type?.includes('csv') ? "rb:bg-[url('@/assets/images/file/csv_disabled.svg')]" : file.type?.includes('html') ? "rb:bg-[url('@/assets/images/file/html_disabled.svg')]" : file.type?.includes('json') ? "rb:bg-[url('@/assets/images/file/json_disabled.svg')]" : file.type?.includes('ppt') ? "rb:bg-[url('@/assets/images/file/ppt_disabled.svg')]" : file.type?.includes('markdown') ? "rb:bg-[url('@/assets/images/file/md_disabled.svg')]" : file.type?.includes('text') ? "rb:bg-[url('@/assets/images/file/txt_disabled.svg')]" : (file.type?.includes('doc') || file.type?.includes('docx') || file.type?.includes('word') || file.type?.includes('wordprocessingml.document')) ? "rb:bg-[url('@/assets/images/file/word_disabled.svg')]" : "rb:bg-[url('@/assets/images/file/txt_disabled.svg')]" } return file.type?.includes('audio') ? "rb:bg-[url('@/assets/images/file/audio.svg')]" : file.type?.includes('video') ? "rb:bg-[url('@/assets/images/file/video.svg')]" : file.type?.includes('pdf') ? "rb:bg-[url('@/assets/images/file/pdf.svg')]" : (file.type?.includes('excel') || file.type?.includes('spreadsheetml.sheet')) ? "rb:bg-[url('@/assets/images/file/excel.svg')]" : file.type?.includes('csv') ? "rb:bg-[url('@/assets/images/file/csv.svg')]" : file.type?.includes('html') ? "rb:bg-[url('@/assets/images/file/html.svg')]" : file.type?.includes('json') ? "rb:bg-[url('@/assets/images/file/json.svg')]" : file.type?.includes('ppt') ? "rb:bg-[url('@/assets/images/file/ppt.svg')]" : file.type?.includes('markdown') ? "rb:bg-[url('@/assets/images/file/md.svg')]" : file.type?.includes('text') ? "rb:bg-[url('@/assets/images/file/txt.svg')]" : (file.type?.includes('doc') || file.type?.includes('docx') || file.type?.includes('word') || file.type?.includes('wordprocessingml.document')) ? "rb:bg-[url('@/assets/images/file/word.svg')]" : "rb:bg-[url('@/assets/images/file/txt.svg')]" } return ( <> {fileList.map((file) => { if (file.type?.includes('image')) { return (
{file.name} {onDelete &&
onDelete(file)} >
}
) } return (
{file.name}
{[file.type?.split('/').pop(), file.size].filter(item => item).join(' ยท ')}
{file.status === 'done' && (file.type?.includes('video') || file.type?.includes('audio')) &&
playingUid === file.uid ? handleClose() : setPlayingUid(file.uid)} >
} {onDelete &&
onDelete(file)} >
}
) })}
{playingFile && (
{playingFile.type?.includes('video') ? (
)} ) } export default FileList