@arco-design/web-vue
Version:
Arco Design Vue 2.0: A Vue.js 3 UI Library
190 lines (189 loc) • 5.17 kB
JavaScript
;
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
var NP = require("number-precision");
var dom = require("../_utils/dom.js");
var is = require("../_utils/is.js");
function _interopDefaultLegacy(e) {
return e && typeof e === "object" && "default" in e ? e : { "default": e };
}
var NP__default = /* @__PURE__ */ _interopDefaultLegacy(NP);
const getResponse = (xhr) => {
const res = xhr.responseText || xhr.response;
if (!res) {
return void 0;
}
const contentType = xhr.getResponseHeader("Content-Type");
if (contentType && contentType.includes("json")) {
try {
return JSON.parse(res);
} catch {
return res;
}
}
return res;
};
const getProgressStatus = (status) => {
switch (status) {
case "done":
return "success";
case "error":
return "danger";
default:
return "normal";
}
};
const getValue = (obj, fileItem) => {
if (is.isFunction(obj)) {
return obj(fileItem);
}
return obj;
};
const uploadRequest = ({
fileItem,
action,
name: originName,
data: originData,
headers = {},
withCredentials = false,
onProgress = dom.NOOP,
onSuccess = dom.NOOP,
onError = dom.NOOP
}) => {
const name = getValue(originName, fileItem) || "file";
const data = getValue(originData, fileItem);
const xhr = new XMLHttpRequest();
if (withCredentials) {
xhr.withCredentials = true;
}
xhr.upload.onprogress = (e) => {
const percent = e.total > 0 ? NP__default["default"].round(e.loaded / e.total, 2) : 0;
onProgress(percent, e);
};
xhr.onerror = function error(e) {
onError(e);
};
xhr.onload = () => {
if (xhr.status < 200 || xhr.status >= 300) {
onError(getResponse(xhr));
return;
}
onSuccess(getResponse(xhr));
};
const formData = new FormData();
if (data) {
for (const key of Object.keys(data)) {
formData.append(key, data[key]);
}
}
if (fileItem.file) {
formData.append(name, fileItem.file);
}
xhr.open("post", action != null ? action : "", true);
for (const key of Object.keys(headers)) {
xhr.setRequestHeader(key, headers[key]);
}
xhr.send(formData);
return {
abort() {
xhr.abort();
}
};
};
const isAcceptFile = (file, accept) => {
if (accept && file) {
const accepts = is.isArray(accept) ? accept : accept.split(",").map((x) => x.trim()).filter((x) => x);
const fileExtension = (file.name.indexOf(".") > -1 ? `.${file.name.split(".").pop()}` : "").toLowerCase();
return accepts.some((type) => {
const typeText = type && type.toLowerCase();
const fileType = (file.type || "").toLowerCase();
const baseFileType = fileType.split("/")[0];
if (typeText === fileType || `${baseFileType}${fileExtension.replace(".", "/")}` === typeText) {
return true;
}
if (/^\*(\/\*)?$/.test(typeText)) {
return true;
}
if (/\/\*/.test(typeText)) {
return fileType.replace(/\/.*$/, "") === typeText.replace(/\/.*$/, "");
}
if (/\..*/.test(typeText)) {
let suffixList = [typeText];
if (typeText === ".jpg" || typeText === ".jpeg") {
suffixList = [".jpg", ".jpeg"];
}
return suffixList.indexOf(fileExtension) > -1;
}
return false;
});
}
return !!file;
};
const loopDirectory = (itemList, accept, callback) => {
const files = [];
let restFileCount = 0;
const onFinish = () => {
!restFileCount && callback(files);
};
const _loopDirectory = (item) => {
restFileCount += 1;
if (item == null ? void 0 : item.isFile) {
item.file((file) => {
restFileCount -= 1;
if (isAcceptFile(file, accept)) {
Object.defineProperty(file, "webkitRelativePath", {
value: item.fullPath.replace(/^\//, "")
});
files.push(file);
}
onFinish();
});
return;
}
if (item == null ? void 0 : item.isDirectory) {
const reader = item.createReader();
let flag = false;
const readEntries = () => {
reader.readEntries((entries) => {
if (!flag) {
restFileCount -= 1;
flag = true;
}
if (entries.length === 0) {
onFinish();
} else {
readEntries();
entries.forEach(_loopDirectory);
}
});
};
readEntries();
return;
}
restFileCount -= 1;
onFinish();
};
[].slice.call(itemList).forEach(
(item) => item.webkitGetAsEntry && _loopDirectory(item.webkitGetAsEntry())
);
};
const isImage = (file) => {
var _a;
return (_a = file.type) == null ? void 0 : _a.includes("image");
};
const getFiles = (fileList, accept) => {
if (!fileList) {
return [];
}
const files = Array.from(fileList);
if (accept) {
return files.filter((file) => {
return isAcceptFile(file, accept);
});
}
return files;
};
exports.getFiles = getFiles;
exports.getProgressStatus = getProgressStatus;
exports.isImage = isImage;
exports.loopDirectory = loopDirectory;
exports.uploadRequest = uploadRequest;