index.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import { __assign, __awaiter, __generator, __spreadArray } from "tslib";
  2. import { UploaderDefaultProps } from './props';
  3. import { chooseImage } from '../_util/promisify';
  4. import createValue from '../mixins/value';
  5. import '../_util/assert-component2';
  6. Component({
  7. props: UploaderDefaultProps,
  8. mixins: [createValue({
  9. defaultValueKey: 'defaultFileList',
  10. valueKey: 'fileList',
  11. transformValue: function (fileList) {
  12. if (fileList === void 0) { fileList = []; }
  13. return {
  14. needUpdate: true,
  15. value: fileList.map(function (item) {
  16. var file = __assign({}, item);
  17. if (typeof item.url === 'undefined') {
  18. file.url = '';
  19. }
  20. if (typeof item.uid === 'undefined') {
  21. file.uid = String(Math.random());
  22. }
  23. if (typeof item.status === 'undefined') {
  24. item.status = 'done';
  25. }
  26. return file;
  27. }),
  28. };
  29. },
  30. })],
  31. methods: {
  32. chooseImage: function () {
  33. return __awaiter(this, void 0, void 0, function () {
  34. var _a, onBeforeUpload, onUpload, fileList, _b, maxCount, sourceType, localFileList, chooseImageRes, err_1, beforeUploadRes, err_2, tasks;
  35. var _this = this;
  36. return __generator(this, function (_c) {
  37. switch (_c.label) {
  38. case 0:
  39. _a = this.props, onBeforeUpload = _a.onBeforeUpload, onUpload = _a.onUpload;
  40. if (!onUpload) {
  41. throw new Error('need props onUpload');
  42. }
  43. fileList = this.getValue();
  44. _b = this.props, maxCount = _b.maxCount, sourceType = _b.sourceType;
  45. _c.label = 1;
  46. case 1:
  47. _c.trys.push([1, 3, , 4]);
  48. return [4 /*yield*/, chooseImage({
  49. count: typeof maxCount === 'undefined' ? Infinity : (maxCount - fileList.length),
  50. sourceType: sourceType,
  51. })];
  52. case 2:
  53. chooseImageRes = _c.sent();
  54. localFileList = (chooseImageRes.tempFiles || chooseImageRes.tempFilePaths || chooseImageRes.apFilePaths || chooseImageRes.filePaths || []).map(function (item) {
  55. if (typeof item === 'string') {
  56. return {
  57. path: item,
  58. };
  59. }
  60. if (item.path) {
  61. return {
  62. path: item.path,
  63. size: item.size,
  64. };
  65. }
  66. }).filter(function (item) { return !!item; });
  67. return [3 /*break*/, 4];
  68. case 3:
  69. err_1 = _c.sent();
  70. if (this.props.onChooseImageError) {
  71. this.props.onChooseImageError(err_1);
  72. }
  73. return [2 /*return*/];
  74. case 4:
  75. if (!onBeforeUpload) return [3 /*break*/, 8];
  76. _c.label = 5;
  77. case 5:
  78. _c.trys.push([5, 7, , 8]);
  79. return [4 /*yield*/, onBeforeUpload(localFileList)];
  80. case 6:
  81. beforeUploadRes = _c.sent();
  82. if (beforeUploadRes === false) {
  83. return [2 /*return*/];
  84. }
  85. if (Array.isArray(beforeUploadRes)) {
  86. localFileList = beforeUploadRes;
  87. }
  88. return [3 /*break*/, 8];
  89. case 7:
  90. err_2 = _c.sent();
  91. return [2 /*return*/];
  92. case 8:
  93. tasks = localFileList.map(function (file) { return _this.uploadFile(file); });
  94. return [4 /*yield*/, Promise.all(tasks)];
  95. case 9:
  96. _c.sent();
  97. return [2 /*return*/];
  98. }
  99. });
  100. });
  101. },
  102. uploadFile: function (localFile) {
  103. return __awaiter(this, void 0, void 0, function () {
  104. var onUpload, uid, tempFileList, url, err_3;
  105. return __generator(this, function (_a) {
  106. switch (_a.label) {
  107. case 0:
  108. onUpload = this.props.onUpload;
  109. uid = String(Math.random());
  110. tempFileList = __spreadArray(__spreadArray([], this.getValue(), true), [{
  111. path: localFile.path,
  112. size: localFile.size,
  113. uid: uid,
  114. status: 'uploading'
  115. }], false);
  116. if (!this.isControlled()) {
  117. this.update(tempFileList);
  118. }
  119. if (this.props.onChange) {
  120. this.props.onChange(tempFileList);
  121. }
  122. _a.label = 1;
  123. case 1:
  124. _a.trys.push([1, 3, , 4]);
  125. return [4 /*yield*/, onUpload(localFile)];
  126. case 2:
  127. url = _a.sent();
  128. if (typeof url !== 'string' || !url) {
  129. this.updateFile(uid, {
  130. status: 'error',
  131. });
  132. return [2 /*return*/];
  133. }
  134. this.updateFile(uid, {
  135. status: 'done',
  136. url: url,
  137. });
  138. return [3 /*break*/, 4];
  139. case 3:
  140. err_3 = _a.sent();
  141. this.updateFile(uid, {
  142. status: 'error',
  143. });
  144. return [3 /*break*/, 4];
  145. case 4: return [2 /*return*/];
  146. }
  147. });
  148. });
  149. },
  150. updateFile: function (uid, file) {
  151. var fileList = this.getValue();
  152. var tempFileList = fileList.map(function (item) {
  153. if (item.uid === uid) {
  154. return __assign(__assign({}, item), file);
  155. }
  156. return item;
  157. });
  158. if (!this.isControlled()) {
  159. this.update(tempFileList);
  160. }
  161. if (this.props.onChange) {
  162. this.props.onChange(tempFileList);
  163. }
  164. },
  165. onRemove: function (e) {
  166. return __awaiter(this, void 0, void 0, function () {
  167. var fileList, _a, onRemove, onChange, uid, file, result, tempFileList;
  168. return __generator(this, function (_b) {
  169. switch (_b.label) {
  170. case 0:
  171. fileList = this.getValue();
  172. _a = this.props, onRemove = _a.onRemove, onChange = _a.onChange;
  173. uid = e.target.dataset.uid;
  174. file = fileList.find(function (item) { return item.uid === uid; });
  175. if (!onRemove) return [3 /*break*/, 2];
  176. return [4 /*yield*/, onRemove(file)];
  177. case 1:
  178. result = _b.sent();
  179. if (result === false) {
  180. return [2 /*return*/];
  181. }
  182. _b.label = 2;
  183. case 2:
  184. tempFileList = fileList.filter(function (item) { return item.uid !== uid; });
  185. if (!this.isControlled()) {
  186. this.update(tempFileList);
  187. }
  188. if (onChange) {
  189. onChange(tempFileList);
  190. }
  191. return [2 /*return*/];
  192. }
  193. });
  194. });
  195. },
  196. onPreview: function (e) {
  197. var uid = e.target.dataset.uid;
  198. var fileList = this.getValue();
  199. var file = fileList.find(function (item) { return item.uid === uid; });
  200. if (this.props.onPreview) {
  201. this.props.onPreview(file);
  202. }
  203. },
  204. }
  205. });