simpleUploadOverlay.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { defineStore } from "pinia";
  2. import { ref } from "vue";
  3. let progressTimer: ReturnType<typeof setInterval> | null = null;
  4. let activeController: AbortController | null = null;
  5. function clearProgressTimer() {
  6. if (progressTimer) {
  7. clearInterval(progressTimer);
  8. progressTimer = null;
  9. }
  10. }
  11. export const useSimpleUploadOverlayStore = defineStore("simple-upload-overlay", () => {
  12. const show = ref(false);
  13. const percent = ref(0);
  14. const title = ref("上传中");
  15. const cancelText = ref("取消上传");
  16. function beginUpload(opts?: { title?: string }) {
  17. activeController?.abort();
  18. clearProgressTimer();
  19. activeController = new AbortController();
  20. title.value = opts?.title ?? "上传中";
  21. percent.value = 3;
  22. show.value = true;
  23. progressTimer = setInterval(() => {
  24. if (percent.value < 88) {
  25. percent.value = Math.min(88, percent.value + 2 + Math.random() * 6);
  26. }
  27. }, 260);
  28. return activeController.signal;
  29. }
  30. function bumpToComplete() {
  31. clearProgressTimer();
  32. percent.value = 100;
  33. }
  34. function dismiss() {
  35. clearProgressTimer();
  36. show.value = false;
  37. percent.value = 0;
  38. activeController = null;
  39. }
  40. function userCancel() {
  41. activeController?.abort();
  42. dismiss();
  43. }
  44. return {
  45. show,
  46. percent,
  47. title,
  48. cancelText,
  49. beginUpload,
  50. bumpToComplete,
  51. dismiss,
  52. userCancel
  53. };
  54. });