UNPKG

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