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.
104 lines
3.2 KiB
TypeScript
104 lines
3.2 KiB
TypeScript
import { defaultNodeTypes } from '@/components/FlowEditor/node/types/defaultType';
|
|
import BasicNode from '@/components/FlowEditor/node/basicNode/BasicNode';
|
|
import SwitchNode from '@/components/FlowEditor/node/switchNode/SwitchNode';
|
|
import ImageNode from '@/components/FlowEditor/node/imageNode/ImageNode';
|
|
import CodeNode from '@/components/FlowEditor/node/codeNode/CodeNode';
|
|
import RestNode from '@/components/FlowEditor/node/restNode/RestNode';
|
|
import LocalNode from '@/components/FlowEditor/node/localNode/LocalNode';
|
|
|
|
// 获取handle类型 (api或data)
|
|
const getHandleType = (handleId: string, nodeParams: any) => {
|
|
// 检查是否为api类型的handle
|
|
const apiOuts = nodeParams.apiOuts || [];
|
|
const apiIns = nodeParams.apiIns || [];
|
|
|
|
if (apiOuts.some((api: any) => (api.name || api.id) === handleId) ||
|
|
apiIns.some((api: any) => (api.name || api.id) === handleId) || (handleId.includes('loop'))) {
|
|
return 'api';
|
|
}
|
|
|
|
// 检查是否为data类型的handle
|
|
const dataOuts = nodeParams.dataOuts || [];
|
|
const dataIns = nodeParams.dataIns || [];
|
|
|
|
if (dataOuts.some((data: any) => (data.name || data.id) === handleId) ||
|
|
dataIns.some((data: any) => (data.name || data.id) === handleId)) {
|
|
return 'data';
|
|
}
|
|
|
|
// 默认为data类型
|
|
return 'data';
|
|
};
|
|
|
|
// 验证数据类型是否匹配
|
|
const validateDataType = (sourceNode: defaultNodeTypes, targetNode: defaultNodeTypes, sourceHandleId: string, targetHandleId: string) => {
|
|
const sourceParams = sourceNode.data?.parameters || {};
|
|
const targetParams = targetNode.data?.parameters || {};
|
|
|
|
// 获取源节点的输出参数
|
|
let sourceDataType = '';
|
|
const sourceApiOuts = sourceParams.apiOuts || [];
|
|
const sourceDataOuts = sourceParams.dataOuts || [];
|
|
|
|
// 查找源handle的数据类型
|
|
const sourceApi = sourceApiOuts.find((api: any) => api.name === sourceHandleId);
|
|
const sourceData = sourceDataOuts.find((data: any) => data.name === sourceHandleId);
|
|
|
|
if (sourceApi) {
|
|
sourceDataType = sourceApi.dataType || '';
|
|
}
|
|
else if (sourceData) {
|
|
sourceDataType = sourceData.dataType || '';
|
|
}
|
|
|
|
// 获取目标节点的输入参数
|
|
let targetDataType = '';
|
|
const targetApiIns = targetParams.apiIns || [];
|
|
const targetDataIns = targetParams.dataIns || [];
|
|
|
|
// 查找目标handle的数据类型
|
|
const targetApi = targetApiIns.find((api: any) => api.name === targetHandleId);
|
|
const targetData = targetDataIns.find((data: any) => data.name === targetHandleId);
|
|
|
|
if (targetApi) {
|
|
targetDataType = targetApi.dataType || '';
|
|
}
|
|
else if (targetData) {
|
|
targetDataType = targetData.dataType || '';
|
|
}
|
|
|
|
// 如果任一数据类型为空,则允许连接
|
|
if (!sourceDataType || !targetDataType) {
|
|
return true;
|
|
}
|
|
|
|
// 比较数据类型是否匹配
|
|
return sourceDataType === targetDataType;
|
|
};
|
|
|
|
|
|
// 根据节点类型获取对应的节点组件
|
|
const getNodeComponent = (nodeType: string) => {
|
|
switch (nodeType) {
|
|
case 'BASIC':
|
|
case 'SUB':
|
|
return BasicNode;
|
|
case 'SWITCH':
|
|
return SwitchNode;
|
|
case 'IMAGE':
|
|
return ImageNode;
|
|
case 'CODE':
|
|
return CodeNode;
|
|
case 'REST':
|
|
return RestNode;
|
|
default:
|
|
return LocalNode;
|
|
}
|
|
};
|
|
|
|
|
|
export {
|
|
getHandleType,
|
|
validateDataType,
|
|
getNodeComponent
|
|
}; |