|
9 | 9 | </label> |
10 | 10 | </div> |
11 | 11 | <template #actions> |
12 | | - <object-upload-stats /> |
13 | | - <object-delete-stats /> |
| 12 | + <object-task-stats :tasks="taskStore.tasks" :on-clear-tasks="taskStore.clearTasks"> |
| 13 | + <template #task-list="{ tasks }"> |
| 14 | + <object-task-list :tasks="tasks" /> |
| 15 | + </template> |
| 16 | + </object-task-stats> |
14 | 17 | <!-- <Button variant="outline" @click="() => handleNewObject(true)"> |
15 | 18 | <Icon name="ri:add-line" class="size-4" /> |
16 | 19 | <span>{{ t('New Folder') }}</span> |
@@ -102,9 +105,8 @@ import { saveAs } from 'file-saver' |
102 | 105 | import JSZip from 'jszip' |
103 | 106 | import { joinRelativeURL } from 'ufo' |
104 | 107 | import type { VNode } from 'vue' |
105 | | -import { computed, h, ref, watch } from 'vue' |
106 | | -import { useDeleteTaskManagerStore } from '~/store/delete-tasks' |
107 | | -import { useUploadTaskManagerStore } from '~/store/upload-tasks' |
| 108 | +import { computed, h, onMounted, onUnmounted, ref, watch } from 'vue' |
| 109 | +import { useTaskManagerStore } from '~/store/tasks' |
108 | 110 |
|
109 | 111 | const { $s3Client } = useNuxtApp() |
110 | 112 | const { t } = useI18n() |
@@ -139,8 +141,7 @@ watch(searchTerm, () => { |
139 | 141 | handleSearch() |
140 | 142 | }) |
141 | 143 |
|
142 | | -const uploadTaskStore = useUploadTaskManagerStore() |
143 | | -const deleteTaskStore = useDeleteTaskManagerStore() |
| 144 | +const taskStore = useTaskManagerStore() |
144 | 145 |
|
145 | 146 | type ObjectRow = { |
146 | 147 | Key: string |
@@ -352,17 +353,22 @@ const { table, selectedRowIds } = useDataTable<ObjectRow>({ |
352 | 353 | // Use selectedRowIds from data-table instead of manually maintaining checkedKeys |
353 | 354 | const checkedKeys = computed(() => selectedRowIds.value) |
354 | 355 |
|
355 | | -watch( |
356 | | - () => uploadTaskStore.tasks, |
357 | | - () => setTimeout(() => refresh(), 500), |
358 | | - { deep: true } |
359 | | -) |
| 356 | +// 监听任务完成事件,只在所有任务完成时刷新列表 |
| 357 | +// 这样可以避免在上传/删除大量文件时频繁刷新 |
| 358 | +// 保存事件处理函数引用,以便在卸载时正确清理 |
| 359 | +const handleAllTasksCompleted = () => { |
| 360 | + refresh() |
| 361 | +} |
360 | 362 |
|
361 | | -watch( |
362 | | - () => deleteTaskStore.tasks, |
363 | | - () => setTimeout(() => refresh(), 500), |
364 | | - { deep: true } |
365 | | -) |
| 363 | +onMounted(() => { |
| 364 | + // 监听所有任务全部完成事件(上传/删除) |
| 365 | + taskStore.on('drained', handleAllTasksCompleted) |
| 366 | +}) |
| 367 | +
|
| 368 | +onUnmounted(() => { |
| 369 | + // 清理事件监听器 |
| 370 | + taskStore.off('drained', handleAllTasksCompleted) |
| 371 | +}) |
366 | 372 |
|
367 | 373 | const goToNextPage = () => { |
368 | 374 | if (!nextToken.value) return |
@@ -518,7 +524,7 @@ const handleDelete = async (keys: string[]) => { |
518 | 524 | if (!targets.length) { |
519 | 525 | message.success(t('Delete Success')) |
520 | 526 | } else { |
521 | | - deleteTaskStore.addKeys(targets, bucketName.value) |
| 527 | + taskStore.addDeleteKeys(targets, bucketName.value) |
522 | 528 | message.success(t('Delete task created')) |
523 | 529 | } |
524 | 530 | table.resetRowSelection() |
|
0 commit comments