use-handlers.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. var lodashUnified = require('lodash-unified');
  5. var core = require('@vueuse/core');
  6. require('../../../utils/index.js');
  7. var upload = require('./upload.js');
  8. var error = require('../../../utils/error.js');
  9. const SCOPE = "ElUpload";
  10. const revokeObjectURL = (file) => {
  11. var _a;
  12. if ((_a = file.url) == null ? void 0 : _a.startsWith("blob:")) {
  13. URL.revokeObjectURL(file.url);
  14. }
  15. };
  16. const useHandlers = (props, uploadRef) => {
  17. const uploadFiles = core.useVModel(props, "fileList", void 0, { passive: true });
  18. const getFile = (rawFile) => uploadFiles.value.find((file) => file.uid === rawFile.uid);
  19. function abort(file) {
  20. var _a;
  21. (_a = uploadRef.value) == null ? void 0 : _a.abort(file);
  22. }
  23. function clearFiles(states = ["ready", "uploading", "success", "fail"]) {
  24. uploadFiles.value = uploadFiles.value.filter((row) => !states.includes(row.status));
  25. }
  26. const handleError = (err, rawFile) => {
  27. const file = getFile(rawFile);
  28. if (!file)
  29. return;
  30. console.error(err);
  31. file.status = "fail";
  32. uploadFiles.value.splice(uploadFiles.value.indexOf(file), 1);
  33. props.onError(err, file, uploadFiles.value);
  34. props.onChange(file, uploadFiles.value);
  35. };
  36. const handleProgress = (evt, rawFile) => {
  37. const file = getFile(rawFile);
  38. if (!file)
  39. return;
  40. props.onProgress(evt, file, uploadFiles.value);
  41. file.status = "uploading";
  42. file.percentage = Math.round(evt.percent);
  43. };
  44. const handleSuccess = (response, rawFile) => {
  45. const file = getFile(rawFile);
  46. if (!file)
  47. return;
  48. file.status = "success";
  49. file.response = response;
  50. props.onSuccess(response, file, uploadFiles.value);
  51. props.onChange(file, uploadFiles.value);
  52. };
  53. const handleStart = (file) => {
  54. if (lodashUnified.isNil(file.uid))
  55. file.uid = upload.genFileId();
  56. const uploadFile = {
  57. name: file.name,
  58. percentage: 0,
  59. status: "ready",
  60. size: file.size,
  61. raw: file,
  62. uid: file.uid
  63. };
  64. if (props.listType === "picture-card" || props.listType === "picture") {
  65. try {
  66. uploadFile.url = URL.createObjectURL(file);
  67. } catch (err) {
  68. error.debugWarn(SCOPE, err.message);
  69. props.onError(err, uploadFile, uploadFiles.value);
  70. }
  71. }
  72. uploadFiles.value = [...uploadFiles.value, uploadFile];
  73. props.onChange(uploadFile, uploadFiles.value);
  74. };
  75. const handleRemove = async (file) => {
  76. const uploadFile = file instanceof File ? getFile(file) : file;
  77. if (!uploadFile)
  78. error.throwError(SCOPE, "file to be removed not found");
  79. const doRemove = (file2) => {
  80. abort(file2);
  81. const fileList = uploadFiles.value;
  82. fileList.splice(fileList.indexOf(file2), 1);
  83. props.onRemove(file2, fileList);
  84. revokeObjectURL(file2);
  85. };
  86. if (props.beforeRemove) {
  87. const before = await props.beforeRemove(uploadFile, uploadFiles.value);
  88. if (before !== false)
  89. doRemove(uploadFile);
  90. } else {
  91. doRemove(uploadFile);
  92. }
  93. };
  94. function submit() {
  95. uploadFiles.value.filter(({ status }) => status === "ready").forEach(({ raw }) => {
  96. var _a;
  97. return raw && ((_a = uploadRef.value) == null ? void 0 : _a.upload(raw));
  98. });
  99. }
  100. vue.watch(() => props.listType, (val) => {
  101. if (val !== "picture-card" && val !== "picture") {
  102. return;
  103. }
  104. uploadFiles.value = uploadFiles.value.map((file) => {
  105. const { raw, url } = file;
  106. if (!url && raw) {
  107. try {
  108. file.url = URL.createObjectURL(raw);
  109. } catch (err) {
  110. props.onError(err, file, uploadFiles.value);
  111. }
  112. }
  113. return file;
  114. });
  115. });
  116. vue.watch(uploadFiles, (files) => {
  117. for (const file of files) {
  118. file.uid || (file.uid = upload.genFileId());
  119. file.status || (file.status = "success");
  120. }
  121. }, { immediate: true, deep: true });
  122. return {
  123. uploadFiles,
  124. abort,
  125. clearFiles,
  126. handleError,
  127. handleProgress,
  128. handleStart,
  129. handleSuccess,
  130. handleRemove,
  131. submit
  132. };
  133. };
  134. exports.useHandlers = useHandlers;
  135. //# sourceMappingURL=use-handlers.js.map