dify/web/app/components/workflow/nodes/assigner/use-config.ts
Stephen Zhou a84c2d36a3
style: format with vp fmt (#38803)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-07-12 15:57:46 +00:00

107 lines
3.2 KiB
TypeScript

import type { ValueSelector, Var } from '../../types'
import type { AssignerNodeOperation, AssignerNodeType } from './types'
import { useCallback, useMemo } from 'react'
import { useStoreApi } from 'reactflow'
import {
useIsChatMode,
useNodesReadOnly,
useWorkflow,
useWorkflowVariables,
} from '@/app/components/workflow/hooks'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
import { useGetAvailableVars } from './hooks'
import { WriteMode, writeModeTypesNum } from './types'
import {
canAssignToVar,
canAssignVar,
ensureAssignerVersion,
filterVarByType,
normalizeAssignedVarType,
updateOperationItems,
} from './use-config.helpers'
import { convertV1ToV2 } from './utils'
const useConfig = (id: string, rawPayload: AssignerNodeType) => {
const payload = useMemo(() => convertV1ToV2(rawPayload), [rawPayload])
const { nodesReadOnly: readOnly } = useNodesReadOnly()
const isChatMode = useIsChatMode()
const getAvailableVars = useGetAvailableVars()
const store = useStoreApi()
const { getBeforeNodesInSameBranchIncludeParent } = useWorkflow()
const { getNodes } = store.getState()
const currentNode = getNodes().find((n) => n.id === id)
const isInIteration = payload.isInIteration
const iterationNode = isInIteration
? getNodes().find((n) => n.id === currentNode!.parentId)
: null
const availableNodes = useMemo(() => {
return getBeforeNodesInSameBranchIncludeParent(id)
}, [getBeforeNodesInSameBranchIncludeParent, id])
const { inputs, setInputs } = useNodeCrud<AssignerNodeType>(id, payload)
const newSetInputs = useCallback(
(newInputs: AssignerNodeType) => {
setInputs(ensureAssignerVersion(newInputs))
},
[setInputs],
)
const { getCurrentVariableType } = useWorkflowVariables()
const getAssignedVarType = useCallback(
(valueSelector: ValueSelector) => {
return getCurrentVariableType({
parentNode: isInIteration ? iterationNode : null,
valueSelector: valueSelector || [],
availableNodes,
isChatMode,
isConstant: false,
})
},
[getCurrentVariableType, isInIteration, iterationNode, availableNodes, isChatMode],
)
const handleOperationListChanges = useCallback(
(items: AssignerNodeOperation[]) => {
newSetInputs(updateOperationItems(inputs, items))
},
[inputs, newSetInputs],
)
const writeModeTypesArr = [
WriteMode.overwrite,
WriteMode.clear,
WriteMode.append,
WriteMode.extend,
WriteMode.removeFirst,
WriteMode.removeLast,
]
const writeModeTypes = [WriteMode.overwrite, WriteMode.clear, WriteMode.set]
const getToAssignedVarType = useCallback(normalizeAssignedVarType, [])
const filterAssignedVar = useCallback((varPayload: Var, selector: ValueSelector) => {
if (varPayload.isLoopVariable) return true
return canAssignVar(varPayload, selector)
}, [])
const filterToAssignedVar = useCallback(canAssignToVar, [])
return {
readOnly,
inputs,
handleOperationListChanges,
getAssignedVarType,
getToAssignedVarType,
writeModeTypes,
writeModeTypesArr,
writeModeTypesNum,
filterAssignedVar,
filterToAssignedVar,
getAvailableVars,
filterVar: filterVarByType,
}
}
export default useConfig