import { use, suffixPx } from '../utils';
import { toArray, readFile, isOversize } from './utils';
import Icon from '../icon';
import Image from '../image';
const [sfc, bem] = use('uploader');
export default sfc({
inheritAttrs: false,
model: {
prop: 'fileList'
},
props: {
fileList: Array,
disabled: Boolean,
uploadText: String,
afterRead: Function,
beforeRead: Function,
previewSize: [Number, String],
previewImage: {
type: Boolean,
default: true
},
accept: {
type: String,
default: 'image/*'
},
resultType: {
type: String,
default: 'dataUrl'
},
maxSize: {
type: Number,
default: Number.MAX_VALUE
},
maxCount: {
type: Number,
default: Number.MAX_VALUE
}
},
computed: {
detail() {
return {
name: this.$attrs.name || ''
};
}
},
methods: {
onChange(event) {
let { files } = event.target;
if (this.disabled || !files.length) {
return;
}
files = files.length === 1 ? files[0] : [].slice.call(files);
if (this.beforeRead && !this.beforeRead(files, this.detail)) {
this.resetInput();
return;
}
const oversize = isOversize(files, this.maxSize);
if (Array.isArray(files)) {
const maxCount = this.maxCount - this.fileList.length;
if (files.length > maxCount) {
files = files.slice(0, maxCount);
}
Promise.all(files.map(file => readFile(file, this.resultType))).then(contents => {
const fileList = files.map((file, index) => ({
file,
content: contents[index]
}));
this.onAfterRead(fileList, oversize);
});
} else {
readFile(files, this.resultType).then(content => {
this.onAfterRead({ file: files, content }, oversize);
});
}
},
onAfterRead(files, oversize) {
if (oversize) {
this.$emit('oversize', files, this.detail);
return;
}
this.resetInput();
this.$emit('input', [...this.fileList, ...toArray(files)]);
if (this.afterRead) {
this.afterRead(files, this.detail);
}
},
resetInput() {
/* istanbul ignore else */
if (this.$refs.input) {
this.$refs.input.value = '';
}
},
renderPreview() {
if (!this.previewImage) {
return;
}
return this.fileList.map(file => (