UNPKG

rsuite

Version:

A suite of react components

412 lines (338 loc) 12.7 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = void 0; var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose")); var React = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _classnames = _interopRequireDefault(require("classnames")); var _lodash = _interopRequireDefault(require("lodash")); var _compose = _interopRequireDefault(require("recompose/compose")); var _IntlProvider = _interopRequireDefault(require("../IntlProvider")); var _withLocale = _interopRequireDefault(require("../IntlProvider/withLocale")); var _UploadFileItem = _interopRequireDefault(require("./UploadFileItem")); var _UploadTrigger = _interopRequireDefault(require("./UploadTrigger")); var _utils = require("../utils"); var _utils2 = require("./utils"); var Uploader = /*#__PURE__*/ function (_React$Component) { (0, _inheritsLoose2.default)(Uploader, _React$Component); function Uploader(props) { var _this; _this = _React$Component.call(this, props) || this; _this.inputRef = void 0; _this.handleRemoveFile = function (fileKey) { var _this$props = _this.props, onChange = _this$props.onChange, onRemove = _this$props.onRemove; var fileList = _this.getFileList(); var file = _lodash.default.find(fileList, function (f) { return f.fileKey === fileKey; }); var nextFileList = fileList.filter(function (f) { return f.fileKey !== fileKey; }); if (_this.xhrs[file.fileKey] && _this.xhrs[file.fileKey].readyState !== 4) { _this.xhrs[file.fileKey].abort(); } _this.setState({ fileList: nextFileList }); onRemove && onRemove(file); onChange && onChange(nextFileList); }; _this.handleUploadTriggerChange = function (event) { var _this$props2 = _this.props, autoUpload = _this$props2.autoUpload, shouldQueueUpdate = _this$props2.shouldQueueUpdate, onChange = _this$props2.onChange; var fileList = _this.getFileList(); var files = (0, _utils2.getFiles)(event); var newFileList = []; Array.from(files).forEach(function (file) { newFileList.push({ blobFile: file, name: file.name, status: 'inited', fileKey: (0, _utils2.guid)() }); }); var nextFileList = [].concat(fileList, newFileList); if (shouldQueueUpdate && shouldQueueUpdate(nextFileList, newFileList) === false) { _this.cleanInputValue(); return; } onChange && onChange(nextFileList); _this.setState({ fileList: nextFileList }, function () { autoUpload && _this.handleAjaxUpload(); }); }; _this.handleAjaxUploadSuccess = function (file, response, event) { var onSuccess = _this.props.onSuccess; var nextFile = (0, _extends2.default)({}, file, { status: 'finished', progress: 100 }); _this.updateFileList(nextFile, function () { onSuccess && onSuccess(response, nextFile, event); }); }; _this.handleAjaxUploadError = function (file, status, event) { var onError = _this.props.onError; var nextFile = (0, _extends2.default)({}, file, { status: 'error' }); _this.updateFileList(nextFile, function () { onError && onError(status, nextFile, event); }); }; _this.handleAjaxUploadProgress = function (file, percent, event) { var onProgress = _this.props.onProgress; var nextFile = (0, _extends2.default)({}, file, { status: 'uploading', progress: percent }); _this.updateFileList(nextFile, function () { onProgress && onProgress(percent, nextFile, event); }); }; _this.handleUploadFile = function (file) { var _this$props3 = _this.props, name = _this$props3.name, action = _this$props3.action, headers = _this$props3.headers, withCredentials = _this$props3.withCredentials, timeout = _this$props3.timeout, data = _this$props3.data, onUpload = _this$props3.onUpload; var xhr = (0, _utils.ajaxUpload)({ name: name, timeout: timeout, headers: headers, data: data, withCredentials: withCredentials, file: file.blobFile, url: action, onError: _this.handleAjaxUploadError.bind((0, _assertThisInitialized2.default)(_this), file), onSuccess: _this.handleAjaxUploadSuccess.bind((0, _assertThisInitialized2.default)(_this), file), onProgress: _this.handleAjaxUploadProgress.bind((0, _assertThisInitialized2.default)(_this), file) }); _this.updateFileList((0, _extends2.default)({}, file, { status: 'uploading' })); _this.xhrs[file.fileKey] = xhr; onUpload && onUpload(file); }; _this.handleReupload = function (file) { var _this$props4 = _this.props, onReupload = _this$props4.onReupload, autoUpload = _this$props4.autoUpload; autoUpload && _this.handleUploadFile(file); onReupload && onReupload(file); }; _this.createFile = function (file) { var fileKey = file.fileKey; return (0, _extends2.default)({}, file, { fileKey: fileKey || (0, _utils2.guid)(), progress: 0 }); }; _this.addPrefix = function (name) { return (0, _utils.prefix)(_this.props.classPrefix)(name); }; _this.progressTimer = void 0; _this.xhrs = {}; _this.uploadTrigger = null; var _props$defaultFileLis = props.defaultFileList, defaultFileList = _props$defaultFileLis === void 0 ? [] : _props$defaultFileLis; var _fileList = defaultFileList.map(_this.createFile); _this.state = { fileList: _fileList, fileMap: {} }; _this.inputRef = React.createRef(); return _this; } // public API var _proto = Uploader.prototype; _proto.start = function start(file) { if (file) { this.handleUploadFile(file); return; } this.handleAjaxUpload(); }; _proto.getFileList = function getFileList() { var fileList = this.props.fileList; var fileMap = this.state.fileMap; if (typeof fileList !== 'undefined') { return fileList.map(function (file) { return (0, _extends2.default)({}, file, {}, fileMap[file.fileKey]); }); } return this.state.fileList; }; _proto.cleanInputValue = function cleanInputValue() { if (this.inputRef.current) { this.inputRef.current.getInputInstance().value = ''; } }; _proto.handleAjaxUpload = function handleAjaxUpload() { var _this2 = this; var shouldUpload = this.props.shouldUpload; var fileList = this.getFileList(); fileList.forEach(function (file) { if (shouldUpload && shouldUpload(file) === false) { return; } if (file.status === 'inited') { _this2.handleUploadFile(file); } }); this.cleanInputValue(); }; _proto.updateFileList = function updateFileList(nextFile, callback) { var fileList = this.getFileList(); var nextFileList = fileList.map(function (file) { return file.fileKey === nextFile.fileKey ? nextFile : file; }); var nextState = { fileList: nextFileList }; if (nextFile.progress) { var fileMap = this.state.fileMap; fileMap[nextFile.fileKey] = { progress: nextFile.progress, status: nextFile.status }; nextState.fileMap = fileMap; } this.setState(nextState, callback); }; _proto.renderFileItems = function renderFileItems() { var _this3 = this; var _this$props5 = this.props, disabledFileItem = _this$props5.disabledFileItem, listType = _this$props5.listType, onPreview = _this$props5.onPreview, maxPreviewFileSize = _this$props5.maxPreviewFileSize, renderFileInfo = _this$props5.renderFileInfo, removable = _this$props5.removable; var fileList = this.getFileList(); return React.createElement("div", { key: "items", className: this.addPrefix('file-items') }, fileList.map(function (file, index) { return React.createElement(_UploadFileItem.default, { key: file.fileKey || index, file: file, maxPreviewFileSize: maxPreviewFileSize, listType: listType, disabled: disabledFileItem, onPreview: onPreview, onReupload: _this3.handleReupload, onCancel: _this3.handleRemoveFile, renderFileInfo: renderFileInfo, removable: removable }); })); }; _proto.renderUploadTrigger = function renderUploadTrigger() { var _this$props6 = this.props, name = _this$props6.name, multiple = _this$props6.multiple, disabled = _this$props6.disabled, accept = _this$props6.accept, children = _this$props6.children, toggleComponentClass = _this$props6.toggleComponentClass, rest = (0, _objectWithoutPropertiesLoose2.default)(_this$props6, ["name", "multiple", "disabled", "accept", "children", "toggleComponentClass"]); var unhandled = (0, _utils.getUnhandledProps)(Uploader, rest); return React.createElement(_UploadTrigger.default, (0, _extends2.default)({}, unhandled, { name: name, key: "trigger", multiple: multiple, disabled: disabled, accept: accept, ref: this.inputRef, onChange: this.handleUploadTriggerChange, componentClass: toggleComponentClass }), children); }; _proto.render = function render() { var _this$props7 = this.props, classPrefix = _this$props7.classPrefix, className = _this$props7.className, listType = _this$props7.listType, locale = _this$props7.locale, style = _this$props7.style; var classes = (0, _classnames.default)(classPrefix, this.addPrefix(listType), className); var renderList = [this.renderUploadTrigger(), this.renderFileItems()]; if (listType === 'picture') { renderList.reverse(); } return React.createElement(_IntlProvider.default, { locale: locale }, React.createElement("div", { className: classes, style: style }, renderList)); }; return Uploader; }(React.Component); Uploader.propTypes = { action: _propTypes.default.string, accept: _propTypes.default.string, autoUpload: _propTypes.default.bool, children: _propTypes.default.node, className: _propTypes.default.string, classPrefix: _propTypes.default.string, defaultFileList: _propTypes.default.array, fileList: _propTypes.default.array, data: _propTypes.default.object, multiple: _propTypes.default.bool, disabled: _propTypes.default.bool, disabledFileItem: _propTypes.default.bool, name: _propTypes.default.string, timeout: _propTypes.default.number, withCredentials: _propTypes.default.bool, headers: _propTypes.default.object, locale: _propTypes.default.object, listType: _propTypes.default.oneOf(['text', 'picture-text', 'picture']), shouldQueueUpdate: _propTypes.default.func, shouldUpload: _propTypes.default.func, onChange: _propTypes.default.func, onUpload: _propTypes.default.func, onReupload: _propTypes.default.func, onPreview: _propTypes.default.func, onError: _propTypes.default.func, onSuccess: _propTypes.default.func, onProgress: _propTypes.default.func, onRemove: _propTypes.default.func, maxPreviewFileSize: _propTypes.default.number, style: _propTypes.default.object, toggleComponentClass: _propTypes.default.elementType, renderFileInfo: _propTypes.default.func, removable: _propTypes.default.bool }; Uploader.defaultProps = { autoUpload: true, timeout: 0, name: 'file', multiple: false, disabled: false, withCredentials: false, data: {}, listType: 'text', removable: true }; var _default = (0, _compose.default)((0, _withLocale.default)(['Uploader']), (0, _utils.defaultProps)({ classPrefix: 'uploader' }))(Uploader); exports.default = _default; module.exports = exports.default;