import { memo, useMemo, } from 'react' import { useTranslation } from 'react-i18next' import { useNodes } from 'reactflow' import { useStore } from '../../../store' import { BlockEnum } from '../../../types' import type { Node, ValueSelector, VarType, } from '../../../types' import type { VariableAssignerNodeType } from '../types' import { useGetAvailableVars, useVariableAssigner, } from '../hooks' import { filterVar } from '../utils' import AddVariable from './add-variable' import NodeVariableItem from './node-variable-item' import { isConversationVar, isENV, isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils' import cn from '@/utils/classnames' import { isExceptionVariable } from '@/app/components/workflow/utils' const i18nPrefix = 'workflow.nodes.variableAssigner' type GroupItem = { groupEnabled: boolean targetHandleId: string title: string type: string variables: ValueSelector[] variableAssignerNodeId: string variableAssignerNodeData: VariableAssignerNodeType } type NodeGroupItemProps = { item: GroupItem } const NodeGroupItem = ({ item, }: NodeGroupItemProps) => { const { t } = useTranslation() const enteringNodePayload = useStore(s => s.enteringNodePayload) const hoveringAssignVariableGroupId = useStore(s => s.hoveringAssignVariableGroupId) const nodes: Node[] = useNodes() const { handleGroupItemMouseEnter, handleGroupItemMouseLeave, } = useVariableAssigner() const getAvailableVars = useGetAvailableVars() const groupEnabled = item.groupEnabled const outputType = useMemo(() => { if (!groupEnabled) return item.variableAssignerNodeData.output_type const group = item.variableAssignerNodeData.advanced_settings?.groups.find(group => group.groupId === item.targetHandleId) return group?.output_type || '' }, [item.variableAssignerNodeData, item.targetHandleId, groupEnabled]) const availableVars = getAvailableVars(item.variableAssignerNodeId, item.targetHandleId, filterVar(outputType as VarType), true) const showSelectionBorder = useMemo(() => { if (groupEnabled && enteringNodePayload?.nodeId === item.variableAssignerNodeId) { if (hoveringAssignVariableGroupId) return hoveringAssignVariableGroupId !== item.targetHandleId else return enteringNodePayload?.nodeData.advanced_settings?.groups[0].groupId !== item.targetHandleId } return false }, [enteringNodePayload, groupEnabled, hoveringAssignVariableGroupId, item.targetHandleId, item.variableAssignerNodeId]) const showSelectedBorder = useMemo(() => { if (groupEnabled && enteringNodePayload?.nodeId === item.variableAssignerNodeId) { if (hoveringAssignVariableGroupId) return hoveringAssignVariableGroupId === item.targetHandleId else return enteringNodePayload?.nodeData.advanced_settings?.groups[0].groupId === item.targetHandleId } return false }, [enteringNodePayload, groupEnabled, hoveringAssignVariableGroupId, item.targetHandleId, item.variableAssignerNodeId]) return (
groupEnabled && handleGroupItemMouseEnter(item.targetHandleId)} onMouseLeave={handleGroupItemMouseLeave} >
{item.title}
{item.type}
{ !item.variables.length && (
{t(`${i18nPrefix}.varNotSet`)}
) } { !!item.variables.length && item.variables.map((variable = [], index) => { const isSystem = isSystemVar(variable) const isEnv = isENV(variable) const isChatVar = isConversationVar(variable) const node = isSystem ? nodes.find(node => node.data.type === BlockEnum.Start) : nodes.find(node => node.id === variable[0]) const varName = isSystem ? `sys.${variable[variable.length - 1]}` : variable.slice(1).join('.') const isException = isExceptionVariable(varName, node?.data.type) return ( ) }) }
) } export default memo(NodeGroupItem)