UNPKG

18.5 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
4var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports["default"] = exports.LIST_IGNORE = void 0;
9var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
12var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
13var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
14var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15var _classnames = _interopRequireDefault(require("classnames"));
16var _rcUpload = _interopRequireDefault(require("rc-upload"));
17var _useMergedState3 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
18var React = _interopRequireWildcard(require("react"));
19var _reactDom = require("react-dom");
20var _configProvider = require("../config-provider");
21var _DisabledContext = _interopRequireDefault(require("../config-provider/DisabledContext"));
22var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver"));
23var _en_US = _interopRequireDefault(require("../locale/en_US"));
24var _warning = _interopRequireDefault(require("../_util/warning"));
25var _UploadList = _interopRequireDefault(require("./UploadList"));
26var _utils = require("./utils");
27var _style = _interopRequireDefault(require("./style"));
28var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) {
29 function adopt(value) {
30 return value instanceof P ? value : new P(function (resolve) {
31 resolve(value);
32 });
33 }
34 return new (P || (P = Promise))(function (resolve, reject) {
35 function fulfilled(value) {
36 try {
37 step(generator.next(value));
38 } catch (e) {
39 reject(e);
40 }
41 }
42 function rejected(value) {
43 try {
44 step(generator["throw"](value));
45 } catch (e) {
46 reject(e);
47 }
48 }
49 function step(result) {
50 result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
51 }
52 step((generator = generator.apply(thisArg, _arguments || [])).next());
53 });
54};
55var LIST_IGNORE = "__LIST_IGNORE_" + Date.now() + "__";
56exports.LIST_IGNORE = LIST_IGNORE;
57var InternalUpload = function InternalUpload(props, ref) {
58 var fileList = props.fileList,
59 defaultFileList = props.defaultFileList,
60 onRemove = props.onRemove,
61 _props$showUploadList = props.showUploadList,
62 showUploadList = _props$showUploadList === void 0 ? true : _props$showUploadList,
63 _props$listType = props.listType,
64 listType = _props$listType === void 0 ? 'text' : _props$listType,
65 onPreview = props.onPreview,
66 onDownload = props.onDownload,
67 onChange = props.onChange,
68 onDrop = props.onDrop,
69 previewFile = props.previewFile,
70 customDisabled = props.disabled,
71 propLocale = props.locale,
72 iconRender = props.iconRender,
73 isImageUrl = props.isImageUrl,
74 progress = props.progress,
75 customizePrefixCls = props.prefixCls,
76 className = props.className,
77 _props$type = props.type,
78 type = _props$type === void 0 ? 'select' : _props$type,
79 children = props.children,
80 style = props.style,
81 itemRender = props.itemRender,
82 maxCount = props.maxCount,
83 _props$data = props.data,
84 data = _props$data === void 0 ? {} : _props$data,
85 _props$multiple = props.multiple,
86 multiple = _props$multiple === void 0 ? false : _props$multiple,
87 _props$action = props.action,
88 action = _props$action === void 0 ? '' : _props$action,
89 _props$accept = props.accept,
90 accept = _props$accept === void 0 ? '' : _props$accept,
91 _props$supportServerR = props.supportServerRender,
92 supportServerRender = _props$supportServerR === void 0 ? true : _props$supportServerR;
93 // ===================== Disabled =====================
94 var disabled = React.useContext(_DisabledContext["default"]);
95 var mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled;
96 var _useMergedState = (0, _useMergedState3["default"])(defaultFileList || [], {
97 value: fileList,
98 postState: function postState(list) {
99 return list !== null && list !== void 0 ? list : [];
100 }
101 }),
102 _useMergedState2 = (0, _slicedToArray2["default"])(_useMergedState, 2),
103 mergedFileList = _useMergedState2[0],
104 setMergedFileList = _useMergedState2[1];
105 var _React$useState = React.useState('drop'),
106 _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2),
107 dragState = _React$useState2[0],
108 setDragState = _React$useState2[1];
109 var upload = React.useRef(null);
110 process.env.NODE_ENV !== "production" ? (0, _warning["default"])('fileList' in props || !('value' in props), 'Upload', '`value` is not a valid prop, do you mean `fileList`?') : void 0;
111 process.env.NODE_ENV !== "production" ? (0, _warning["default"])(!('transformFile' in props), 'Upload', '`transformFile` is deprecated. Please use `beforeUpload` directly.') : void 0;
112 // Control mode will auto fill file uid if not provided
113 React.useMemo(function () {
114 var timestamp = Date.now();
115 (fileList || []).forEach(function (file, index) {
116 if (!file.uid && !Object.isFrozen(file)) {
117 file.uid = "__AUTO__" + timestamp + "_" + index + "__";
118 }
119 });
120 }, [fileList]);
121 var onInternalChange = function onInternalChange(file, changedFileList, event) {
122 var cloneList = (0, _toConsumableArray2["default"])(changedFileList);
123 // Cut to match count
124 if (maxCount === 1) {
125 cloneList = cloneList.slice(-1);
126 } else if (maxCount) {
127 cloneList = cloneList.slice(0, maxCount);
128 }
129 // Prevent React18 auto batch since input[upload] trigger process at same time
130 // which makes fileList closure problem
131 (0, _reactDom.flushSync)(function () {
132 setMergedFileList(cloneList);
133 });
134 var changeInfo = {
135 file: file,
136 fileList: cloneList
137 };
138 if (event) {
139 changeInfo.event = event;
140 }
141 onChange === null || onChange === void 0 ? void 0 : onChange(changeInfo);
142 };
143 var mergedBeforeUpload = function mergedBeforeUpload(file, fileListArgs) {
144 return __awaiter(void 0, void 0, void 0, /*#__PURE__*/(0, _regeneratorRuntime2["default"])().mark(function _callee() {
145 var beforeUpload, transformFile, parsedFile, result;
146 return (0, _regeneratorRuntime2["default"])().wrap(function _callee$(_context) {
147 while (1) {
148 switch (_context.prev = _context.next) {
149 case 0:
150 beforeUpload = props.beforeUpload, transformFile = props.transformFile;
151 parsedFile = file;
152 if (!beforeUpload) {
153 _context.next = 13;
154 break;
155 }
156 _context.next = 5;
157 return beforeUpload(file, fileListArgs);
158 case 5:
159 result = _context.sent;
160 if (!(result === false)) {
161 _context.next = 8;
162 break;
163 }
164 return _context.abrupt("return", false);
165 case 8:
166 // Hack for LIST_IGNORE, we add additional info to remove from the list
167 delete file[LIST_IGNORE];
168 if (!(result === LIST_IGNORE)) {
169 _context.next = 12;
170 break;
171 }
172 Object.defineProperty(file, LIST_IGNORE, {
173 value: true,
174 configurable: true
175 });
176 return _context.abrupt("return", false);
177 case 12:
178 if ((0, _typeof2["default"])(result) === 'object' && result) {
179 parsedFile = result;
180 }
181 case 13:
182 if (!transformFile) {
183 _context.next = 17;
184 break;
185 }
186 _context.next = 16;
187 return transformFile(parsedFile);
188 case 16:
189 parsedFile = _context.sent;
190 case 17:
191 return _context.abrupt("return", parsedFile);
192 case 18:
193 case "end":
194 return _context.stop();
195 }
196 }
197 }, _callee);
198 }));
199 };
200 var onBatchStart = function onBatchStart(batchFileInfoList) {
201 // Skip file which marked as `LIST_IGNORE`, these file will not add to file list
202 var filteredFileInfoList = batchFileInfoList.filter(function (info) {
203 return !info.file[LIST_IGNORE];
204 });
205 // Nothing to do since no file need upload
206 if (!filteredFileInfoList.length) {
207 return;
208 }
209 var objectFileList = filteredFileInfoList.map(function (info) {
210 return (0, _utils.file2Obj)(info.file);
211 });
212 // Concat new files with prev files
213 var newFileList = (0, _toConsumableArray2["default"])(mergedFileList);
214 objectFileList.forEach(function (fileObj) {
215 // Replace file if exist
216 newFileList = (0, _utils.updateFileList)(fileObj, newFileList);
217 });
218 objectFileList.forEach(function (fileObj, index) {
219 // Repeat trigger `onChange` event for compatible
220 var triggerFileObj = fileObj;
221 if (!filteredFileInfoList[index].parsedFile) {
222 // `beforeUpload` return false
223 var originFileObj = fileObj.originFileObj;
224 var clone;
225 try {
226 clone = new File([originFileObj], originFileObj.name, {
227 type: originFileObj.type
228 });
229 } catch (e) {
230 clone = new Blob([originFileObj], {
231 type: originFileObj.type
232 });
233 clone.name = originFileObj.name;
234 clone.lastModifiedDate = new Date();
235 clone.lastModified = new Date().getTime();
236 }
237 clone.uid = fileObj.uid;
238 triggerFileObj = clone;
239 } else {
240 // Inject `uploading` status
241 fileObj.status = 'uploading';
242 }
243 onInternalChange(triggerFileObj, newFileList);
244 });
245 };
246 var onSuccess = function onSuccess(response, file, xhr) {
247 try {
248 if (typeof response === 'string') {
249 response = JSON.parse(response);
250 }
251 } catch (e) {
252 /* do nothing */
253 }
254 // removed
255 if (!(0, _utils.getFileItem)(file, mergedFileList)) {
256 return;
257 }
258 var targetItem = (0, _utils.file2Obj)(file);
259 targetItem.status = 'done';
260 targetItem.percent = 100;
261 targetItem.response = response;
262 targetItem.xhr = xhr;
263 var nextFileList = (0, _utils.updateFileList)(targetItem, mergedFileList);
264 onInternalChange(targetItem, nextFileList);
265 };
266 var onProgress = function onProgress(e, file) {
267 // removed
268 if (!(0, _utils.getFileItem)(file, mergedFileList)) {
269 return;
270 }
271 var targetItem = (0, _utils.file2Obj)(file);
272 targetItem.status = 'uploading';
273 targetItem.percent = e.percent;
274 var nextFileList = (0, _utils.updateFileList)(targetItem, mergedFileList);
275 onInternalChange(targetItem, nextFileList, e);
276 };
277 var onError = function onError(error, response, file) {
278 // removed
279 if (!(0, _utils.getFileItem)(file, mergedFileList)) {
280 return;
281 }
282 var targetItem = (0, _utils.file2Obj)(file);
283 targetItem.error = error;
284 targetItem.response = response;
285 targetItem.status = 'error';
286 var nextFileList = (0, _utils.updateFileList)(targetItem, mergedFileList);
287 onInternalChange(targetItem, nextFileList);
288 };
289 var handleRemove = function handleRemove(file) {
290 var currentFile;
291 Promise.resolve(typeof onRemove === 'function' ? onRemove(file) : onRemove).then(function (ret) {
292 var _a;
293 // Prevent removing file
294 if (ret === false) {
295 return;
296 }
297 var removedFileList = (0, _utils.removeFileItem)(file, mergedFileList);
298 if (removedFileList) {
299 currentFile = (0, _extends2["default"])((0, _extends2["default"])({}, file), {
300 status: 'removed'
301 });
302 mergedFileList === null || mergedFileList === void 0 ? void 0 : mergedFileList.forEach(function (item) {
303 var matchKey = currentFile.uid !== undefined ? 'uid' : 'name';
304 if (item[matchKey] === currentFile[matchKey] && !Object.isFrozen(item)) {
305 item.status = 'removed';
306 }
307 });
308 (_a = upload.current) === null || _a === void 0 ? void 0 : _a.abort(currentFile);
309 onInternalChange(currentFile, removedFileList);
310 }
311 });
312 };
313 var onFileDrop = function onFileDrop(e) {
314 setDragState(e.type);
315 if (e.type === 'drop') {
316 onDrop === null || onDrop === void 0 ? void 0 : onDrop(e);
317 }
318 };
319 // Test needs
320 React.useImperativeHandle(ref, function () {
321 return {
322 onBatchStart: onBatchStart,
323 onSuccess: onSuccess,
324 onProgress: onProgress,
325 onError: onError,
326 fileList: mergedFileList,
327 upload: upload.current
328 };
329 });
330 var _React$useContext = React.useContext(_configProvider.ConfigContext),
331 getPrefixCls = _React$useContext.getPrefixCls,
332 direction = _React$useContext.direction;
333 var prefixCls = getPrefixCls('upload', customizePrefixCls);
334 var rcUploadProps = (0, _extends2["default"])((0, _extends2["default"])({
335 onBatchStart: onBatchStart,
336 onError: onError,
337 onProgress: onProgress,
338 onSuccess: onSuccess
339 }, props), {
340 data: data,
341 multiple: multiple,
342 action: action,
343 accept: accept,
344 supportServerRender: supportServerRender,
345 prefixCls: prefixCls,
346 disabled: mergedDisabled,
347 beforeUpload: mergedBeforeUpload,
348 onChange: undefined
349 });
350 delete rcUploadProps.className;
351 delete rcUploadProps.style;
352 // Remove id to avoid open by label when trigger is hidden
353 // !children: https://github.com/ant-design/ant-design/issues/14298
354 // disabled: https://github.com/ant-design/ant-design/issues/16478
355 // https://github.com/ant-design/ant-design/issues/24197
356 if (!children || mergedDisabled) {
357 delete rcUploadProps.id;
358 }
359 var _useStyle = (0, _style["default"])(prefixCls),
360 _useStyle2 = (0, _slicedToArray2["default"])(_useStyle, 2),
361 wrapSSR = _useStyle2[0],
362 hashId = _useStyle2[1];
363 var renderUploadList = function renderUploadList(button, buttonVisible) {
364 return showUploadList ? /*#__PURE__*/React.createElement(_LocaleReceiver["default"], {
365 componentName: "Upload",
366 defaultLocale: _en_US["default"].Upload
367 }, function (contextLocale) {
368 var _ref = typeof showUploadList === 'boolean' ? {} : showUploadList,
369 showRemoveIcon = _ref.showRemoveIcon,
370 showPreviewIcon = _ref.showPreviewIcon,
371 showDownloadIcon = _ref.showDownloadIcon,
372 removeIcon = _ref.removeIcon,
373 previewIcon = _ref.previewIcon,
374 downloadIcon = _ref.downloadIcon;
375 return /*#__PURE__*/React.createElement(_UploadList["default"], {
376 prefixCls: prefixCls,
377 listType: listType,
378 items: mergedFileList,
379 previewFile: previewFile,
380 onPreview: onPreview,
381 onDownload: onDownload,
382 onRemove: handleRemove,
383 showRemoveIcon: !mergedDisabled && showRemoveIcon,
384 showPreviewIcon: showPreviewIcon,
385 showDownloadIcon: showDownloadIcon,
386 removeIcon: removeIcon,
387 previewIcon: previewIcon,
388 downloadIcon: downloadIcon,
389 iconRender: iconRender,
390 locale: (0, _extends2["default"])((0, _extends2["default"])({}, contextLocale), propLocale),
391 isImageUrl: isImageUrl,
392 progress: progress,
393 appendAction: button,
394 appendActionVisible: buttonVisible,
395 itemRender: itemRender
396 });
397 }) : button;
398 };
399 var rtlCls = (0, _defineProperty2["default"])({}, prefixCls + "-rtl", direction === 'rtl');
400 if (type === 'drag') {
401 var _classNames;
402 var dragCls = (0, _classnames["default"])(prefixCls, (_classNames = {}, (0, _defineProperty2["default"])(_classNames, prefixCls + "-drag", true), (0, _defineProperty2["default"])(_classNames, prefixCls + "-drag-uploading", mergedFileList.some(function (file) {
403 return file.status === 'uploading';
404 })), (0, _defineProperty2["default"])(_classNames, prefixCls + "-drag-hover", dragState === 'dragover'), (0, _defineProperty2["default"])(_classNames, prefixCls + "-disabled", mergedDisabled), (0, _defineProperty2["default"])(_classNames, prefixCls + "-rtl", direction === 'rtl'), _classNames), hashId);
405 return wrapSSR( /*#__PURE__*/React.createElement("span", {
406 className: (0, _classnames["default"])(prefixCls + "-wrapper", rtlCls, className, hashId)
407 }, /*#__PURE__*/React.createElement("div", {
408 className: dragCls,
409 onDrop: onFileDrop,
410 onDragOver: onFileDrop,
411 onDragLeave: onFileDrop,
412 style: style
413 }, /*#__PURE__*/React.createElement(_rcUpload["default"], (0, _extends2["default"])({}, rcUploadProps, {
414 ref: upload,
415 className: prefixCls + "-btn"
416 }), /*#__PURE__*/React.createElement("div", {
417 className: prefixCls + "-drag-container"
418 }, children))), renderUploadList()));
419 }
420 var uploadButtonCls = (0, _classnames["default"])(prefixCls, prefixCls + "-select", (0, _defineProperty2["default"])({}, prefixCls + "-disabled", mergedDisabled));
421 var renderUploadButton = function renderUploadButton(uploadButtonStyle) {
422 return /*#__PURE__*/React.createElement("div", {
423 className: uploadButtonCls,
424 style: uploadButtonStyle
425 }, /*#__PURE__*/React.createElement(_rcUpload["default"], (0, _extends2["default"])({}, rcUploadProps, {
426 ref: upload
427 })));
428 };
429 var uploadButton = renderUploadButton(children ? undefined : {
430 display: 'none'
431 });
432 if (listType === 'picture-card') {
433 return wrapSSR( /*#__PURE__*/React.createElement("span", {
434 className: (0, _classnames["default"])(prefixCls + "-wrapper", prefixCls + "-picture-card-wrapper", rtlCls, className, hashId)
435 }, renderUploadList(uploadButton, !!children)));
436 }
437 return wrapSSR( /*#__PURE__*/React.createElement("span", {
438 className: (0, _classnames["default"])(prefixCls + "-wrapper", rtlCls, className, hashId)
439 }, uploadButton, renderUploadList()));
440};
441var Upload = /*#__PURE__*/React.forwardRef(InternalUpload);
442if (process.env.NODE_ENV !== 'production') {
443 Upload.displayName = 'Upload';
444}
445var _default = Upload;
446exports["default"] = _default;
\No newline at end of file