mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-05-24 05:28:43 +08:00

Signed-off-by: -LAN- <laipz8200@outlook.com> Co-authored-by: -LAN- <laipz8200@outlook.com>
132 lines
4.7 KiB
TypeScript
132 lines
4.7 KiB
TypeScript
import { useCallback, useMemo } from 'react'
|
|
import produce from 'immer'
|
|
import { useStoreApi } from 'reactflow'
|
|
import { VarType } from '../../types'
|
|
import type { ValueSelector, Var } from '../../types'
|
|
import { WriteMode } from './types'
|
|
import type { AssignerNodeOperation, AssignerNodeType } from './types'
|
|
import { useGetAvailableVars } from './hooks'
|
|
import { convertV1ToV2 } from './utils'
|
|
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
|
|
import {
|
|
useIsChatMode,
|
|
useNodesReadOnly,
|
|
useWorkflow,
|
|
useWorkflowVariables,
|
|
} from '@/app/components/workflow/hooks'
|
|
|
|
const useConfig = (id: string, rawPayload: AssignerNodeType) => {
|
|
const payload = useMemo(() => convertV1ToV2(rawPayload), [rawPayload])
|
|
const { nodesReadOnly: readOnly } = useNodesReadOnly()
|
|
const isChatMode = useIsChatMode()
|
|
const getAvailableVars = useGetAvailableVars()
|
|
const filterVar = (varType: VarType) => {
|
|
return (v: Var) => {
|
|
if (varType === VarType.any)
|
|
return true
|
|
if (v.type === VarType.any)
|
|
return true
|
|
return v.type === varType
|
|
}
|
|
}
|
|
|
|
const store = useStoreApi()
|
|
const { getBeforeNodesInSameBranch } = 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 getBeforeNodesInSameBranch(id)
|
|
}, [getBeforeNodesInSameBranch, id])
|
|
const { inputs, setInputs } = useNodeCrud<AssignerNodeType>(id, payload)
|
|
const newSetInputs = useCallback((newInputs: AssignerNodeType) => {
|
|
const finalInputs = produce(newInputs, (draft) => {
|
|
if (draft.version !== '2')
|
|
draft.version = '2'
|
|
})
|
|
setInputs(finalInputs)
|
|
}, [setInputs])
|
|
|
|
const { getCurrentVariableType } = useWorkflowVariables()
|
|
const getAssignedVarType = useCallback((valueSelector: ValueSelector) => {
|
|
return getCurrentVariableType({
|
|
parentNode: iterationNode,
|
|
valueSelector: valueSelector || [],
|
|
availableNodes,
|
|
isChatMode,
|
|
isConstant: false,
|
|
})
|
|
}, [getCurrentVariableType, iterationNode, availableNodes, isChatMode])
|
|
|
|
const handleOperationListChanges = useCallback((items: AssignerNodeOperation[]) => {
|
|
const newInputs = produce(inputs, (draft) => {
|
|
draft.items = [...items]
|
|
})
|
|
newSetInputs(newInputs)
|
|
}, [inputs, newSetInputs])
|
|
|
|
const writeModeTypesArr = [WriteMode.overwrite, WriteMode.clear, WriteMode.append, WriteMode.extend]
|
|
const writeModeTypes = [WriteMode.overwrite, WriteMode.clear, WriteMode.set]
|
|
const writeModeTypesNum = [WriteMode.increment, WriteMode.decrement, WriteMode.multiply, WriteMode.divide]
|
|
|
|
const getToAssignedVarType = useCallback((assignedVarType: VarType, write_mode: WriteMode) => {
|
|
if (write_mode === WriteMode.overwrite || write_mode === WriteMode.increment || write_mode === WriteMode.decrement
|
|
|| write_mode === WriteMode.multiply || write_mode === WriteMode.divide || write_mode === WriteMode.extend)
|
|
return assignedVarType
|
|
if (write_mode === WriteMode.append) {
|
|
if (assignedVarType === VarType.arrayString)
|
|
return VarType.string
|
|
if (assignedVarType === VarType.arrayNumber)
|
|
return VarType.number
|
|
if (assignedVarType === VarType.arrayObject)
|
|
return VarType.object
|
|
}
|
|
return VarType.string
|
|
}, [])
|
|
|
|
const filterAssignedVar = useCallback((varPayload: Var, selector: ValueSelector) => {
|
|
return selector.join('.').startsWith('conversation')
|
|
}, [])
|
|
|
|
const filterToAssignedVar = useCallback((varPayload: Var, assignedVarType: VarType, write_mode: WriteMode) => {
|
|
if (write_mode === WriteMode.overwrite || write_mode === WriteMode.extend || write_mode === WriteMode.increment
|
|
|| write_mode === WriteMode.decrement || write_mode === WriteMode.multiply || write_mode === WriteMode.divide) {
|
|
return varPayload.type === assignedVarType
|
|
}
|
|
else if (write_mode === WriteMode.append) {
|
|
switch (assignedVarType) {
|
|
case VarType.arrayString:
|
|
return varPayload.type === VarType.string
|
|
case VarType.arrayNumber:
|
|
return varPayload.type === VarType.number
|
|
case VarType.arrayObject:
|
|
return varPayload.type === VarType.object
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}, [])
|
|
|
|
return {
|
|
readOnly,
|
|
inputs,
|
|
handleOperationListChanges,
|
|
getAssignedVarType,
|
|
getToAssignedVarType,
|
|
writeModeTypes,
|
|
writeModeTypesArr,
|
|
writeModeTypesNum,
|
|
filterAssignedVar,
|
|
filterToAssignedVar,
|
|
getAvailableVars,
|
|
filterVar,
|
|
}
|
|
}
|
|
|
|
export default useConfig
|