import * as React from 'react'; import Animate from 'rc-animate'; import Icon from '../icon'; import Tooltip from '../tooltip'; import Progress from '../progress'; import classNames from 'classnames'; import { UploadListProps, UploadFile } from './interface'; // https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL const previewFile = (file: File, callback: Function) => { 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 progressAttr: { strokeWidth: 2, showInfo: false, }, prefixCls: 'ant-upload', showRemoveIcon: true, showPreviewIcon: true, }; handleClose = (file: UploadFile) => { const { onRemove } = this.props; if (onRemove) { onRemove(file); } } handlePreview = (file: UploadFile, e: React.SyntheticEvent) => { const { onPreview } = this.props; if (!onPreview) { return; } e.preventDefault(); return 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: string) => { /*eslint-disable */ file.thumbUrl = previewDataUrl; /*eslint-enable */ this.forceUpdate(); }); }); } render() { const { prefixCls, items = [], listType, showPreviewIcon, showRemoveIcon, locale } = this.props; const list = items.map(file => { let progress; let icon = ; if (listType === 'picture' || listType === 'picture-card') { if (file.status === 'uploading' || (!file.thumbUrl && !file.url)) { if (listType === 'picture-card') { icon =
{locale.uploading}
; } else { icon = ; } } else { icon = ( this.handlePreview(file, e)} href={file.url || file.thumbUrl} target="_blank" rel="noopener noreferrer" > {file.name} ); } } if (file.status === 'uploading') { // show loading icon if upload progress listener is disabled const loadingProgress = ('percent' in file) ? ( ) : null; progress = (
{loadingProgress}
); } const infoUploadingClass = classNames({ [`${prefixCls}-list-item`]: true, [`${prefixCls}-list-item-${file.status}`]: true, }); const preview = file.url ? ( this.handlePreview(file, e)} title={file.name} > {file.name} ) : ( this.handlePreview(file, e)} title={file.name} > {file.name} ); const style = (file.url || file.thumbUrl) ? undefined : { pointerEvents: 'none', opacity: 0.5, }; const previewIcon = showPreviewIcon ? ( this.handlePreview(file, e)} title={locale.previewFile} > ) : null; const removeIcon = showRemoveIcon ? ( this.handleClose(file)} /> ) : null; const removeIconCross = showRemoveIcon ? ( this.handleClose(file)} /> ) : null; const actions = (listType === 'picture-card' && file.status !== 'uploading') ? {previewIcon}{removeIcon} : removeIconCross; let message; if (file.response && typeof file.response === 'string') { message = file.response; } else { message = (file.error && file.error.statusText) || locale.uploadError; } const iconAndPreview = (file.status === 'error') ? {icon}{preview} : {icon}{preview}; return (
{iconAndPreview}
{actions} {progress}
); }); const listClassNames = classNames({ [`${prefixCls}-list`]: true, [`${prefixCls}-list-${listType}`]: true, }); const animationDirection = listType === 'picture-card' ? 'animate-inline' : 'animate'; return ( {list} ); } }