You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

227 lines
6.6 KiB
TypeScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { createSlice } from '@reduxjs/toolkit';
// 定义初始状态类型
interface IDEContainerState {
info: any;
menuData: any;
flowData: any;
canvasDataMap: any;
projectComponentData: any;
currentAppData: any;
eventListOld: any;
eventList: any;
eventTopicList: any;
logBarStatus?: boolean;
socketId: string;
nodeStatusMap: Record<string, string>; // 节点状态映射
isRunning: boolean; // 是否正在运行
// 应用运行状态和日志数据按应用ID隔离存储
appRuntimeData: Record<string, {
nodeStatusMap: Record<string, string>;
isRunning: boolean;
logs: any[];
runId: string;
eventSendNodeList: any[], // [{nodeID:topic}]
eventlisteneList: any[] // [{nodeID:topic}]
}>;
gloBalVarList: any;
}
// 初始状态
const initialState: IDEContainerState = {
info: {}, // 项目信息
menuData: {}, // 菜单数据
flowData: {}, // 编排数据,即流程图的渲染数据
canvasDataMap: {}, // 每个画布的缓存信息
projectComponentData: {}, // 工程下的组件列表
currentAppData: {}, // 当前选中的应用数据
eventListOld: [], // 工程下的事件列表
eventList: [], // 工程下的事件列表
eventTopicList: [], // 应用编排使用的事件名和topic列表
logBarStatus: false,
socketId: '', // 工程的socketId
nodeStatusMap: {}, // 初始化节点状态映射
isRunning: false, // 默认未运行
appRuntimeData: {}, // 按应用ID隔离的应用运行状态和日志数据
gloBalVarList: [] // 工程级全局变量列表
};
// 创建切片
const ideContainerSlice = createSlice({
name: 'ideContainer',
initialState,
reducers: {
updateInfo(state, action) {
state.info = action.payload;
},
updateMenuData(state, action) {
state.menuData = action.payload;
},
updateFlowData(state, action) {
state.flowData = { ...state.flowData, ...action.payload };
},
updateCanvasDataMap(state, action) {
state.canvasDataMap = { ...state.canvasDataMap, ...action.payload };
},
updateProjectComponentData(state, action) {
state.projectComponentData = { ...state.projectComponentData, ...action.payload };
},
updateCurrentAppData(state, action) {
state.currentAppData = action.payload;
},
updateEventList(state, action) {
state.eventList = action.payload;
},
updateEventListOld(state, action) {
state.eventListOld = action.payload;
},
updateEventTopicList(state, action) {
state.eventTopicList = action.payload;
},
updateLogBarStatus(state, action) {
state.logBarStatus = action.payload;
},
updateSocketId(state, action) {
state.socketId = action.payload;
},
updateGlobalVarList(state, action) {
state.gloBalVarList = action.payload;
},
// 更新节点状态
updateNodeStatus: (state, { payload }) => {
const { nodeId, status, actionType } = payload;
// 如果是运行时更新,不记录到历史记录中
if (actionType !== 'RUNTIME_UPDATE') {
state.nodeStatusMap[nodeId] = status;
}
else {
// 对于运行时更新,我们仍然更新状态但标记为运行时状态
state.nodeStatusMap[nodeId] = status;
}
// 同时更新当前应用的节点状态
const appId = state.currentAppData?.id;
if (appId) {
if (!state.appRuntimeData[appId]) {
state.appRuntimeData[appId] = {
nodeStatusMap: {},
isRunning: false,
logs: [],
runId: '',
eventSendNodeList: [],
eventlisteneList: []
};
}
state.appRuntimeData[appId].nodeStatusMap[nodeId] = status;
}
},
// 重置节点状态
resetNodeStatus: (state) => {
state.nodeStatusMap = {};
// 同时重置当前应用的节点状态
const appId = state.currentAppData?.id;
if (appId && state.appRuntimeData[appId]) {
state.appRuntimeData[appId].nodeStatusMap = {};
}
},
// 更新运行状态
updateIsRunning: (state, { payload }) => {
state.isRunning = payload;
// 同时更新当前应用的运行状态
const appId = state.currentAppData?.id;
if (appId) {
if (!state.appRuntimeData[appId]) {
state.appRuntimeData[appId] = {
nodeStatusMap: {},
isRunning: false,
logs: [],
runId: '',
eventSendNodeList: [],
eventlisteneList: []
};
}
state.appRuntimeData[appId].isRunning = payload;
}
},
// 添加运行id
updateRuntimeId: (state, { payload }) => {
const appId = state.currentAppData?.id;
if (!state.appRuntimeData[appId]) {
state.appRuntimeData[appId] = {
nodeStatusMap: {},
isRunning: false,
logs: [],
runId: '',
eventSendNodeList: [],
eventlisteneList: []
};
}
state.appRuntimeData[appId].runId = payload;
},
// 更新事件节点列表
updateEventNodeList: (state, { payload }) => {
const appId = state.currentAppData?.id;
if (!state.appRuntimeData[appId]) {
state.appRuntimeData[appId] = {
nodeStatusMap: {},
isRunning: false,
logs: [],
runId: '',
eventSendNodeList: [],
eventlisteneList: []
};
}
state.appRuntimeData[appId] = { ...state.appRuntimeData[appId], ...payload };
},
// 添加运行日志
addRuntimeLog: (state, { payload }) => {
const { log, appId } = payload;
if (!state.appRuntimeData[appId]) {
state.appRuntimeData[appId] = {
nodeStatusMap: {},
isRunning: false,
logs: [],
runId: '',
eventSendNodeList: [],
eventlisteneList: []
};
}
state.appRuntimeData[appId].logs.push(log);
},
// 清空指定应用的运行日志
clearRuntimeLogs: (state, { payload }) => {
const { appId } = payload;
if (state.appRuntimeData[appId]) {
state.appRuntimeData[appId].logs = [];
}
}
}
});
// 导出动作 creators
export const {
updateInfo,
updateMenuData,
updateFlowData,
updateCanvasDataMap,
updateProjectComponentData,
updateCurrentAppData,
updateEventList,
updateEventListOld,
updateEventTopicList,
updateLogBarStatus,
updateSocketId,
updateGlobalVarList,
updateNodeStatus,
resetNodeStatus,
updateIsRunning,
updateRuntimeId,
updateEventNodeList,
addRuntimeLog,
clearRuntimeLogs
} = ideContainerSlice.actions;
// 默认导出 reducer
export default ideContainerSlice.reducer;