mirror of
https://github.com/langgenius/dify.git
synced 2026-04-12 22:17:09 +08:00
Co-authored-by: CodingOnStar <hanxujiang@dify.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
92 lines
3.1 KiB
TypeScript
92 lines
3.1 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
|