Apply current workspace changes

This commit is contained in:
2026-04-22 01:52:21 +08:00
parent cf34b9a8ed
commit cb518b431f
449 changed files with 92252 additions and 321 deletions
+32 -1
View File
@@ -2,6 +2,13 @@ import { useCallback, useEffect, useRef, useState } from 'react';
import apiClient from '../api/client';
import { normalizeTaskStatus } from '../utils/appUiHelpers';
const NON_BLOCKING_TASK_TYPES = new Set(['UNPACK_ARCHIVES']);
const isTaskNonBlocking = (taskId, taskType, nonBlockingTaskIds = []) => (
NON_BLOCKING_TASK_TYPES.has(String(taskType || '').toUpperCase())
|| nonBlockingTaskIds.includes(taskId)
);
export default function useGlobalTaskControl({
currentUser,
licenseOk,
@@ -9,6 +16,8 @@ export default function useGlobalTaskControl({
setActiveTasks,
pendingTaskIds,
setPendingTaskIds,
nonBlockingTaskIds,
setNonBlockingTaskIds,
isGlobalLocked,
setIsGlobalLocked,
setIsCheckingTasks,
@@ -31,6 +40,8 @@ export default function useGlobalTaskControl({
// Stable refs so SSE handler doesn't need to re-subscribe on every render
const pendingTaskIdsRef = useRef(pendingTaskIds);
useEffect(() => { pendingTaskIdsRef.current = pendingTaskIds; }, [pendingTaskIds]);
const nonBlockingTaskIdsRef = useRef(nonBlockingTaskIds);
useEffect(() => { nonBlockingTaskIdsRef.current = nonBlockingTaskIds; }, [nonBlockingTaskIds]);
const handleTasksUpdate = useCallback(async (tasks) => {
setActiveTasks(tasks);
@@ -41,14 +52,25 @@ export default function useGlobalTaskControl({
const currentPending = pendingTaskIdsRef.current;
let updatedPending = currentPending;
let effectiveNonBlockingTaskIds = Array.from(new Set([
...nonBlockingTaskIdsRef.current,
...tasks
.filter((task) => NON_BLOCKING_TASK_TYPES.has(String(task.task_type || '').toUpperCase()))
.map((task) => task.task_id),
]));
// 如果 pendingTaskIds 为空,但 activeTasks 有任务,说明是刷新后的初始化
// 需要将 activeTasks 中的任务添加到 pendingTaskIds
if (currentPending.length === 0 && hasRunningTasks) {
const activeTaskIds = tasks.map((t) => t.task_id);
const nextNonBlockingIds = tasks
.filter((task) => NON_BLOCKING_TASK_TYPES.has(String(task.task_type || '').toUpperCase()))
.map((task) => task.task_id);
console.log('初始化:将活跃任务添加到 pending 列表:', activeTaskIds);
setPendingTaskIds(activeTaskIds);
setNonBlockingTaskIds(nextNonBlockingIds);
updatedPending = activeTaskIds;
effectiveNonBlockingTaskIds = nextNonBlockingIds;
}
if (currentPending.length > 0) {
@@ -104,6 +126,8 @@ export default function useGlobalTaskControl({
updatedPending = newPending;
return newPending;
});
setNonBlockingTaskIds((prev) => prev.filter((id) => !reallyFinishedIds.includes(id)));
effectiveNonBlockingTaskIds = effectiveNonBlockingTaskIds.filter((id) => !reallyFinishedIds.includes(id));
} else {
// 没有真正完成的任务,保持 updatedPending 不变
updatedPending = currentPending;
@@ -112,7 +136,13 @@ export default function useGlobalTaskControl({
}
// 只有当没有运行中的任务且没有待处理的任务时,才解锁
const shouldBeLocked = hasRunningTasks || updatedPending.length > 0;
const blockingRunningTasks = tasks.filter((task) => (
!isTaskNonBlocking(task.task_id, task.task_type, effectiveNonBlockingTaskIds)
));
const blockingPendingTaskIds = updatedPending.filter((taskId) => (
!effectiveNonBlockingTaskIds.includes(taskId)
));
const shouldBeLocked = blockingRunningTasks.length > 0 || blockingPendingTaskIds.length > 0;
if (shouldBeLocked !== isGlobalLockedRef.current) {
setIsGlobalLocked(shouldBeLocked);
@@ -128,6 +158,7 @@ export default function useGlobalTaskControl({
setIsCheckingTasks,
handleTaskCompletionRef,
setPendingTaskIds,
setNonBlockingTaskIds,
setIsGlobalLocked,
addLog,
initializeAppDataRef,