218 lines
6.1 KiB
JavaScript
218 lines
6.1 KiB
JavaScript
|
"use strict";
|
||
|
var __async = (__this, __arguments, generator) => {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
var fulfilled = (value) => {
|
||
|
try {
|
||
|
step(generator.next(value));
|
||
|
} catch (e) {
|
||
|
reject(e);
|
||
|
}
|
||
|
};
|
||
|
var rejected = (value) => {
|
||
|
try {
|
||
|
step(generator.throw(value));
|
||
|
} catch (e) {
|
||
|
reject(e);
|
||
|
}
|
||
|
};
|
||
|
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
||
|
step((generator = generator.apply(__this, __arguments)).next());
|
||
|
});
|
||
|
};
|
||
|
const common_vendor = require("../../../common/vendor.js");
|
||
|
const sheep_api_infra_file = require("../../api/infra/file.js");
|
||
|
const ERR_MSG_OK = "chooseAndUploadFile:ok";
|
||
|
const ERR_MSG_FAIL = "chooseAndUploadFile:fail";
|
||
|
function chooseImage(opts) {
|
||
|
const {
|
||
|
count,
|
||
|
sizeType = ["original", "compressed"],
|
||
|
sourceType = ["album", "camera"],
|
||
|
extension
|
||
|
} = opts;
|
||
|
return new Promise((resolve, reject) => {
|
||
|
common_vendor.index.chooseImage({
|
||
|
count,
|
||
|
sizeType,
|
||
|
sourceType,
|
||
|
extension,
|
||
|
success(res) {
|
||
|
resolve(normalizeChooseAndUploadFileRes(res, "image"));
|
||
|
},
|
||
|
fail(res) {
|
||
|
reject({
|
||
|
errMsg: res.errMsg.replace("chooseImage:fail", ERR_MSG_FAIL)
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
function chooseVideo(opts) {
|
||
|
const { camera, compressed, maxDuration, sourceType = ["album", "camera"], extension } = opts;
|
||
|
return new Promise((resolve, reject) => {
|
||
|
common_vendor.index.chooseVideo({
|
||
|
camera,
|
||
|
compressed,
|
||
|
maxDuration,
|
||
|
sourceType,
|
||
|
extension,
|
||
|
success(res) {
|
||
|
const { tempFilePath, duration, size, height, width } = res;
|
||
|
resolve(
|
||
|
normalizeChooseAndUploadFileRes(
|
||
|
{
|
||
|
errMsg: "chooseVideo:ok",
|
||
|
tempFilePaths: [tempFilePath],
|
||
|
tempFiles: [
|
||
|
{
|
||
|
name: res.tempFile && res.tempFile.name || "",
|
||
|
path: tempFilePath,
|
||
|
size,
|
||
|
type: res.tempFile && res.tempFile.type || "",
|
||
|
width,
|
||
|
height,
|
||
|
duration,
|
||
|
fileType: "video",
|
||
|
cloudPath: ""
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
"video"
|
||
|
)
|
||
|
);
|
||
|
},
|
||
|
fail(res) {
|
||
|
reject({
|
||
|
errMsg: res.errMsg.replace("chooseVideo:fail", ERR_MSG_FAIL)
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
function chooseAll(opts) {
|
||
|
const { count, extension } = opts;
|
||
|
return new Promise((resolve, reject) => {
|
||
|
let chooseFile = common_vendor.index.chooseFile;
|
||
|
if (typeof common_vendor.wx$1 !== "undefined" && typeof common_vendor.wx$1.chooseMessageFile === "function") {
|
||
|
chooseFile = common_vendor.wx$1.chooseMessageFile;
|
||
|
}
|
||
|
if (typeof chooseFile !== "function") {
|
||
|
return reject({
|
||
|
errMsg: ERR_MSG_FAIL + " 请指定 type 类型,该平台仅支持选择 image 或 video。"
|
||
|
});
|
||
|
}
|
||
|
chooseFile({
|
||
|
type: "all",
|
||
|
count,
|
||
|
extension,
|
||
|
success(res) {
|
||
|
resolve(normalizeChooseAndUploadFileRes(res));
|
||
|
},
|
||
|
fail(res) {
|
||
|
reject({
|
||
|
errMsg: res.errMsg.replace("chooseFile:fail", ERR_MSG_FAIL)
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
function normalizeChooseAndUploadFileRes(res, fileType) {
|
||
|
res.tempFiles.forEach((item, index) => {
|
||
|
if (!item.name) {
|
||
|
item.name = item.path.substring(item.path.lastIndexOf("/") + 1);
|
||
|
}
|
||
|
if (fileType) {
|
||
|
item.fileType = fileType;
|
||
|
}
|
||
|
item.cloudPath = Date.now() + "_" + index + item.name.substring(item.name.lastIndexOf("."));
|
||
|
});
|
||
|
if (!res.tempFilePaths) {
|
||
|
res.tempFilePaths = res.tempFiles.map((file) => file.path);
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
function uploadCloudFiles(files, max = 5, onUploadProgress) {
|
||
|
files = JSON.parse(JSON.stringify(files));
|
||
|
const len = files.length;
|
||
|
let count = 0;
|
||
|
const self = this;
|
||
|
return new Promise((resolve) => {
|
||
|
while (count < max) {
|
||
|
next();
|
||
|
}
|
||
|
function next() {
|
||
|
const cur = count++;
|
||
|
if (cur >= len) {
|
||
|
!files.find((item) => !item.url && !item.errMsg) && resolve(files);
|
||
|
return;
|
||
|
}
|
||
|
const fileItem = files[cur];
|
||
|
const index = self.files.findIndex((v) => v.uuid === fileItem.uuid);
|
||
|
fileItem.url = "";
|
||
|
delete fileItem.errMsg;
|
||
|
common_vendor.Ws.uploadFile({
|
||
|
filePath: fileItem.path,
|
||
|
cloudPath: fileItem.cloudPath,
|
||
|
fileType: fileItem.fileType,
|
||
|
onUploadProgress: (res) => {
|
||
|
res.index = index;
|
||
|
onUploadProgress && onUploadProgress(res);
|
||
|
}
|
||
|
}).then((res) => {
|
||
|
fileItem.url = res.fileID;
|
||
|
fileItem.index = index;
|
||
|
if (cur < len) {
|
||
|
next();
|
||
|
}
|
||
|
}).catch((res) => {
|
||
|
fileItem.errMsg = res.errMsg || res.message;
|
||
|
fileItem.index = index;
|
||
|
if (cur < len) {
|
||
|
next();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
function uploadFiles(choosePromise, { onChooseFile, onUploadProgress }) {
|
||
|
return choosePromise.then((res) => {
|
||
|
if (onChooseFile) {
|
||
|
const customChooseRes = onChooseFile(res);
|
||
|
if (typeof customChooseRes !== "undefined") {
|
||
|
return Promise.resolve(customChooseRes).then(
|
||
|
(chooseRes) => typeof chooseRes === "undefined" ? res : chooseRes
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
return res;
|
||
|
}).then((res) => {
|
||
|
if (res === false) {
|
||
|
return {
|
||
|
errMsg: ERR_MSG_OK,
|
||
|
tempFilePaths: [],
|
||
|
tempFiles: []
|
||
|
};
|
||
|
}
|
||
|
return res;
|
||
|
}).then((files) => __async(this, null, function* () {
|
||
|
for (const file of files.tempFiles) {
|
||
|
const { data } = yield sheep_api_infra_file.FileApi.uploadFile(file.path);
|
||
|
file.url = data;
|
||
|
}
|
||
|
return files;
|
||
|
}));
|
||
|
}
|
||
|
function chooseAndUploadFile(opts = {
|
||
|
type: "all"
|
||
|
}) {
|
||
|
if (opts.type === "image") {
|
||
|
return uploadFiles(chooseImage(opts), opts);
|
||
|
} else if (opts.type === "video") {
|
||
|
return uploadFiles(chooseVideo(opts), opts);
|
||
|
}
|
||
|
return uploadFiles(chooseAll(opts), opts);
|
||
|
}
|
||
|
exports.chooseAndUploadFile = chooseAndUploadFile;
|
||
|
exports.uploadCloudFiles = uploadCloudFiles;
|
||
|
//# sourceMappingURL=choose-and-upload-file.js.map
|