UNPKG

ipink-util

Version:

util.js

413 lines (410 loc) 11 kB
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 };