import { PlusOutlined } from '@ant-design/icons'; import type { GetProp, UploadFile, UploadProps } from 'antd'; import { Image, Upload } from 'antd'; import { useState } from 'react'; type FileType = Parameters<GetProp<UploadProps, 'beforeUpload'>>[0]; const getBase64 = (file: FileType): Promise<string> => new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => resolve(reader.result as string); reader.onerror = (error) => reject(error); }); export default ({ onFilesChange }) => { const [previewOpen, setPreviewOpen] = useState(false); const [previewImage, setPreviewImage] = useState(''); const [fileList, setFileList] = useState<UploadFile[]>([]); const handlePreview = async (file: UploadFile) => { if (!file.url && !file.preview) { file.preview = await getBase64(file.originFileObj as FileType); } setPreviewImage(file.url || (file.preview as string)); setPreviewOpen(true); }; const uploadButton = ( <button style={{ border: 0, background: 'none' }} type="button"> <PlusOutlined /> <div style={{ marginTop: 8 }}>Upload</div> </button> ); return ( <> <Upload listType="picture-card" fileList={fileList} onPreview={handlePreview} onChange={({ fileList: newFileList }) => { setFileList(newFileList); console.log('file' + JSON.stringify(newFileList)); onFilesChange(newFileList); }} > {fileList.length >= 1 ? null : uploadButton} </Upload> {previewImage && ( <Image wrapperStyle={{ display: 'none' }} preview={{ visible: previewOpen, onVisibleChange: (visible) => setPreviewOpen(visible), afterOpenChange: (visible) => !visible && setPreviewImage(''), }} src={previewImage} /> )} </> ); };