import { memo, useCallback, useRef, useState } from 'react' import { DeleteOutlined, EyeOutlined, PlusOutlined } from '@ant-design/icons' import { Modal, Progress, message } from 'antd' import { uploadRequest } from '@/api/upload' import utils from '@/utils' import type { ChangeEvent } from 'react' import type { FC, ReactNode } from 'react' interface Iprops { children?: ReactNode width?: number height?: number type: 'img' | 'video' accept?: string fileSize?: number value: string | number onChange: (e: any) => void } const UploadBox: FC = (props) => { const { width, height, onChange, value, accept, fileSize = 1 } = props const [percent, setPercent] = useState(0) const [previewOpen, setPreviewOpen] = useState(false) const [currentUrl, setCurrentUrl] = useState(() => { if (value) { return utils.onlineResource(value as number) } else { return '' } }) const [title, setTitle] = useState('默认标题') const [type, setType] = useState('image') const InputRef = useRef(null) const handleCancel = useCallback(() => { setPreviewOpen(false) }, []) const openPreview = useCallback(() => { setPreviewOpen(true) }, []) const deleteFile = useCallback(() => { InputRef.current!.value = '' setCurrentUrl('') setPercent(0) onChange('') }, [onChange]) const selectFile = () => { InputRef.current?.click() } const onFileChange = async (e: ChangeEvent) => { const file = e.target.files && e.target.files[0] const accepts = accept?.split(',') const type = file!.type const size = file!.size if (!accepts?.includes(type)) { message.error('您所选择的文件不符合格式!') return } if (size > fileSize * 1024 * 1024) { message.error(`您所选择的文件不能大于${fileSize}M!`) return } if (file!.type.indexOf('video') !== -1) { setType('video') } else { setType('image') } setTitle(file!.name) const res = await uploadRequest(file as File, (e) => { const progress = e.progress?.toFixed(2) const total = (progress as unknown as number) * 100 setPercent(total === 100 ? 99 : total) }) setCurrentUrl(utils.onlineResource(res.data as number)) setPercent(100) onChange(res.data) } return (
{currentUrl ? (
{type === 'image' ? ( ) : ( )}
) : percent === 0 ? (

上传文件

) : (
)} {type === 'image' ? ( example ) : ( )}
) } export default memo(UploadBox)