ipink-util
Version:
util.js
413 lines (410 loc) • 11 kB
JavaScript
import { genRequestUrl, addHeaderToken } from './request.mjs';
import { HttpConfig, getSdk, interceptor } from './config.mjs';
import { isJsonString, isArray, isWxMini } from './is.mjs';
import { hasKey, allSettled } from './util.mjs';
import { toast } from './toast.mjs';
import { chooseOtherFile, chooseVideo, chooseImage } from './image.mjs';
const uploadFile = (options) => {
let {
api,
prefix = HttpConfig.upload_prefix,
// 前缀
key = HttpConfig.upload_key,
file,
fileType = "image",
formData,
header,
isLoading,
showLoading = isLoading,
closeLoading = HttpConfig.closeLoading,
loading = HttpConfig.loading,
loadingText,
isToast,
showToast = isToast,
toastText,
toast: toast$1 = HttpConfig.toast
} = options || {};
const reqUrl = genRequestUrl(HttpConfig.base_url, api, prefix);
if (typeof showToast == "undefined") {
showToast = HttpConfig.show_toast;
}
if (typeof showLoading == "undefined") {
showLoading = HttpConfig.show_loading;
}
let sdk = getSdk();
if (showLoading) {
if (typeof loading == "function") {
loading(loadingText || "");
} else if (sdk) {
typeof uni !== "undefined" ? uni.showLoading({ title: loadingText, icon: "none" }) : wx.showLoading({ title: loadingText || "", icon: "none" });
}
}
return new Promise((resolve) => {
let _options = {
url: reqUrl,
filePath: file,
name: key,
fileType,
formData,
timeout: HttpConfig.timeout,
header: {
...header
}
};
addHeaderToken(_options.header);
_options = interceptor("BeforeUpload", _options);
const uploadTask = uni.uploadFile({
..._options,
success: (uploadFileRes) => {
let errMsg = uploadFileRes.errMsg;
var data = isJsonString(uploadFileRes.data) ? JSON.parse(uploadFileRes.data) : uploadFileRes.data || {};
data = interceptor("AfterUpload", data);
if (uploadFileRes.statusCode == 200) {
const ok = data[HttpConfig.code_key] == HttpConfig.code_value;
let urlData = "";
let receive = HttpConfig.upload_receive_key;
if (ok) {
if (!receive) {
urlData = isArray(data.data) ? data.data[0] : data.data;
} else {
let receiveData = hasKey(data, receive) ? data[receive] : hasKey(data.data, receive) ? data.data[receive] : data.data;
urlData = isArray(receiveData) ? receiveData[0] : receiveData;
}
return resolve({
ok: true,
local: file,
data: urlData,
msg: data.msg || data.message || "上传成功"
});
}
}
errMsg = data.msg || data.message || errMsg || toastText;
if (showToast && errMsg) {
if (typeof toast$1 === "function") {
toast$1(errMsg);
} else {
toast(errMsg);
}
}
resolve({
ok: false,
local: file,
msg: errMsg
});
},
fail: (err) => {
let errMsg = err && err.errMsg || toastText;
if (showToast && errMsg) {
if (typeof toast$1 === "function") {
toast$1(errMsg);
} else {
toast(errMsg);
}
}
resolve({
ok: false,
local: file,
msg: errMsg,
err
});
},
complete: () => {
if (showLoading) {
if (typeof closeLoading == "function") {
closeLoading();
} else if (sdk) {
typeof uni !== "undefined" ? uni.hideLoading() : wx.hideLoading();
}
}
}
});
interceptor("ExecUpload", uploadTask);
});
};
const uploadMoreFile = (params) => {
let {
api,
prefix = HttpConfig.upload_prefix,
//
files,
key = HttpConfig.upload_key,
fileType = "image",
formData,
header,
isLoading,
showLoading = isLoading,
closeLoading = HttpConfig.closeLoading,
loading = HttpConfig.loading,
loadingText,
isToast,
showToast = isToast,
toastText,
toast: toast$1 = HttpConfig.toast
} = params || {};
if (typeof showToast == "undefined") {
showToast = HttpConfig.show_toast;
}
if (typeof showLoading == "undefined") {
showLoading = HttpConfig.show_loading;
}
let sdk = getSdk();
if (showLoading) {
if (typeof loading == "function") {
loading(loadingText || "");
} else if (sdk) {
typeof uni !== "undefined" ? uni.showLoading({ title: loadingText, icon: "none" }) : wx.showLoading({ title: loadingText || "", icon: "none" });
}
}
return new Promise(async (resolve) => {
if (isWxMini()) {
let resArr = [], errArr = [], promiseArr = [];
promiseArr = (files || []).map(async (item, index) => {
return uploadFile({
api,
key,
fileType,
formData,
header,
file: item,
prefix,
showToast: false
}).catch((err) => err);
});
await allSettled(promiseArr).then((res) => {
res.forEach((item) => {
if (item && item.ok) {
resArr.push(item);
} else {
errArr.push(item);
}
});
if (resArr.length > 0) {
resolve({
ok: true,
data: resArr.map((item) => item.data)
});
} else {
resolve({
ok: false,
msg: "上传失败!",
data: resArr.map((item) => item.data),
err: errArr[0].err
});
}
if (errArr.length > 0) {
let errMsg = errArr[0].err && errArr[0].err.errMsg;
let finalErrMsg = `${errArr.length}份上传失败!${errMsg ? "失败原因:" + errMsg : ""}`;
if (showToast && finalErrMsg) {
if (typeof toast$1 === "function") {
toast$1(finalErrMsg);
} else {
toast(finalErrMsg);
}
}
}
}).catch((err) => {
let errMsg = err && err.errMsg || err.errMsg || toastText;
if (showToast && errMsg) {
if (typeof toast$1 === "function") {
toast$1(errMsg);
} else {
toast(errMsg);
}
}
resolve({
ok: false,
msg: "上传失败!",
err
});
});
return;
}
let fileList = (files || []).map((item, index) => {
return {
name: index,
uri: item
};
});
const reqUrl = genRequestUrl(HttpConfig.base_url, api, prefix);
let _options = {
url: reqUrl,
//仅为示例,非真实的接口地址
files: fileList,
fileType,
formData,
header: {
...header
}
};
addHeaderToken(_options.header);
_options = interceptor("BeforeUpload", _options);
const uploadTask = uni.uploadFile({
..._options,
success: (uploadFileRes) => {
let errMsg = uploadFileRes?.errMsg;
var data = isJsonString(uploadFileRes.data) ? JSON.parse(uploadFileRes.data) : uploadFileRes.data || {};
data = interceptor("AfterUpload", data);
if (uploadFileRes.statusCode == 200) {
const ok = data[HttpConfig.code_key] == HttpConfig.code_value;
if (ok) {
let urlData = [];
let receive = HttpConfig.upload_receive_key;
if (!receive) {
urlData = isArray(data.data) ? data.data : [];
} else {
let receiveData = hasKey(data, receive) ? data[receive] : hasKey(data.data, receive) ? data.data[receive] : data.data;
urlData = isArray(receiveData) ? receiveData : [];
}
return resolve({
ok: true,
local: files,
data: urlData,
msg: data.msg || data.message || "上传成功"
});
}
}
errMsg = data.msg || data.message || errMsg || toastText;
if (showToast && errMsg) {
if (typeof toast$1 === "function") {
toast$1(errMsg);
} else {
toast(errMsg);
}
}
resolve({
ok: false,
data: [],
msg: errMsg
});
},
fail: (err) => {
let errMsg = err && err.errMsg || toastText;
if (showToast && errMsg) {
if (typeof toast$1 === "function") {
toast$1(errMsg);
} else {
toast(errMsg);
}
}
resolve({
ok: false,
local: files,
msg: errMsg,
err
});
},
complete: () => {
if (showLoading) {
if (typeof closeLoading == "function") {
closeLoading();
} else if (sdk) {
typeof uni !== "undefined" ? uni.hideLoading() : wx.hideLoading();
}
}
}
});
interceptor("ExecUpload", uploadTask);
});
};
const upload = async function(options, choosedCallback) {
let {
api,
key,
fileType,
formData,
header,
isLoading,
showLoading,
closeLoading,
loading,
loadingText,
isToast,
showToast = isToast,
toastText,
toast,
prefix,
count = 1,
sourceType = 1,
extension,
maxDuration = 60,
camera = "back",
compressed = true,
type
} = options || {};
let list = [];
if (type == "other") {
list = await chooseOtherFile({
count,
sourceType,
extension,
type: "all",
showToast
});
} else if (type == "video") {
list = await chooseVideo({
sourceType,
maxDuration,
camera,
compressed,
showToast
});
} else {
list = await chooseImage({
count,
sourceType,
fileType,
extension,
showToast
});
}
list = interceptor("AfterChooseFile", list);
if (!list || !list.length) return { ok: false };
if (choosedCallback) {
const status = choosedCallback(list);
if (status === false) {
return { ok: false };
}
}
return new Promise(async (resolve) => {
let result = {};
if (list.length === 1) {
result = await uploadFile({
api,
key,
fileType,
formData,
header,
file: list[0],
isLoading,
prefix,
showLoading,
closeLoading,
loading,
loadingText,
showToast,
toastText,
toast
});
} else {
result = await uploadMoreFile({
api,
key,
fileType,
formData,
header,
files: list,
isLoading,
prefix,
showLoading,
closeLoading,
loading,
loadingText,
showToast,
toastText,
toast
});
}
resolve(result);
});
};
export { upload, uploadFile, uploadMoreFile };