withSimpleUploadOverlay.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132
  1. import { ElMessage } from "element-plus";
  2. import { useSimpleUploadOverlayStore } from "@/stores/modules/simpleUploadOverlay";
  3. function sleep(ms: number) {
  4. return new Promise<void>(resolve => setTimeout(resolve, ms));
  5. }
  6. /**
  7. * 使用全局 PopupLoading 包裹「/upload/simple」类上传;成功后提示「上传成功」。
  8. * 取消(AbortError)不弹成功提示;失败时关闭弹层,由调用方决定是否 ElMessage.error。
  9. * `successMessage === null` 时不弹成功提示(用于上传后还要继续审核等场景)。
  10. */
  11. export async function withSimpleUploadOverlay<T>(
  12. task: (signal: AbortSignal) => Promise<T>,
  13. options?: { title?: string; successMessage?: string | null }
  14. ): Promise<T> {
  15. const overlay = useSimpleUploadOverlayStore();
  16. const signal = overlay.beginUpload({ title: options?.title });
  17. try {
  18. const result = await task(signal);
  19. overlay.bumpToComplete();
  20. await sleep(280);
  21. overlay.dismiss();
  22. if (options?.successMessage !== null) {
  23. ElMessage.success(options?.successMessage ?? "上传成功");
  24. }
  25. return result;
  26. } catch (e) {
  27. overlay.dismiss();
  28. throw e;
  29. }
  30. }