1 | "use strict";
|
2 |
|
3 | var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
|
4 | var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
5 | Object.defineProperty(exports, "__esModule", {
|
6 | value: true
|
7 | });
|
8 | exports["default"] = exports.LIST_IGNORE = void 0;
|
9 | var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
10 | var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
11 | var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
|
12 | var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
13 | var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
14 | var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
15 | var _classnames = _interopRequireDefault(require("classnames"));
|
16 | var _rcUpload = _interopRequireDefault(require("rc-upload"));
|
17 | var _useMergedState3 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
|
18 | var React = _interopRequireWildcard(require("react"));
|
19 | var _reactDom = require("react-dom");
|
20 | var _configProvider = require("../config-provider");
|
21 | var _DisabledContext = _interopRequireDefault(require("../config-provider/DisabledContext"));
|
22 | var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver"));
|
23 | var _en_US = _interopRequireDefault(require("../locale/en_US"));
|
24 | var _warning = _interopRequireDefault(require("../_util/warning"));
|
25 | var _UploadList = _interopRequireDefault(require("./UploadList"));
|
26 | var _utils = require("./utils");
|
27 | var _style = _interopRequireDefault(require("./style"));
|
28 | var __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 | };
|
55 | var LIST_IGNORE = "__LIST_IGNORE_" + Date.now() + "__";
|
56 | exports.LIST_IGNORE = LIST_IGNORE;
|
57 | var 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 |
|
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 |
|
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 |
|
124 | if (maxCount === 1) {
|
125 | cloneList = cloneList.slice(-1);
|
126 | } else if (maxCount) {
|
127 | cloneList = cloneList.slice(0, maxCount);
|
128 | }
|
129 |
|
130 |
|
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, (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 |
|
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 |
|
202 | var filteredFileInfoList = batchFileInfoList.filter(function (info) {
|
203 | return !info.file[LIST_IGNORE];
|
204 | });
|
205 |
|
206 | if (!filteredFileInfoList.length) {
|
207 | return;
|
208 | }
|
209 | var objectFileList = filteredFileInfoList.map(function (info) {
|
210 | return (0, _utils.file2Obj)(info.file);
|
211 | });
|
212 |
|
213 | var newFileList = (0, _toConsumableArray2["default"])(mergedFileList);
|
214 | objectFileList.forEach(function (fileObj) {
|
215 |
|
216 | newFileList = (0, _utils.updateFileList)(fileObj, newFileList);
|
217 | });
|
218 | objectFileList.forEach(function (fileObj, index) {
|
219 |
|
220 | var triggerFileObj = fileObj;
|
221 | if (!filteredFileInfoList[index].parsedFile) {
|
222 |
|
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 |
|
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 |
|
253 | }
|
254 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
353 |
|
354 |
|
355 |
|
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 ? 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 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( React.createElement("span", {
|
406 | className: (0, _classnames["default"])(prefixCls + "-wrapper", rtlCls, className, hashId)
|
407 | }, React.createElement("div", {
|
408 | className: dragCls,
|
409 | onDrop: onFileDrop,
|
410 | onDragOver: onFileDrop,
|
411 | onDragLeave: onFileDrop,
|
412 | style: style
|
413 | }, React.createElement(_rcUpload["default"], (0, _extends2["default"])({}, rcUploadProps, {
|
414 | ref: upload,
|
415 | className: prefixCls + "-btn"
|
416 | }), 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 React.createElement("div", {
|
423 | className: uploadButtonCls,
|
424 | style: uploadButtonStyle
|
425 | }, 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( 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( React.createElement("span", {
|
438 | className: (0, _classnames["default"])(prefixCls + "-wrapper", rtlCls, className, hashId)
|
439 | }, uploadButton, renderUploadList()));
|
440 | };
|
441 | var Upload = React.forwardRef(InternalUpload);
|
442 | if (process.env.NODE_ENV !== 'production') {
|
443 | Upload.displayName = 'Upload';
|
444 | }
|
445 | var _default = Upload;
|
446 | exports["default"] = _default; |
\ | No newline at end of file |