From 7b2d995c54b58e53727bdd071b7117438fa8fe21 Mon Sep 17 00:00:00 2001 From: ZLY Date: Thu, 25 Dec 2025 11:32:31 +0800 Subject: [PATCH] =?UTF-8?q?pref(store):=20=E5=AE=9E=E7=8E=B0=E5=A4=9A?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E8=8A=82=E7=82=B9=E7=8A=B6=E6=80=81=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/ideContainer/index.tsx | 8 ++++--- src/pages/ideContainer/logBar.tsx | 11 ++++----- src/store/ideContainer.ts | 37 ++++++++++++++++++++----------- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/pages/ideContainer/index.tsx b/src/pages/ideContainer/index.tsx index 0860237..2dd6d1d 100644 --- a/src/pages/ideContainer/index.tsx +++ b/src/pages/ideContainer/index.tsx @@ -82,7 +82,7 @@ function IDEContainer() { if (socketMessage?.socketId) dispatch(updateSocketId(socketMessage.socketId)); // 处理节点状态更新 if (socketMessage?.nodeLog) { - const { nodeId, state, runLog } = socketMessage.nodeLog; + const { nodeId, state, runLog, appId } = socketMessage.nodeLog; // 将状态映射为前端使用的状态 let status = 'waiting'; switch (state) { @@ -100,7 +100,8 @@ function IDEContainer() { break; } // 更新节点状态,使用特殊的actionType标记这是运行时状态更新 - dispatch(updateNodeStatus({ nodeId, status, actionType: 'RUNTIME_UPDATE' })); + // 如果后端提供了 appId,则传递给 action 以确保更新正确的应用状态 + dispatch(updateNodeStatus({ nodeId, status, appId, actionType: 'RUNTIME_UPDATE' })); // 只有当存在runLog时才发送日志到logBar if (runLog) { @@ -108,7 +109,8 @@ function IDEContainer() { detail: { type: 'runtime', message: runLog, - timestamp: new Date().toISOString() + timestamp: new Date().toISOString(), + appId // 传递 appId 以便日志正确关联到对应的应用 } }); document.dispatchEvent(logEvent); diff --git a/src/pages/ideContainer/logBar.tsx b/src/pages/ideContainer/logBar.tsx index a8b709f..df8d242 100644 --- a/src/pages/ideContainer/logBar.tsx +++ b/src/pages/ideContainer/logBar.tsx @@ -110,7 +110,7 @@ const LogBar: React.FC = () => { // 监听日志消息事件 useEffect(() => { const handleLogMessage = (event: CustomEvent) => { - const { type, message, timestamp } = event.detail; + const { type, message, timestamp, appId } = event.detail; // 如果是校验类型的消息且当前校验日志tab可见,则添加到校验日志中 if (type === 'validation') { @@ -141,14 +141,15 @@ const LogBar: React.FC = () => { // 自动切换到运行日志tab并展开logBar dispatch(updateLogBarStatus(true)); - // 同时将日志添加到当前应用的运行日志中 - const appKey = getCurrentAppKey(); - if (appKey) { + // 同时将日志添加到对应应用的运行日志中 + // 如果提供了 appId,优先使用提供的 appId;否则使用当前激活的应用 + const targetAppKey = appId || getCurrentAppKey(); + if (targetAppKey) { dispatch({ type: 'ideContainer/addRuntimeLog', payload: { log: newLog, - appId: appKey // 使用 appKey 而不是 id + appId: targetAppKey } }); } diff --git a/src/store/ideContainer.ts b/src/store/ideContainer.ts index f19d8f1..350cbdc 100644 --- a/src/store/ideContainer.ts +++ b/src/store/ideContainer.ts @@ -93,6 +93,17 @@ const ideContainerSlice = createSlice({ }, updateCurrentAppData(state, action) { state.currentAppData = action.payload; + + // 切换应用时,同步全局 nodeStatusMap 为新应用的节点状态 + const newAppKey = getCurrentAppKey(action.payload); + if (newAppKey && state.appRuntimeData[newAppKey]) { + state.nodeStatusMap = { ...state.appRuntimeData[newAppKey].nodeStatusMap }; + state.isRunning = state.appRuntimeData[newAppKey].isRunning; + } else { + // 如果新应用没有运行时数据,清空节点状态 + state.nodeStatusMap = {}; + state.isRunning = false; + } }, updateEventList(state, action) { state.eventList = action.payload; @@ -114,21 +125,21 @@ const ideContainerSlice = createSlice({ }, // 更新节点状态 updateNodeStatus: (state, { payload }) => { - const { nodeId, status, actionType } = payload; - // 如果是运行时更新,不记录到历史记录中 - if (actionType !== 'RUNTIME_UPDATE') { - state.nodeStatusMap[nodeId] = status; - } - else { - // 对于运行时更新,我们仍然更新状态但标记为运行时状态 + const { nodeId, status, actionType, appId } = payload; + + // 如果提供了 appId,优先使用提供的 appId;否则使用当前激活的应用 + const targetAppKey = appId || getCurrentAppKey(state.currentAppData); + + // 更新全局 nodeStatusMap(仅当是当前激活应用时更新,用于 UI 显示) + const currentAppKey = getCurrentAppKey(state.currentAppData); + if (targetAppKey === currentAppKey) { state.nodeStatusMap[nodeId] = status; } - // 同时更新当前应用的节点状态 - const appKey = getCurrentAppKey(state.currentAppData); - if (appKey) { - if (!state.appRuntimeData[appKey]) { - state.appRuntimeData[appKey] = { + // 更新目标应用的节点状态 + if (targetAppKey) { + if (!state.appRuntimeData[targetAppKey]) { + state.appRuntimeData[targetAppKey] = { nodeStatusMap: {}, isRunning: false, logs: [], @@ -137,7 +148,7 @@ const ideContainerSlice = createSlice({ eventlisteneList: [] }; } - state.appRuntimeData[appKey].nodeStatusMap[nodeId] = status; + state.appRuntimeData[targetAppKey].nodeStatusMap[nodeId] = status; } }, // 重置节点状态