| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | import { useCallback } from 'react'import {  useNodes,  useStoreApi,} from 'reactflow'import { uniqBy } from 'lodash-es'import produce from 'immer'import {  useIsChatMode,  useNodeDataUpdate,  useWorkflow,  useWorkflowVariables,} from '../../hooks'import type {  Node,  ValueSelector,  Var,} from '../../types'import { useWorkflowStore } from '../../store'import type {  VarGroupItem,  VariableAssignerNodeType,} from './types'export const useVariableAssigner = () => {  const store = useStoreApi()  const workflowStore = useWorkflowStore()  const { handleNodeDataUpdate } = useNodeDataUpdate()  const handleAssignVariableValueChange = useCallback((nodeId: string, value: ValueSelector, varDetail: Var, groupId?: string) => {    const { getNodes } = store.getState()    const nodes = getNodes()    const node: Node<VariableAssignerNodeType> = nodes.find(node => node.id === nodeId)!    let payload    if (groupId && groupId !== 'target') {      payload = {        advanced_settings: {          ...node.data.advanced_settings,          groups: node.data.advanced_settings?.groups.map((group: VarGroupItem & { groupId: string }) => {            if (group.groupId === groupId && !group.variables.some(item => item.join('.') === (value as ValueSelector).join('.'))) {              return {                ...group,                variables: [...group.variables, value],                output_type: varDetail.type,              }            }            return group          }),        },      }    }    else {      if (node.data.variables.some(item => item.join('.') === (value as ValueSelector).join('.')))        return      payload = {        variables: [...node.data.variables, value],        output_type: varDetail.type,      }    }    handleNodeDataUpdate({      id: nodeId,      data: payload,    })  }, [store, handleNodeDataUpdate])  const handleAddVariableInAddVariablePopupWithPosition = useCallback((    nodeId: string,    variableAssignerNodeId: string,    variableAssignerNodeHandleId: string,    value: ValueSelector,    varDetail: Var,  ) => {    const {      getNodes,      setNodes,    } = store.getState()    const {      setShowAssignVariablePopup,    } = workflowStore.getState()    const newNodes = produce(getNodes(), (draft) => {      draft.forEach((node) => {        if (node.id === nodeId || node.id === variableAssignerNodeId) {          node.data = {            ...node.data,            _showAddVariablePopup: false,            _holdAddVariablePopup: false,          }        }      })    })    setNodes(newNodes)    setShowAssignVariablePopup(undefined)    handleAssignVariableValueChange(variableAssignerNodeId, value, varDetail, variableAssignerNodeHandleId)  }, [store, workflowStore, handleAssignVariableValueChange])  const handleGroupItemMouseEnter = useCallback((groupId: string) => {    const {      setHoveringAssignVariableGroupId,    } = workflowStore.getState()    setHoveringAssignVariableGroupId(groupId)  }, [workflowStore])  const handleGroupItemMouseLeave = useCallback(() => {    const {      connectingNodePayload,      setHoveringAssignVariableGroupId,    } = workflowStore.getState()    if (connectingNodePayload)      setHoveringAssignVariableGroupId(undefined)  }, [workflowStore])  return {    handleAddVariableInAddVariablePopupWithPosition,    handleGroupItemMouseEnter,    handleGroupItemMouseLeave,    handleAssignVariableValueChange,  }}export const useGetAvailableVars = () => {  const nodes: Node[] = useNodes()  const { getBeforeNodesInSameBranchIncludeParent } = useWorkflow()  const { getNodeAvailableVars } = useWorkflowVariables()  const isChatMode = useIsChatMode()  const getAvailableVars = useCallback((nodeId: string, handleId: string, filterVar: (v: Var) => boolean, hideEnv = false) => {    const availableNodes: Node[] = []    const currentNode = nodes.find(node => node.id === nodeId)!    if (!currentNode)      return []    const beforeNodes = getBeforeNodesInSameBranchIncludeParent(nodeId)    availableNodes.push(...beforeNodes)    const parentNode = nodes.find(node => node.id === currentNode.parentId)    if (hideEnv) {      return getNodeAvailableVars({        parentNode,        beforeNodes: uniqBy(availableNodes, 'id').filter(node => node.id !== nodeId),        isChatMode,        hideEnv,        hideChatVar: hideEnv,        filterVar,      })        .map(node => ({          ...node,          vars: node.isStartNode ? node.vars.filter(v => !v.variable.startsWith('sys.')) : node.vars,        }))        .filter(item => item.vars.length > 0)    }    return getNodeAvailableVars({      parentNode,      beforeNodes: uniqBy(availableNodes, 'id').filter(node => node.id !== nodeId),      isChatMode,      filterVar,    })  }, [nodes, getBeforeNodesInSameBranchIncludeParent, getNodeAvailableVars, isChatMode])  return getAvailableVars}
 |