You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
4.2 KiB

11 months ago
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var vue = require('vue');
var shared = require('@vue/shared');
var cloneDeep = require('lodash/cloneDeep');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var cloneDeep__default = /*#__PURE__*/_interopDefaultLegacy(cloneDeep);
function getFile(rawFile, uploadFiles) {
return uploadFiles.find((file) => file.uid === rawFile.uid);
}
function genUid(seed) {
return Date.now() + seed;
}
var useHandlers = (props) => {
const uploadFiles = vue.ref([]);
const uploadRef = vue.ref(null);
let tempIndex = 1;
function abort(file) {
uploadRef.value.abort(file);
}
function clearFiles(status = ["ready", "uploading", "success", "fail"]) {
uploadFiles.value = uploadFiles.value.filter((row) => {
return !status.includes(row.status);
});
}
function handleError(err, rawFile) {
const file = getFile(rawFile, uploadFiles.value);
file.status = "fail";
uploadFiles.value.splice(uploadFiles.value.indexOf(file), 1);
props.onError(err, file, uploadFiles.value);
props.onChange(file, uploadFiles.value);
}
function handleProgress(ev, rawFile) {
const file = getFile(rawFile, uploadFiles.value);
props.onProgress(ev, file, uploadFiles.value);
file.status = "uploading";
file.percentage = ev.percent || 0;
}
function handleSuccess(res, rawFile) {
const file = getFile(rawFile, uploadFiles.value);
if (file) {
file.status = "success";
file.response = res;
props.onSuccess(res, file, uploadFiles.value);
props.onChange(file, uploadFiles.value);
}
}
function handleStart(rawFile) {
const uid = genUid(tempIndex++);
rawFile.uid = uid;
const file = {
name: rawFile.name,
percentage: 0,
status: "ready",
size: rawFile.size,
raw: rawFile,
uid
};
if (props.listType === "picture-card" || props.listType === "picture") {
try {
file.url = URL.createObjectURL(rawFile);
} catch (err) {
console.error("[Element Error][Upload]", err);
props.onError(err, file, uploadFiles.value);
}
}
uploadFiles.value.push(file);
props.onChange(file, uploadFiles.value);
}
function handleRemove(file, raw) {
if (raw) {
file = getFile(raw, uploadFiles.value);
}
const revokeObjectURL = () => {
if (file.url && file.url.indexOf("blob:") === 0) {
URL.revokeObjectURL(file.url);
}
};
const doRemove = () => {
abort(file);
const fileList = uploadFiles.value;
fileList.splice(fileList.indexOf(file), 1);
props.onRemove(file, fileList);
revokeObjectURL();
};
if (!props.beforeRemove) {
doRemove();
} else if (typeof props.beforeRemove === "function") {
const before = props.beforeRemove(file, uploadFiles.value);
if (before instanceof Promise) {
before.then(() => {
doRemove();
}).catch(shared.NOOP);
} else if (before !== false) {
doRemove();
}
}
}
function submit() {
uploadFiles.value.filter((file) => file.status === "ready").forEach((file) => {
uploadRef.value.upload(file.raw);
});
}
vue.watch(() => props.listType, (val) => {
if (val === "picture-card" || val === "picture") {
uploadFiles.value = uploadFiles.value.map((file) => {
if (!file.url && file.raw) {
try {
file.url = URL.createObjectURL(file.raw);
} catch (err) {
props.onError(err, file, uploadFiles.value);
}
}
return file;
});
}
});
vue.watch(() => props.fileList, (fileList) => {
uploadFiles.value = fileList.map((file) => {
const cloneFile = cloneDeep__default["default"](file);
return {
...cloneFile,
uid: file.uid || genUid(tempIndex++),
status: file.status || "success"
};
});
}, {
immediate: true,
deep: true
});
return {
abort,
clearFiles,
handleError,
handleProgress,
handleStart,
handleSuccess,
handleRemove,
submit,
uploadFiles,
uploadRef
};
};
exports["default"] = useHandlers;
//# sourceMappingURL=useHandlers.js.map