antd
Version:
An enterprise-class UI design language and React components implementation
361 lines (296 loc) • 11.8 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var React = _interopRequireWildcard(require("react"));
var _rcUpload = _interopRequireDefault(require("rc-upload"));
var _classnames = _interopRequireDefault(require("classnames"));
var _Dragger = _interopRequireDefault(require("./Dragger"));
var _UploadList = _interopRequireDefault(require("./UploadList"));
var _utils = require("./utils");
var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver"));
var _default2 = _interopRequireDefault(require("../locale/default"));
var _configProvider = require("../config-provider");
var _devWarning = _interopRequireDefault(require("../_util/devWarning"));
var _useForceUpdate = _interopRequireDefault(require("../_util/hooks/useForceUpdate"));
var _useFreshState3 = _interopRequireDefault(require("./useFreshState"));
var InternalUpload = function InternalUpload(props, ref) {
var _classNames2;
var fileListProp = props.fileList,
defaultFileList = props.defaultFileList,
onRemove = props.onRemove,
showUploadList = props.showUploadList,
listType = props.listType,
onPreview = props.onPreview,
onDownload = props.onDownload,
previewFile = props.previewFile,
disabled = props.disabled,
propLocale = props.locale,
iconRender = props.iconRender,
isImageUrl = props.isImageUrl,
progress = props.progress,
customizePrefixCls = props.prefixCls,
className = props.className,
type = props.type,
children = props.children,
style = props.style,
itemRender = props.itemRender;
var _React$useState = React.useState('drop'),
_React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2),
dragState = _React$useState2[0],
setDragState = _React$useState2[1];
var forceUpdate = (0, _useForceUpdate["default"])(); // Refresh always use fresh data
var _useFreshState = (0, _useFreshState3["default"])(fileListProp || defaultFileList || [], fileListProp),
_useFreshState2 = (0, _slicedToArray2["default"])(_useFreshState, 2),
getFileList = _useFreshState2[0],
setFileList = _useFreshState2[1];
var upload = React.useRef();
React.useEffect(function () {
(0, _devWarning["default"])('fileList' in props || !('value' in props), 'Upload', '`value` is not a valid prop, do you mean `fileList`?');
}, []);
var onChange = function onChange(info) {
setFileList(info.fileList);
var onChangeProp = props.onChange;
if (onChangeProp) {
onChangeProp((0, _extends2["default"])((0, _extends2["default"])({}, info), {
fileList: (0, _toConsumableArray2["default"])(info.fileList)
}));
}
};
var onStart = function onStart(file) {
var targetItem = (0, _utils.fileToObject)(file);
targetItem.status = 'uploading';
var nextFileList = getFileList().concat();
var fileIndex = nextFileList.findIndex(function (_ref) {
var uid = _ref.uid;
return uid === targetItem.uid;
});
if (fileIndex === -1) {
nextFileList.push(targetItem);
} else {
nextFileList[fileIndex] = targetItem;
}
onChange({
file: targetItem,
fileList: nextFileList
});
};
var onSuccess = function onSuccess(response, file, xhr) {
try {
if (typeof response === 'string') {
response = JSON.parse(response);
}
} catch (e) {
/* do nothing */
}
var targetItem = (0, _utils.getFileItem)(file, getFileList()); // removed
if (!targetItem) {
return;
}
targetItem.status = 'done';
targetItem.response = response;
targetItem.xhr = xhr;
onChange({
file: (0, _extends2["default"])({}, targetItem),
fileList: getFileList().concat()
});
};
var onProgress = function onProgress(e, file) {
var targetItem = (0, _utils.getFileItem)(file, getFileList()); // removed
if (!targetItem) {
return;
}
targetItem.percent = e.percent;
onChange({
event: e,
file: (0, _extends2["default"])({}, targetItem),
fileList: getFileList().concat()
});
};
var onError = function onError(error, response, file) {
var targetItem = (0, _utils.getFileItem)(file, getFileList()); // removed
if (!targetItem) {
return;
}
targetItem.error = error;
targetItem.response = response;
targetItem.status = 'error';
onChange({
file: (0, _extends2["default"])({}, targetItem),
fileList: getFileList().concat()
});
};
var handleRemove = function handleRemove(file) {
Promise.resolve(typeof onRemove === 'function' ? onRemove(file) : onRemove).then(function (ret) {
// Prevent removing file
if (ret === false) {
return;
}
var removedFileList = (0, _utils.removeFileItem)(file, getFileList());
if (removedFileList) {
file.status = 'removed';
if (upload.current) {
upload.current.abort(file);
}
onChange({
file: file,
fileList: removedFileList
});
}
});
};
var onFileDrop = function onFileDrop(e) {
setDragState(e.type);
};
var beforeUpload = function beforeUpload(file, fileListArgs) {
var beforeUploadProp = props.beforeUpload;
if (!beforeUploadProp) {
return true;
}
var result = beforeUploadProp(file, fileListArgs);
if (result === false) {
// Get unique file list
var uniqueList = [];
getFileList().concat(fileListArgs.map(_utils.fileToObject)).forEach(function (f) {
if (uniqueList.every(function (uf) {
return uf.uid !== f.uid;
})) {
uniqueList.push(f);
}
});
onChange({
file: file,
fileList: uniqueList
});
return false;
}
if (result && result.then) {
return result;
}
return true;
}; // Test needs
React.useImperativeHandle(ref, function () {
return {
onStart: onStart,
onSuccess: onSuccess,
onProgress: onProgress,
onError: onError,
fileList: getFileList(),
upload: upload.current,
forceUpdate: forceUpdate
};
});
var _React$useContext = React.useContext(_configProvider.ConfigContext),
getPrefixCls = _React$useContext.getPrefixCls,
direction = _React$useContext.direction;
var prefixCls = getPrefixCls('upload', customizePrefixCls);
var rcUploadProps = (0, _extends2["default"])((0, _extends2["default"])({
onStart: onStart,
onError: onError,
onProgress: onProgress,
onSuccess: onSuccess
}, props), {
prefixCls: prefixCls,
beforeUpload: beforeUpload
});
delete rcUploadProps.className;
delete rcUploadProps.style; // Remove id to avoid open by label when trigger is hidden
// !children: https://github.com/ant-design/ant-design/issues/14298
// disabled: https://github.com/ant-design/ant-design/issues/16478
// https://github.com/ant-design/ant-design/issues/24197
if (!children || disabled) {
delete rcUploadProps.id;
}
var renderUploadList = function renderUploadList(button) {
return showUploadList ? /*#__PURE__*/React.createElement(_LocaleReceiver["default"], {
componentName: "Upload",
defaultLocale: _default2["default"].Upload
}, function (locale) {
var _ref2 = typeof showUploadList === 'boolean' ? {} : showUploadList,
showRemoveIcon = _ref2.showRemoveIcon,
showPreviewIcon = _ref2.showPreviewIcon,
showDownloadIcon = _ref2.showDownloadIcon,
removeIcon = _ref2.removeIcon,
downloadIcon = _ref2.downloadIcon;
return /*#__PURE__*/React.createElement(_UploadList["default"], {
listType: listType,
items: getFileList(true),
previewFile: previewFile,
onPreview: onPreview,
onDownload: onDownload,
onRemove: handleRemove,
showRemoveIcon: !disabled && showRemoveIcon,
showPreviewIcon: showPreviewIcon,
showDownloadIcon: showDownloadIcon,
removeIcon: removeIcon,
downloadIcon: downloadIcon,
iconRender: iconRender,
locale: (0, _extends2["default"])((0, _extends2["default"])({}, locale), propLocale),
isImageUrl: isImageUrl,
progress: progress,
appendAction: button,
itemRender: itemRender
});
}) : button;
};
if (type === 'drag') {
var _classNames;
var dragCls = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-drag"), true), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-drag-uploading"), getFileList().some(function (file) {
return file.status === 'uploading';
})), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-drag-hover"), dragState === 'dragover'), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2["default"])(_classNames, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames), className);
return /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement("div", {
className: dragCls,
onDrop: onFileDrop,
onDragOver: onFileDrop,
onDragLeave: onFileDrop,
style: style
}, /*#__PURE__*/React.createElement(_rcUpload["default"], (0, _extends2["default"])({}, rcUploadProps, {
ref: upload,
className: "".concat(prefixCls, "-btn")
}), /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-drag-container")
}, children))), renderUploadList());
}
var uploadButtonCls = (0, _classnames["default"])(prefixCls, (_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-select"), true), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-select-").concat(listType), true), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-rtl"), direction === 'rtl'), _classNames2));
var uploadButton = /*#__PURE__*/React.createElement("div", {
className: uploadButtonCls,
style: children ? undefined : {
display: 'none'
}
}, /*#__PURE__*/React.createElement(_rcUpload["default"], (0, _extends2["default"])({}, rcUploadProps, {
ref: upload
})));
if (listType === 'picture-card') {
return /*#__PURE__*/React.createElement("span", {
className: (0, _classnames["default"])("".concat(prefixCls, "-picture-card-wrapper"), className)
}, renderUploadList(uploadButton));
}
return /*#__PURE__*/React.createElement("span", {
className: className
}, uploadButton, renderUploadList());
};
var Upload = /*#__PURE__*/React.forwardRef(InternalUpload);
Upload.Dragger = _Dragger["default"];
Upload.displayName = 'Upload';
Upload.defaultProps = {
type: 'select',
multiple: false,
action: '',
data: {},
accept: '',
beforeUpload: _utils.T,
showUploadList: true,
listType: 'text',
className: '',
disabled: false,
supportServerRender: true
};
var _default = Upload;
exports["default"] = _default;