import { PropType, defineComponent } from 'vue'; // Utils import { bem, isImageFile } from './utils'; import { isDef, extend, Interceptor, getSizeStyle, callInterceptor, } from '../utils'; // Components import { Icon } from '../icon'; import { Image, ImageFit } from '../image'; import { Loading } from '../loading'; // Types import type { UploaderFileListItem } from './types'; export default defineComponent({ props: { name: [Number, String], index: Number, imageFit: String as PropType, lazyLoad: Boolean, deletable: Boolean, previewSize: [Number, String], beforeDelete: Function as PropType, item: { type: Object as PropType, required: true, }, }, emits: ['delete', 'preview'], setup(props, { emit, slots }) { const renderMask = () => { const { status, message } = props.item; if (status === 'uploading' || status === 'failed') { const MaskIcon = status === 'failed' ? ( ) : ( ); const showMessage = isDef(message) && message !== ''; return (
{MaskIcon} {showMessage &&
{message}
}
); } }; const onDelete = (event: MouseEvent) => { const { name, item, index, beforeDelete } = props; event.stopPropagation(); callInterceptor({ interceptor: beforeDelete, args: [item, { name, index }], done: () => emit('delete'), }); }; const onPreview = () => emit('preview'); const renderDeleteIcon = () => { if (props.deletable && props.item.status !== 'uploading') { return (
); } }; const renderCover = () => { if (slots['preview-cover']) { const { index, item } = props; return (
{slots['preview-cover'](extend({ index }, item))}
); } }; const renderPreview = () => { const { item } = props; if (isImageFile(item)) { return ( {renderCover()} ); } return (
{item.file ? item.file.name : item.url}
{renderCover()}
); }; return () => (
{renderPreview()} {renderMask()} {renderDeleteIcon()}
); }, });