mirror of
https://github.com/langgenius/dify.git
synced 2026-01-24 20:52:16 +08:00
Signed-off-by: -LAN- <laipz8200@outlook.com> Signed-off-by: kenwoodjw <blackxin55+@gmail.com> Signed-off-by: Yongtao Huang <yongtaoh2022@gmail.com> Signed-off-by: yihong0618 <zouzou0208@gmail.com> Signed-off-by: zhanluxianshen <zhanluxianshen@163.com> Co-authored-by: -LAN- <laipz8200@outlook.com> Co-authored-by: GuanMu <ballmanjq@gmail.com> Co-authored-by: Davide Delbianco <davide.delbianco@outlook.com> Co-authored-by: NeatGuyCoding <15627489+NeatGuyCoding@users.noreply.github.com> Co-authored-by: kenwoodjw <blackxin55+@gmail.com> Co-authored-by: Yongtao Huang <yongtaoh2022@gmail.com> Co-authored-by: Yongtao Huang <99629139+hyongtao-db@users.noreply.github.com> Co-authored-by: Qiang Lee <18018968632@163.com> Co-authored-by: 李强04 <liqiang04@gaotu.cn> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Asuka Minato <i@asukaminato.eu.org> Co-authored-by: Matri Qi <matrixdom@126.com> Co-authored-by: huayaoyue6 <huayaoyue@163.com> Co-authored-by: Bowen Liang <liangbowen@gf.com.cn> Co-authored-by: znn <jubinkumarsoni@gmail.com> Co-authored-by: crazywoola <427733928@qq.com> Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: yihong <zouzou0208@gmail.com> Co-authored-by: Muke Wang <shaodwaaron@gmail.com> Co-authored-by: wangmuke <wangmuke@kingsware.cn> Co-authored-by: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Co-authored-by: quicksand <quicksandzn@gmail.com> Co-authored-by: 非法操作 <hjlarry@163.com> Co-authored-by: zxhlyh <jasonapring2015@outlook.com> Co-authored-by: Eric Guo <eric.guocz@gmail.com> Co-authored-by: Zhedong Cen <cenzhedong2@126.com> Co-authored-by: jiangbo721 <jiangbo721@163.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: hjlarry <25834719+hjlarry@users.noreply.github.com> Co-authored-by: lxsummer <35754229+lxjustdoit@users.noreply.github.com> Co-authored-by: 湛露先生 <zhanluxianshen@163.com> Co-authored-by: Guangdong Liu <liugddx@gmail.com> Co-authored-by: QuantumGhost <obelisk.reg+git@gmail.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Yessenia-d <yessenia.contact@gmail.com> Co-authored-by: huangzhuo1949 <167434202+huangzhuo1949@users.noreply.github.com> Co-authored-by: huangzhuo <huangzhuo1@xiaomi.com> Co-authored-by: 17hz <0x149527@gmail.com> Co-authored-by: Amy <1530140574@qq.com> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: Nite Knite <nkCoding@gmail.com> Co-authored-by: Yeuoly <45712896+Yeuoly@users.noreply.github.com> Co-authored-by: Petrus Han <petrus.hanks@gmail.com> Co-authored-by: iamjoel <2120155+iamjoel@users.noreply.github.com> Co-authored-by: Kalo Chin <frog.beepers.0n@icloud.com> Co-authored-by: Ujjwal Maurya <ujjwalsbx@gmail.com> Co-authored-by: Maries <xh001x@hotmail.com>
165 lines
4.9 KiB
TypeScript
165 lines
4.9 KiB
TypeScript
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: false,
|
|
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
|
|
}
|