UNPKG

rsuite

Version:

A suite of react components

314 lines (259 loc) 10.2 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = exports.formatSize = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _Attachment = _interopRequireDefault(require("@rsuite/icons/legacy/Attachment")); var _Reload = _interopRequireDefault(require("@rsuite/icons/Reload")); var _utils = require("../utils"); var _CloseButton = _interopRequireDefault(require("../CloseButton")); /** * Format display file size * @param size */ var formatSize = function formatSize(size) { if (size === void 0) { size = 0; } var K = 1024; var M = 1024 * 1024; var G = 1024 * 1024 * 1024; if (size > G) { return (size / G).toFixed(2) + "GB"; } if (size > M) { return (size / M).toFixed(2) + "MB"; } if (size > K) { return (size / K).toFixed(2) + "KB"; } return size + "B"; }; exports.formatSize = formatSize; var UploadFileItem = /*#__PURE__*/_react.default.forwardRef(function (props, ref) { var _props$as = props.as, Component = _props$as === void 0 ? 'div' : _props$as, disabled = props.disabled, _props$allowReupload = props.allowReupload, allowReupload = _props$allowReupload === void 0 ? true : _props$allowReupload, file = props.file, _props$classPrefix = props.classPrefix, classPrefix = _props$classPrefix === void 0 ? 'uploader-file-item' : _props$classPrefix, _props$listType = props.listType, listType = _props$listType === void 0 ? 'text' : _props$listType, className = props.className, _props$removable = props.removable, removable = _props$removable === void 0 ? true : _props$removable, _props$maxPreviewFile = props.maxPreviewFileSize, maxPreviewFileSize = _props$maxPreviewFile === void 0 ? 1024 * 1024 * 5 : _props$maxPreviewFile, locale = props.locale, renderFileInfo = props.renderFileInfo, renderThumbnail = props.renderThumbnail, onPreview = props.onPreview, onCancel = props.onCancel, onReupload = props.onReupload, rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "disabled", "allowReupload", "file", "classPrefix", "listType", "className", "removable", "maxPreviewFileSize", "locale", "renderFileInfo", "renderThumbnail", "onPreview", "onCancel", "onReupload"]); var _useClassNames = (0, _utils.useClassNames)(classPrefix), merge = _useClassNames.merge, withClassPrefix = _useClassNames.withClassPrefix, prefix = _useClassNames.prefix; var classes = merge(className, withClassPrefix(listType, { disabled: disabled, 'has-error': file.status === 'error' })); var _useState = (0, _react.useState)(file.url ? file.url : null), previewImage = _useState[0], setPreviewImage = _useState[1]; /** * Get thumbnail of image file */ var getThumbnail = (0, _react.useCallback)(function (callback) { var _file$blobFile; if (!~['picture-text', 'picture'].indexOf(listType)) { return; } // The thumbnail file size cannot be larger than the preset value. if (!file.blobFile || (file === null || file === void 0 ? void 0 : (_file$blobFile = file.blobFile) === null || _file$blobFile === void 0 ? void 0 : _file$blobFile.size) > maxPreviewFileSize) { return; } (0, _utils.previewFile)(file.blobFile, callback); }, [file, listType, maxPreviewFileSize]); (0, _react.useEffect)(function () { if (!file.url) { getThumbnail(function (previewImage) { setPreviewImage(previewImage); }); } }, [file.url, getThumbnail]); var handlePreview = (0, _react.useCallback)(function (event) { if (disabled) { return; } onPreview === null || onPreview === void 0 ? void 0 : onPreview(file, event); }, [disabled, file, onPreview]); var handleRemove = (0, _react.useCallback)(function (event) { if (disabled) { return; } onCancel === null || onCancel === void 0 ? void 0 : onCancel(file.fileKey, event); }, [disabled, file.fileKey, onCancel]); var handleReupload = (0, _react.useCallback)(function (event) { if (disabled) { return; } onReupload === null || onReupload === void 0 ? void 0 : onReupload(file, event); }, [disabled, file, onReupload]); /** * Rendering progress bar */ var renderProgressBar = function renderProgressBar() { var _file$progress = file.progress, progress = _file$progress === void 0 ? 0 : _file$progress, status = file.status; var show = !disabled && status === 'uploading'; var visibility = show ? 'visible' : 'hidden'; var wrapStyle = { visibility: visibility }; var progressbarStyle = { width: progress + "%" }; return /*#__PURE__*/_react.default.createElement("div", { className: prefix('progress'), style: wrapStyle }, /*#__PURE__*/_react.default.createElement("div", { className: prefix('progress-bar'), style: progressbarStyle })); }; var renderPreview = function renderPreview() { var thumbnail = previewImage ? /*#__PURE__*/_react.default.createElement("img", { role: "presentation", src: previewImage, alt: file.name, onClick: handlePreview }) : /*#__PURE__*/_react.default.createElement(_Attachment.default, { className: prefix('icon') }); return /*#__PURE__*/_react.default.createElement("div", { className: prefix('preview') }, renderThumbnail ? renderThumbnail(file, thumbnail) : thumbnail); }; /** * Render the loading state. */ var renderIcon = function renderIcon() { var uploading = file.status === 'uploading'; var classes = prefix('icon-wrapper', { 'icon-loading': uploading }); if (uploading) { return /*#__PURE__*/_react.default.createElement("div", { className: classes }, /*#__PURE__*/_react.default.createElement("i", { className: prefix('icon') })); } if (listType === 'picture' || listType === 'picture-text') { return null; } return /*#__PURE__*/_react.default.createElement("div", { className: classes }, /*#__PURE__*/_react.default.createElement(_Attachment.default, { className: prefix('icon') })); }; /** * Render the remove file button. */ var renderRemoveButton = function renderRemoveButton() { if (!removable) { return null; } return /*#__PURE__*/_react.default.createElement(_CloseButton.default, { className: prefix('btn-remove'), onClick: handleRemove }); }; /** * Render error messages. */ var renderErrorStatus = function renderErrorStatus() { if (file.status === 'error') { return /*#__PURE__*/_react.default.createElement("div", { className: prefix('status') }, /*#__PURE__*/_react.default.createElement("span", null, locale === null || locale === void 0 ? void 0 : locale.error), allowReupload && /*#__PURE__*/_react.default.createElement("a", { role: "button", tabIndex: -1, onClick: handleReupload }, /*#__PURE__*/_react.default.createElement(_Reload.default, { className: prefix('icon-reupload') }))); } return null; }; /** * Render file size. */ var renderFileSize = function renderFileSize() { if (file.status !== 'error' && file.blobFile) { var _file$blobFile2; return /*#__PURE__*/_react.default.createElement("span", { className: prefix('size') }, formatSize(file === null || file === void 0 ? void 0 : (_file$blobFile2 = file.blobFile) === null || _file$blobFile2 === void 0 ? void 0 : _file$blobFile2.size)); } return null; }; /** * Render file panel */ var renderFilePanel = function renderFilePanel() { var fileElement = /*#__PURE__*/_react.default.createElement("div", { className: prefix('title'), onClick: handlePreview }, file.name); return /*#__PURE__*/_react.default.createElement("div", { className: prefix('panel') }, /*#__PURE__*/_react.default.createElement("div", { className: prefix('content') }, renderFileInfo ? renderFileInfo(file, fileElement) : fileElement, renderErrorStatus(), renderFileSize())); }; if (listType === 'picture') { return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, rest, { ref: ref, className: classes }), renderIcon(), renderPreview(), renderErrorStatus(), renderRemoveButton()); } if (listType === 'picture-text') { return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, rest, { ref: ref, className: classes }), renderIcon(), renderPreview(), renderFilePanel(), renderProgressBar(), renderRemoveButton()); } return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, rest, { ref: ref, className: classes }), renderIcon(), renderFilePanel(), renderProgressBar(), renderRemoveButton()); }); UploadFileItem.displayName = 'UploadFileItem'; UploadFileItem.propTypes = { locale: _propTypes.default.any, file: _propTypes.default.object.isRequired, listType: _propTypes.default.oneOf(['text', 'picture-text', 'picture']), disabled: _propTypes.default.bool, className: _propTypes.default.string, maxPreviewFileSize: _propTypes.default.number, classPrefix: _propTypes.default.string, removable: _propTypes.default.bool, allowReupload: _propTypes.default.bool, renderFileInfo: _propTypes.default.func, renderThumbnail: _propTypes.default.func, onCancel: _propTypes.default.func, onPreview: _propTypes.default.func, onReupload: _propTypes.default.func }; var _default = UploadFileItem; exports.default = _default;