deer-ui
Version:
React.js UI components for PC Web
336 lines (276 loc) • 13 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
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 _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _utils = require("../utils");
var _message = _interopRequireDefault(require("../message"));
var _progress = _interopRequireDefault(require("../progress"));
var _uploadFileTypeNames;
function _createSuper(Derived) { return function () { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
// 上传 对应 进度条属性 的状态
var UPLOAD_STATUS = {
ERROR: "error",
SUCCESS: "success",
PROGRESS: "progress",
ABORT: "warning",
TIMEOUT: "warning"
};
var uploadFileType = "file";
var uploadImageType = "image";
var uploadFileTypeNames = (_uploadFileTypeNames = {}, (0, _defineProperty2.default)(_uploadFileTypeNames, uploadFileType, "文件"), (0, _defineProperty2.default)(_uploadFileTypeNames, uploadImageType, "图片"), _uploadFileTypeNames); // 默认图片上传文件后缀名限制
var imageReg = /\/(?:jpeg|jpg|png|gif|svg)/i;
var Upload = /*#__PURE__*/function (_Component) {
(0, _inherits2.default)(Upload, _Component);
var _super = _createSuper(Upload);
function Upload(props) {
var _this;
(0, _classCallCheck2.default)(this, Upload);
_this = _super.call(this, props);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "state", {
uploadList: []
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_onSelect", function () {
_this.fileRef.current.click();
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onSelect", function () {
var files = (0, _toConsumableArray2.default)(_this.fileRef.current.files);
files.forEach(function (file, index) {
var cover = _this.props.type === uploadImageType && _this.getUrl(file) || "";
var fileInfo = {
name: file.name,
size: file.size,
type: file.type,
progress: 0,
status: UPLOAD_STATUS.PROGRESS,
cover: cover
};
if (_this.props.beforeUpload && !_this.props.beforeUpload(fileInfo) || !_this.defaultBeforeUpload(fileInfo)) {
return;
}
var uploadList = (0, _toConsumableArray2.default)(_this.state.uploadList);
uploadList.push(fileInfo);
_this.setState({
uploadList: uploadList
}, function () {
_this.onUploadFile(fileInfo, index);
});
});
_this.props.onSelect(_this.state.uploadList);
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "changeUploadStatus", function (status, index) {
var uploadList = (0, _toConsumableArray2.default)(_this.state.uploadList);
uploadList[index].status = status;
_this.setState({
uploadList: uploadList,
uploading: false
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isImage", function (type) {
return imageReg.test(type);
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "defaultBeforeUpload", function (_ref) {
var size = _ref.size,
type = _ref.type;
var _this$props = _this.props,
maxSize = _this$props.maxSize,
uploadType = _this$props.type;
var imageType = type.split("/").pop();
if (uploadType === uploadImageType && !_this.isImage(type)) {
_message.default.error("".concat(_this.typeName, " \u4E0D\u652F\u6301 ").concat(imageType, " \u683C\u5F0F"));
return false;
}
if (maxSize && typeof maxSize === "number") {
var fileSize = size / 1024;
if (fileSize > maxSize) {
_message.default.error("".concat(_this.typeName, " \u6700\u5927\u652F\u6301 ").concat((0, _utils.formatFileSize)(maxSize * 1024)));
return false;
}
}
return true;
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onUploadFile", function (file, index) {
var _this$props2 = _this.props,
name = _this$props2.name,
action = _this$props2.action;
var formData = new FormData();
var xhr = new XMLHttpRequest();
var newFile = new Blob([file]);
formData.append(name, newFile);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var res = JSON.parse(xhr.responseText);
_this.changeUploadStatus(UPLOAD_STATUS.SUCCESS, index);
_this.props.onComplete(res);
} else {
_this.changeUploadStatus(UPLOAD_STATUS.ERROR, index);
_this.props.onError();
}
}
};
xhr.onloadstart = function () {
_this.changeUploadStatus(UPLOAD_STATUS.PROGRESS, index);
_this.props.onStart();
};
xhr.onerror = function (err) {
_this.changeUploadStatus(UPLOAD_STATUS.ERROR, index);
_this.props.onError(err);
};
xhr.onabort = function (err) {
_this.changeUploadStatus(UPLOAD_STATUS.ABORT, index);
_this.props.onAbort(err);
};
xhr.ontimeout = function (err) {
_this.changeUploadStatus(UPLOAD_STATUS.TIMEOUT, index);
_this.props.onTimeOut(err);
};
xhr.onloadend = function (e) {
_this.setState({
uploading: false
});
};
xhr.upload.onprogress = function (e) {
var loaded = e.loaded,
total = e.total;
var progress = Math.round(loaded * 100 / total);
var uploadList = (0, _toConsumableArray2.default)(_this.state.uploadList);
uploadList[index].progress = progress;
uploadList[index].status = UPLOAD_STATUS.PROGRESS;
_this.props.onProgress(e, progress);
_this.setState({
uploadList: uploadList
});
};
xhr.open("POST", action, true);
xhr.send(formData);
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getUrl", function (file) {
return window.URL.createObjectURL(file);
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onPreviewCover", function (cover) {
return function () {// Modal.info({
// title: "预览",
// showMask: true,
// okText: "关闭",
// content: (
// <div className={`${this.props.prefixCls}-preview`}>
// <img src={cover} />
// </div>
// )
// });
// this.props.onPreview(cover);
};
});
_this.fileRef = (0, _react.createRef)();
return _this;
}
(0, _createClass2.default)(Upload, [{
key: "render",
value: function render() {
var _this2 = this;
var _this$props3 = this.props,
prefixCls = _this$props3.prefixCls,
className = _this$props3.className,
maxSize = _this$props3.maxSize,
onComplete = _this$props3.onComplete,
onStart = _this$props3.onStart,
onTimeOut = _this$props3.onTimeOut,
typeName = _this$props3.typeName,
children = _this$props3.children,
accept = _this$props3.accept,
multiple = _this$props3.multiple,
showUploadList = _this$props3.showUploadList,
type = _this$props3.type,
attr = (0, _objectWithoutProperties2.default)(_this$props3, ["prefixCls", "className", "maxSize", "onComplete", "onStart", "onTimeOut", "typeName", "children", "accept", "multiple", "showUploadList", "type"]);
var uploadList = this.state.uploadList;
return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
className: (0, _classnames.default)(prefixCls, className)
}, attr), /*#__PURE__*/_react.default.createElement("input", {
type: "file",
hidden: true,
multiple: multiple,
accept: accept,
ref: this.fileRef,
onChange: this.onSelect
}), /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-inner")),
onClick: this._onSelect
}, children), showUploadList && /*#__PURE__*/_react.default.createElement("ul", {
className: (0, _classnames.default)("".concat(prefixCls, "-upload-list"))
}, uploadList.map(function (_ref2, index) {
var name = _ref2.name,
size = _ref2.size,
progress = _ref2.progress,
status = _ref2.status,
cover = _ref2.cover;
var hasCover = type === uploadImageType && cover;
return /*#__PURE__*/_react.default.createElement("li", {
key: index,
className: (0, _classnames.default)("".concat(prefixCls, "-upload-item"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-upload-item-has-cover"), hasCover))
}, hasCover && /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-upload-item-cover")),
onClick: _this2.onPreviewCover(cover),
style: {
backgroundImage: "url(".concat(cover, ")")
}
}), /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-upload-item-content"))
}, /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-upload-item-file-info"))
}, /*#__PURE__*/_react.default.createElement("span", null, name), /*#__PURE__*/_react.default.createElement("span", null, "/"), /*#__PURE__*/_react.default.createElement("span", null, (0, _utils.formatFileSize)(size))), /*#__PURE__*/_react.default.createElement(_progress.default, {
percent: progress,
type: status,
className: "".concat(prefixCls, "-upload-item-progress")
})));
})));
}
}]);
return Upload;
}(_react.Component);
(0, _defineProperty2.default)(Upload, "defaultProps", {
prefixCls: "deer-ui-upload",
multiple: false,
//是否允许多选
maxSize: 1024,
//上传文件大小限制
onSelect: function onSelect() {},
onComplete: function onComplete() {},
onStart: function onStart() {},
onTimeOut: function onTimeOut() {},
onError: function onError() {},
name: "file",
showUploadList: true,
typeName: uploadFileTypeNames[uploadFileType],
type: uploadFileType //上传的文件类型 图片 还是 文件
});
(0, _defineProperty2.default)(Upload, "propTypes", {
prefixCls: _propTypes.default.string.isRequired,
multiple: _propTypes.default.bool,
maxSize: _propTypes.default.number,
onComplete: _propTypes.default.func,
onSelect: _propTypes.default.func,
onStart: _propTypes.default.func,
onTimeOut: _propTypes.default.func,
onError: _propTypes.default.func,
name: _propTypes.default.string,
showUploadList: _propTypes.default.bool
});
var _default = Upload;
exports.default = _default;