import * as React from 'react'; import Animate from 'rc-animate'; import Icon from '../icon'; import Progress from '../progress'; import classNames from 'classnames'; import { UploadListProps } from './interface'; // https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL const previewFile = (file, callback) => { const reader = new FileReader(); reader.onloadend = () => callback(reader.result); reader.readAsDataURL(file); }; export default class UploadList extends React.Component { static defaultProps = { listType: 'text', // or picture items: [], progressAttr: { strokeWidth: 3, showInfo: false, }, prefixCls: 'ant-upload', }; handleClose = (file) => { this.props.onRemove(file); } handlePreview = (file, e) => { if (this.props.onPreview) { e.preventDefault(); return this.props.onPreview(file); } } componentDidUpdate() { if (this.props.listType !== 'picture' && this.props.listType !== 'picture-card') { return; } this.props.items.forEach(file => { if (typeof document === 'undefined' || typeof window === 'undefined' || !(window as any).FileReader || !(window as any).File || !(file.originFileObj instanceof File) || file.thumbUrl !== undefined) { return; } /*eslint-disable */ file.thumbUrl = ''; /*eslint-enable */ previewFile(file.originFileObj, (previewDataUrl) => { /*eslint-disable */ file.thumbUrl = previewDataUrl; /*eslint-enable */ this.forceUpdate(); }); }); } render() { const { prefixCls } = this.props; let list = this.props.items.map(file => { let progress; let icon = ; if (this.props.listType === 'picture' || this.props.listType === 'picture-card') { if (file.status === 'uploading' || (!file.thumbUrl && !file.url)) { if (this.props.listType === 'picture-card') { icon =
文件上传中
; } else { icon = ; } } else { icon = ( this.handlePreview(file, e)} href={file.url} target="_blank" rel="noopener noreferrer" > {file.name} ); } } if (file.status === 'uploading') { progress = (
); } const infoUploadingClass = classNames({ [`${prefixCls}-list-item`]: true, [`${prefixCls}-list-item-${file.status}`]: true, }); return (
{icon} { file.url ? ( this.handlePreview(file, e)} > {file.name} ) : ( this.handlePreview(file, e)} > {file.name} ) } { this.props.listType === 'picture-card' && file.status !== 'uploading' ? ( this.handlePreview(file, e)} > this.handleClose(file)} /> ) : this.handleClose(file)} /> }
{progress}
); }); const listClassNames = classNames({ [`${prefixCls}-list`]: true, [`${prefixCls}-list-${this.props.listType}`]: true, }); return (
{list}
); } }