import DownloadOutlined from '@ant-design/icons/DownloadOutlined'; import { Field } from '@formily/core'; import { useField } from '@formily/react'; import { Button, Space } from 'antd'; import cls from 'classnames'; import { saveAs } from 'file-saver'; import React, { useState } from 'react'; import Lightbox from 'react-image-lightbox'; import { isImage, toArr, toImages } from './shared'; import type { UploadProps } from './type'; type Composed = React.FC & { Upload?: React.FC; Attachment?: React.FC; }; export const ReadPretty: Composed = () => null; ReadPretty.Attachment = (props: UploadProps) => { const field = useField(); const images = toImages(toArr(field.value)); const [photoIndex, setPhotoIndex] = useState(0); const [visible, setVisible] = useState(false); const { size } = props; return (
{images.map((file) => { const handleClick = (e) => { e.preventDefault(); e.stopPropagation(); const index = images.indexOf(file); if (isImage(file.extname)) { setVisible(true); setPhotoIndex(index); } else { saveAs(file.url, `${file.title}${file.extname}`); } }; return (
{size !== 'small' && (
); })}
{visible && ( { e.preventDefault(); e.stopPropagation(); setVisible(false); }} onMovePrevRequest={() => setPhotoIndex((photoIndex + images.length - 1) % images.length)} onMoveNextRequest={() => setPhotoIndex((photoIndex + 1) % images.length)} imageTitle={images[photoIndex]?.title} toolbarButtons={[ , ]} /> )}
); }; ReadPretty.Upload = (props) => { const field = useField(); return (field.value || []).map((item) => (
{item.url ? ( {item.name} ) : ( {item.name} )}
)); };