city-casereport/miniprogram_npm/tdesign-miniprogram/upload/upload.js
2023-12-06 14:22:42 +08:00

222 lines
9.6 KiB
JavaScript

var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import { isObject, SuperComponent, wxComponent } from '../common/src/index';
import props from './props';
import config from '../common/config';
import { isOverSize } from '../common/utils';
const { prefix } = config;
const name = `${prefix}-upload`;
let Upload = class Upload extends SuperComponent {
constructor() {
super(...arguments);
this.externalClasses = [`${prefix}-class`];
this.options = {
multipleSlots: true,
};
this.data = {
classPrefix: name,
prefix,
current: false,
proofs: [],
customFiles: [],
customLimit: 0,
column: 4,
};
this.properties = props;
this.controlledProps = [
{
key: 'files',
event: 'success',
},
];
this.observers = {
'files, max'(files, max) {
this.handleLimit(files, max);
},
gridConfig() {
this.updateGrid();
},
};
this.lifetimes = {
ready() {
this.handleLimit(this.data.customFiles, this.data.max);
this.updateGrid();
},
};
this.methods = {
uploadFiles(files) {
return new Promise((resolve) => {
const task = this.data.requestMethod(files);
if (task instanceof Promise) {
return task;
}
resolve({});
});
},
startUpload(files) {
if (typeof this.data.requestMethod === 'function') {
return this.uploadFiles(files)
.then(() => {
files.forEach((file) => {
file.percent = 100;
});
this.triggerSuccessEvent(files);
})
.catch((err) => {
this.triggerFailEvent(err);
});
}
this.triggerSuccessEvent(files);
this.handleLimit(this.data.customFiles, this.data.max);
return Promise.resolve();
},
onAddTap() {
const { mediaType, source } = this.properties;
if (source === 'media') {
this.chooseMedia(mediaType);
}
else {
this.chooseMessageFile(mediaType);
}
},
chooseMedia(mediaType) {
const { config, sizeLimit, customLimit } = this.data;
wx.chooseMedia(Object.assign(Object.assign({ count: customLimit, mediaType }, config), { success: (res) => {
const files = [];
res.tempFiles.forEach((temp) => {
const { size, fileType, tempFilePath, width, height, duration, thumbTempFilePath } = temp, res = __rest(temp, ["size", "fileType", "tempFilePath", "width", "height", "duration", "thumbTempFilePath"]);
if (isOverSize(size, sizeLimit)) {
let title = `${fileType === 'image' ? '图片' : '视频'}大小超过限制`;
if (typeof sizeLimit !== 'number') {
title = sizeLimit.message.replace('{sizeLimit}', sizeLimit === null || sizeLimit === void 0 ? void 0 : sizeLimit.size);
}
wx.showToast({ icon: 'none', title });
return;
}
const name = this.getRandFileName(tempFilePath);
files.push(Object.assign({ name, type: this.getFileType(mediaType, tempFilePath, fileType), url: tempFilePath, size: size, width: width, height: height, duration: duration, thumb: thumbTempFilePath, percent: 0 }, res));
});
this.afterSelect(files);
}, fail: (err) => {
this.triggerFailEvent(err);
}, complete: (res) => {
this.triggerEvent('complete', res);
} }));
},
chooseMessageFile(mediaType) {
const { max, config, sizeLimit } = this.properties;
wx.chooseMessageFile(Object.assign(Object.assign({ count: max, type: Array.isArray(mediaType) ? 'all' : mediaType }, config), { success: (res) => {
const files = [];
res.tempFiles.forEach((temp) => {
const { size, type: fileType, path: tempFilePath } = temp, res = __rest(temp, ["size", "type", "path"]);
if (isOverSize(size, sizeLimit)) {
let title = `${fileType === 'image' ? '图片' : '视频'}大小超过限制`;
if (typeof sizeLimit !== 'number') {
title = sizeLimit.message.replace('{sizeLimit}', sizeLimit === null || sizeLimit === void 0 ? void 0 : sizeLimit.size);
}
wx.showToast({ icon: 'none', title });
return;
}
const name = this.getRandFileName(tempFilePath);
files.push(Object.assign({ name, type: this.getFileType(mediaType, tempFilePath, fileType), url: tempFilePath, size: size, percent: 0 }, res));
});
this.afterSelect(files);
}, fail: (err) => this.triggerFailEvent(err), complete: (res) => this.triggerEvent('complete', res) }));
},
afterSelect(files) {
this._trigger('select-change', {
files: [...this.data.customFiles],
currentSelectedFiles: [files],
});
this._trigger('add', { files });
this.startUpload(files);
},
};
}
onProofTap(e) {
var _a;
this.onFileClick(e);
const { index } = e.currentTarget.dataset;
wx.previewImage({
urls: this.data.customFiles.filter((file) => file.percent !== -1).map((file) => file.url),
current: (_a = this.data.customFiles[index]) === null || _a === void 0 ? void 0 : _a.url,
});
}
handleLimit(customFiles, max) {
if (max === 0) {
max = 20;
}
this.setData({
customFiles: customFiles.length > max ? customFiles.slice(0, max) : customFiles,
customLimit: max - customFiles.length,
});
}
triggerSuccessEvent(files) {
this._trigger('success', { files: [...this.data.customFiles, ...files] });
}
triggerFailEvent(err) {
this.triggerEvent('fail', err);
}
onFileClick(e) {
const { file } = e.currentTarget.dataset;
this.triggerEvent('click', { file });
}
getFileType(mediaType, tempFilePath, fileType) {
if (fileType)
return fileType;
if (mediaType.length === 1) {
return mediaType[0];
}
const videoType = ['avi', 'wmv', 'mkv', 'mp4', 'mov', 'rm', '3gp', 'flv', 'mpg', 'rmvb'];
const temp = tempFilePath.split('.');
const postfix = temp[temp.length - 1];
if (videoType.includes(postfix.toLocaleLowerCase())) {
return 'video';
}
return 'image';
}
getRandFileName(filePath) {
const extIndex = filePath.lastIndexOf('.');
const extName = extIndex === -1 ? '' : filePath.substr(extIndex);
return parseInt(`${Date.now()}${Math.floor(Math.random() * 900 + 100)}`, 10).toString(36) + extName;
}
onDelete(e) {
const { index } = e.currentTarget.dataset;
this.deleteHandle(index);
}
deleteHandle(index) {
const { customFiles } = this.data;
const delFile = customFiles[index];
this.triggerEvent('remove', { index, file: delFile });
}
updateGrid() {
let { gridConfig = {} } = this.properties;
if (!isObject(gridConfig))
gridConfig = {};
const { column = 4, width = 160, height = 160 } = gridConfig;
this.setData({
gridItemStyle: `align-self:flex-end;width:${width}rpx;height:${height}rpx`,
column: column,
});
}
};
Upload = __decorate([
wxComponent()
], Upload);
export default Upload;