UNPKG

choerodon-ui

Version:

An enterprise-class UI design language and React-based implementation

455 lines (375 loc) 14.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; Object.defineProperty(exports, "__esModule", { value: true }); exports.beforeUploadFile = beforeUploadFile; exports.isAcceptFile = isAcceptFile; exports.uploadFile = uploadFile; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _mobx = require("mobx"); var _AttachmentFileChunk = _interopRequireDefault(require("../data-set/AttachmentFileChunk")); var _utils = require("../data-set/utils"); var _axios = _interopRequireDefault(require("../axios")); var _promiseQueue = _interopRequireDefault(require("../promise-queue")); var _localeContext = require("../locale-context"); var _formatter = require("../formatter"); var _UploadError = _interopRequireDefault(require("./UploadError")); function getAxios(context) { return context.getConfig('axios') || _axios["default"]; } function isAcceptFile(attachment, accept) { var acceptTypes = accept.map(function (type) { return new RegExp(type.replace(/\./g, '\\.').replace(/\*/g, '.*')); }); var name = attachment.name, type = attachment.type; return acceptTypes.some(function (acceptType) { return acceptType.test(name) || acceptType.test(type); }); } function getUploadAxiosConfig(props, attachment, chunk, attachmentUUID, context, _onUploadProgress) { var originFileObj = attachment.originFileObj; if (originFileObj) { var blob = chunk ? originFileObj.slice(chunk.start, chunk.end) : originFileObj; var globalConfig = context.getConfig('attachment'); var action = props.action, data = props.data, headers = props.headers, _props$fileKey = props.fileKey, fileKey = _props$fileKey === void 0 ? globalConfig.defaultFileKey : _props$fileKey, withCredentials = props.withCredentials; var newHeaders = (0, _objectSpread2["default"])({ 'X-Requested-With': 'XMLHttpRequest' }, headers); var formData = new FormData(); formData.append(fileKey, blob); if (data) { (0, _utils.appendFormData)(formData, data); } if (action && !chunk) { return { url: action, headers: newHeaders, data: formData, onUploadProgress: _onUploadProgress, method: 'POST', withCredentials: withCredentials }; } var actionHook = globalConfig.action; if (actionHook) { var bucketName = props.bucketName, bucketDirectory = props.bucketDirectory, storageCode = props.storageCode, isPublic = props.isPublic; var newConfig = typeof actionHook === 'function' ? actionHook({ attachment: attachment, chunk: chunk, bucketName: bucketName, bucketDirectory: bucketDirectory, storageCode: storageCode, attachmentUUID: attachmentUUID, isPublic: isPublic }) : actionHook; var customData = newConfig.data, customUploadProgress = newConfig.onUploadProgress; if (customData) { (0, _utils.appendFormData)(formData, customData); } return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({ withCredentials: withCredentials, method: 'POST' }, newConfig), {}, { headers: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, newHeaders), newConfig.headers), data: formData, onUploadProgress: function onUploadProgress(e) { _onUploadProgress(e); if (customUploadProgress) { customUploadProgress(e); } } }); } throw new Error("Please set configure.attachment.action ."); } throw new Error('AttachmentFile can be uploaded only from input.files or DragEvent.dataTransfer.files'); } function uploadChunk(_x, _x2, _x3, _x4, _x5) { return _uploadChunk.apply(this, arguments); } function _uploadChunk() { _uploadChunk = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(props, attachment, chunk, attachmentUUID, context) { var _context$getConfig, onBeforeUploadChunk, config, resp; return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.prev = 0; _context$getConfig = context.getConfig('attachment'), onBeforeUploadChunk = _context$getConfig.onBeforeUploadChunk; _context.t0 = !onBeforeUploadChunk; if (_context.t0) { _context.next = 8; break; } _context.next = 6; return onBeforeUploadChunk({ chunk: chunk, attachment: attachment, bucketName: props.bucketName, bucketDirectory: props.bucketDirectory, storageCode: props.storageCode, isPublic: props.isPublic }); case 6: _context.t1 = _context.sent; _context.t0 = _context.t1 !== false; case 8: if (!_context.t0) { _context.next = 15; break; } config = getUploadAxiosConfig(props, attachment, chunk, attachmentUUID, context, (0, _mobx.action)(function (e) { chunk.percent = e.total > 0 ? e.loaded / e.total * 100 : 0; })); _context.next = 12; return getAxios(context)(config); case 12: resp = _context.sent; chunk.status = 'success'; return _context.abrupt("return", resp); case 15: _context.next = 21; break; case 17: _context.prev = 17; _context.t2 = _context["catch"](0); chunk.status = 'error'; throw new _UploadError["default"](_context.t2); case 21: case "end": return _context.stop(); } } }, _callee, null, [[0, 17]]); })); return _uploadChunk.apply(this, arguments); } function uploadChunks(props, attachment, chunks, attachmentUUID, context, threads) { var length = chunks.length; if (length) { (0, _mobx.runInAction)(function () { attachment.status = 'uploading'; }); var queue = new _promiseQueue["default"](threads); chunks.forEach(function (chunk) { if (chunk.status !== 'success') { queue.add(function () { return uploadChunk(props, attachment, chunk, attachmentUUID, context); }); } }); return queue.ready(); } return Promise.resolve(); } function uploadNormalFile(_x6, _x7, _x8, _x9) { return _uploadNormalFile.apply(this, arguments); } function _uploadNormalFile() { _uploadNormalFile = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(props, attachment, attachmentUUID, context) { var config, resp; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.prev = 0; (0, _mobx.runInAction)(function () { attachment.status = 'uploading'; }); config = getUploadAxiosConfig(props, attachment, undefined, attachmentUUID, context, (0, _mobx.action)(function (e) { var percent = e.total > 0 ? e.loaded / e.total * 100 : 0; attachment.percent = percent; var handleProgress = props.onUploadProgress; if (handleProgress) { handleProgress(percent, attachment); } })); _context2.next = 5; return getAxios(context)(config); case 5: resp = _context2.sent; attachment.percent = 100; return _context2.abrupt("return", new Promise(function (resolve) { setTimeout(function () { return resolve(resp); }, 0); })); case 10: _context2.prev = 10; _context2.t0 = _context2["catch"](0); throw new _UploadError["default"](_context2.t0); case 13: case "end": return _context2.stop(); } } }, _callee2, null, [[0, 10]]); })); return _uploadNormalFile.apply(this, arguments); } function cuteFile(attachment, chunkSize) { var size = attachment.size, chunks = attachment.chunks; if (!chunks) { var count = chunkSize ? Math.ceil(size / chunkSize) : 1; var start = 0; var index = 0; var len; var newChunks = []; while (index < count) { len = Math.min(chunkSize, size - start); newChunks.push(new _AttachmentFileChunk["default"]({ file: attachment, total: size, start: start, end: chunkSize ? start + len : size, index: index })); index += 1; start += len; } if (newChunks.length > 1) { attachment.chunks = newChunks; } return newChunks; } return chunks; } function beforeUploadFile(_x10, _x11, _x12) { return _beforeUploadFile.apply(this, arguments); } function _beforeUploadFile() { _beforeUploadFile = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(props, context, attachment) { var attachments, useChunk, globalConfig, accept, _props$fileSize, fileSize, onBeforeUpload, beforeUpload, _args3 = arguments; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: attachments = _args3.length > 3 && _args3[3] !== undefined ? _args3[3] : []; useChunk = _args3.length > 4 ? _args3[4] : undefined; globalConfig = context.getConfig('attachment'); accept = props.accept; if (!(accept && !isAcceptFile(attachment, accept))) { _context3.next = 7; break; } (0, _mobx.runInAction)(function () { attachment.status = 'error'; attachment.invalid = true; attachment.errorMessage = (0, _localeContext.$l)('Attachment', 'file_type_mismatch', undefined, { types: accept.join(',') }); }); return _context3.abrupt("return"); case 7: _props$fileSize = props.fileSize, fileSize = _props$fileSize === void 0 ? globalConfig.defaultFileSize : _props$fileSize; if (!(fileSize && fileSize > 0 && attachment.size > fileSize)) { _context3.next = 11; break; } (0, _mobx.runInAction)(function () { attachment.status = 'error'; attachment.invalid = true; attachment.errorMessage = (0, _localeContext.$l)('Attachment', 'file_max_size', undefined, { size: (0, _formatter.formatFileSize)(fileSize) }); }); return _context3.abrupt("return"); case 11: onBeforeUpload = globalConfig.onBeforeUpload; _context3.t0 = onBeforeUpload; if (!_context3.t0) { _context3.next = 18; break; } _context3.next = 16; return onBeforeUpload(attachment, attachments, { useChunk: useChunk, bucketName: props.bucketName, bucketDirectory: props.bucketDirectory, storageCode: props.storageCode, isPublic: props.isPublic }); case 16: _context3.t1 = _context3.sent; _context3.t0 = _context3.t1 === false; case 18: if (!_context3.t0) { _context3.next = 20; break; } return _context3.abrupt("return", false); case 20: beforeUpload = props.beforeUpload; _context3.t2 = beforeUpload; if (!_context3.t2) { _context3.next = 27; break; } _context3.next = 25; return beforeUpload(attachment, attachments); case 25: _context3.t3 = _context3.sent; _context3.t2 = _context3.t3 === false; case 27: return _context3.abrupt("return", !_context3.t2); case 28: case "end": return _context3.stop(); } } }, _callee3); })); return _beforeUploadFile.apply(this, arguments); } function uploadFile(_x13, _x14, _x15, _x16, _x17, _x18) { return _uploadFile.apply(this, arguments); } function _uploadFile() { _uploadFile = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(props, attachment, attachmentUUID, context, chunkSize, useChunk) { var chunks, globalConfig, _props$chunkThreads, chunkThreads; return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: if (!useChunk) { _context4.next = 5; break; } chunks = cuteFile(attachment, chunkSize); globalConfig = context.getConfig('attachment'); _props$chunkThreads = props.chunkThreads, chunkThreads = _props$chunkThreads === void 0 ? globalConfig.defaultChunkThreads : _props$chunkThreads; return _context4.abrupt("return", uploadChunks(props, attachment, chunks.slice(), attachmentUUID, context, Math.min(chunks.length, chunkThreads))); case 5: return _context4.abrupt("return", uploadNormalFile(props, attachment, attachmentUUID, context)); case 6: case "end": return _context4.stop(); } } }, _callee4); })); return _uploadFile.apply(this, arguments); } //# sourceMappingURL=utils.js.map