acud
Version:
acg react 组件库
406 lines (405 loc) • 15.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof3 = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _readOnlyError2 = _interopRequireDefault(require("@babel/runtime/helpers/readOnlyError"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _isNativeReflectConstruct2 = _interopRequireDefault(require("@babel/runtime/helpers/isNativeReflectConstruct"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _pickAttrs = _interopRequireDefault(require("rc-util/lib/pickAttrs"));
var _request = _interopRequireDefault(require("./request"));
var _uid = _interopRequireDefault(require("./uid"));
var _attrAccept = _interopRequireDefault(require("./attr-accept"));
var _traverseFileTree = _interopRequireDefault(require("./traverseFileTree"));
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t2 in e) "default" !== _t2 && {}.hasOwnProperty.call(e, _t2) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t2)) && (i.get || i.set) ? o(f, _t2, i) : f[_t2] = e[_t2]); return f; })(e, t); }
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, (0, _isNativeReflectConstruct2["default"])() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
/* eslint react/no-is-mounted:0,react/sort-comp:0,react/prop-types:0 */
/*
* base-upload
* author zhousheng
*/
var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P ? value : new P(function (resolve) {
resolve(value);
});
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
}
function step(result) {
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __rest = void 0 && (void 0).__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;
};
var AjaxUploader = /*#__PURE__*/function (_Component) {
function AjaxUploader() {
var _this;
(0, _classCallCheck2["default"])(this, AjaxUploader);
_this = _callSuper(this, AjaxUploader, arguments);
_this.state = {
uid: (0, _uid["default"])()
};
_this.reqs = {};
_this.onChange = function (e) {
var _this$props = _this.props,
accept = _this$props.accept,
directory = _this$props.directory;
var files = e.target.files;
var acceptedFiles = (0, _toConsumableArray2["default"])(files).filter(function (file) {
return !directory || (0, _attrAccept["default"])(file, accept);
});
_this.uploadFiles(acceptedFiles);
_this.reset();
};
_this.onClick = function (e) {
var el = _this.fileInput;
if (!el) {
return;
}
var _this$props2 = _this.props,
children = _this$props2.children,
onClick = _this$props2.onClick;
if (children && children.type === 'button') {
var parent = el.parentNode;
parent.focus();
parent.querySelector('button').blur();
}
el.click();
if (onClick) {
onClick(e);
}
};
_this.onKeyDown = function (e) {
if (e.key === 'Enter') {
_this.onClick(e);
}
};
_this.onFileDrop = function (e) {
var multiple = _this.props.multiple;
e.preventDefault();
if (e.type === 'dragover') {
return;
}
if (_this.props.directory) {
(0, _traverseFileTree["default"])(Array.prototype.slice.call(e.dataTransfer.items), _this.uploadFiles, function (_file) {
return (0, _attrAccept["default"])(_file, _this.props.accept);
});
} else {
var files = (0, _toConsumableArray2["default"])(e.dataTransfer.files).filter(function (file) {
return (0, _attrAccept["default"])(file, _this.props.accept);
});
if (multiple === false) {
files = files.slice(0, 1);
}
_this.uploadFiles(files);
}
};
_this.uploadFiles = function (files) {
var originFiles = (0, _toConsumableArray2["default"])(files);
var postFiles = originFiles.map(function (file) {
// eslint-disable-next-line no-param-reassign
// 处理重新上传文件时已有uid的情况
file.uid = (file === null || file === void 0 ? void 0 : file.uid) || (0, _uid["default"])();
return _this.processFile(file, originFiles);
});
// Batch upload files
Promise.all(postFiles).then(function (fileList) {
var onBatchStart = _this.props.onBatchStart;
onBatchStart === null || onBatchStart === void 0 ? void 0 : onBatchStart(fileList.map(function (_ref) {
var origin = _ref.origin,
parsedFile = _ref.parsedFile;
return {
file: origin,
parsedFile: parsedFile
};
}));
fileList.filter(function (file) {
return file.parsedFile !== null;
}).forEach(function (file) {
_this.post(file);
});
});
};
/**
* Process file before upload. When all the file is ready, we start upload.
*/
_this.processFile = function (file, fileList) {
return __awaiter(_this, void 0, void 0, /*#__PURE__*/_regenerator["default"].mark(function _callee() {
var beforeUpload, transformedFile, action, mergedAction, data, mergedData, parsedData, parsedFile, mergedParsedFile, _t;
return _regenerator["default"].wrap(function (_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
beforeUpload = this.props.beforeUpload;
transformedFile = file;
if (!beforeUpload) {
_context.next = 5;
break;
}
_context.prev = 1;
_context.next = 2;
return beforeUpload(file, fileList);
case 2:
transformedFile = _context.sent;
_context.next = 4;
break;
case 3:
_context.prev = 3;
_t = _context["catch"](1);
// Rejection will also trade as false
transformedFile = false;
case 4:
if (!(transformedFile === false)) {
_context.next = 5;
break;
}
return _context.abrupt("return", {
origin: file,
parsedFile: null,
action: null,
data: null
});
case 5:
// Get latest action
action = this.props.action;
if (!(typeof action === 'function')) {
_context.next = 7;
break;
}
_context.next = 6;
return action(file);
case 6:
mergedAction = _context.sent;
_context.next = 8;
break;
case 7:
mergedAction = action;
case 8:
// Get latest data
data = this.props.data;
if (!(typeof data === 'function')) {
_context.next = 10;
break;
}
_context.next = 9;
return data(file);
case 9:
mergedData = _context.sent;
_context.next = 11;
break;
case 10:
mergedData = data;
case 11:
parsedData
// string type is from legacy `transformFile`.
// Not sure if this will work since no related test case works with it
= ((0, _typeof2["default"])(transformedFile) === 'object' || typeof transformedFile === 'string') && transformedFile ? transformedFile : file;
if (parsedData instanceof File) {
parsedFile = parsedData;
} else {
parsedFile = new File([parsedData], file.name, {
type: file.type
});
}
mergedParsedFile = parsedFile;
mergedParsedFile.uid = file.uid;
return _context.abrupt("return", {
origin: file,
data: mergedData,
parsedFile: mergedParsedFile,
action: mergedAction
});
case 12:
case "end":
return _context.stop();
}
}, _callee, this, [[1, 3]]);
}));
};
_this.saveFileInput = function (node) {
_this.fileInput = node;
};
return _this;
}
(0, _inherits2["default"])(AjaxUploader, _Component);
return (0, _createClass2["default"])(AjaxUploader, [{
key: "componentDidMount",
value: function componentDidMount() {
this._isMounted = true;
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this._isMounted = false;
this.abort();
}
}, {
key: "post",
value: function post(_ref2) {
var _this2 = this;
var data = _ref2.data,
origin = _ref2.origin,
action = _ref2.action,
parsedFile = _ref2.parsedFile;
if (!this._isMounted) {
return;
}
var _this$props3 = this.props,
onStart = _this$props3.onStart,
customRequest = _this$props3.customRequest,
name = _this$props3.name,
headers = _this$props3.headers,
withCredentials = _this$props3.withCredentials,
method = _this$props3.method;
var uid = origin.uid;
var request = customRequest || _request["default"];
var requestOption = {
action: action,
filename: name,
data: data,
file: parsedFile,
headers: headers,
withCredentials: withCredentials,
method: method || 'post',
onProgress: function onProgress(e) {
var onProgress = _this2.props.onProgress;
onProgress === null || onProgress === void 0 ? void 0 : onProgress(e, parsedFile);
},
onSuccess: function onSuccess(ret, xhr) {
var onSuccess = _this2.props.onSuccess;
onSuccess === null || onSuccess === void 0 ? void 0 : onSuccess(ret, parsedFile, xhr);
delete _this2.reqs[uid];
},
onError: function onError(err, ret) {
var onError = _this2.props.onError;
onError === null || onError === void 0 ? void 0 : onError(err, ret, parsedFile);
delete _this2.reqs[uid];
}
};
onStart(origin);
this.reqs[uid] = request(requestOption);
}
}, {
key: "reset",
value: function reset() {
this.setState({
uid: (0, _uid["default"])()
});
}
}, {
key: "abort",
value: function abort(file) {
var reqs = this.reqs;
if (file) {
var uid = file.uid ? file.uid : file;
if (reqs[uid] && reqs[uid].abort) {
reqs[uid].abort();
}
delete reqs[uid];
} else {
Object.keys(reqs).forEach(function (uid) {
if (reqs[uid] && reqs[uid].abort) {
reqs[uid].abort();
}
delete reqs[uid];
});
}
}
}, {
key: "render",
value: function render() {
var _a = this.props,
Tag = _a.component,
prefixCls = _a.prefixCls,
className = _a.className,
disabled = _a.disabled,
id = _a.id,
style = _a.style,
multiple = _a.multiple,
accept = _a.accept,
capture = _a.capture,
children = _a.children,
directory = _a.directory,
openFileDialogOnClick = _a.openFileDialogOnClick,
onMouseEnter = _a.onMouseEnter,
onMouseLeave = _a.onMouseLeave,
otherProps = __rest(_a, ["component", "prefixCls", "className", "disabled", "id", "style", "multiple", "accept", "capture", "children", "directory", "openFileDialogOnClick", "onMouseEnter", "onMouseLeave"]);
var cls = (0, _classnames["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, prefixCls, true), "".concat(prefixCls, "-disabled"), disabled), className, className));
// because input don't have directory/webkitdirectory type declaration
var dirProps = directory ? {
directory: 'directory',
webkitdirectory: 'webkitdirectory'
} : {};
var events = disabled ? {} : {
onClick: openFileDialogOnClick ? this.onClick : function () {},
onKeyDown: openFileDialogOnClick ? this.onKeyDown : function () {},
onMouseEnter: onMouseEnter,
onMouseLeave: onMouseLeave,
onDrop: this.onFileDrop,
onDragOver: this.onFileDrop,
tabIndex: '0'
};
return /*#__PURE__*/_react["default"].createElement(Tag, (0, _extends2["default"])({}, events, {
className: cls,
role: "button",
disabled: disabled,
style: style
}), /*#__PURE__*/_react["default"].createElement("input", (0, _extends2["default"])({}, (0, _pickAttrs["default"])(otherProps, {
aria: true,
data: true
}), {
id: id,
type: "file",
ref: this.saveFileInput,
onClick: function onClick(e) {
return e.stopPropagation();
},
key: this.state.uid,
style: {
display: 'none'
},
accept: accept
}, dirProps, {
multiple: multiple,
onChange: this.onChange
}, capture != null ? {
capture: capture
} : {})), children);
}
}]);
}(_react.Component);
var _default = exports["default"] = AjaxUploader;