mirror of
				https://github.com/langgenius/dify.git
				synced 2025-11-04 04:43:09 +00:00 
			
		
		
		
	Co-authored-by: NFish <douxc512@gmail.com> Co-authored-by: zxhlyh <jasonapring2015@outlook.com> Co-authored-by: twwu <twwu@dify.ai> Co-authored-by: jZonG <jzongcode@gmail.com>
		
			
				
	
	
		
			191 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { useCallback, useState } from 'react'
 | 
						|
import produce from 'immer'
 | 
						|
import { useBoolean } from 'ahooks'
 | 
						|
import { v4 as uuid4 } from 'uuid'
 | 
						|
import type { ValueSelector, Var } from '../../types'
 | 
						|
import { VarType } from '../../types'
 | 
						|
import type { VarGroupItem, VariableAssignerNodeType } from './types'
 | 
						|
import { useGetAvailableVars } from './hooks'
 | 
						|
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
 | 
						|
 | 
						|
import {
 | 
						|
  useNodesReadOnly,
 | 
						|
  useWorkflow,
 | 
						|
} from '@/app/components/workflow/hooks'
 | 
						|
 | 
						|
const useConfig = (id: string, payload: VariableAssignerNodeType) => {
 | 
						|
  const { nodesReadOnly: readOnly } = useNodesReadOnly()
 | 
						|
  const { handleOutVarRenameChange, isVarUsedInNodes, removeUsedVarInNodes } = useWorkflow()
 | 
						|
 | 
						|
  const { inputs, setInputs } = useNodeCrud<VariableAssignerNodeType>(id, payload)
 | 
						|
  const isEnableGroup = !!inputs.advanced_settings?.group_enabled
 | 
						|
 | 
						|
  // Not Enable Group
 | 
						|
  const handleListOrTypeChange = useCallback((payload: VarGroupItem) => {
 | 
						|
    setInputs({
 | 
						|
      ...inputs,
 | 
						|
      ...payload,
 | 
						|
    })
 | 
						|
  }, [inputs, setInputs])
 | 
						|
 | 
						|
  const handleListOrTypeChangeInGroup = useCallback((groupId: string) => {
 | 
						|
    return (payload: VarGroupItem) => {
 | 
						|
      const index = inputs.advanced_settings.groups.findIndex(item => item.groupId === groupId)
 | 
						|
      const newInputs = produce(inputs, (draft) => {
 | 
						|
        draft.advanced_settings.groups[index] = {
 | 
						|
          ...draft.advanced_settings.groups[index],
 | 
						|
          ...payload,
 | 
						|
        }
 | 
						|
      })
 | 
						|
      setInputs(newInputs)
 | 
						|
    }
 | 
						|
  }, [inputs, setInputs])
 | 
						|
 | 
						|
  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 [isShowRemoveVarConfirm, {
 | 
						|
    setTrue: showRemoveVarConfirm,
 | 
						|
    setFalse: hideRemoveVarConfirm,
 | 
						|
  }] = useBoolean(false)
 | 
						|
 | 
						|
  const [removedVars, setRemovedVars] = useState<ValueSelector[]>([])
 | 
						|
  const [removeType, setRemoveType] = useState<'group' | 'enableChanged'>('group')
 | 
						|
  const [removedGroupIndex, setRemovedGroupIndex] = useState<number>(-1)
 | 
						|
  const handleGroupRemoved = useCallback((groupId: string) => {
 | 
						|
    return () => {
 | 
						|
      const index = inputs.advanced_settings.groups.findIndex(item => item.groupId === groupId)
 | 
						|
      if (isVarUsedInNodes([id, inputs.advanced_settings.groups[index].group_name, 'output'])) {
 | 
						|
        showRemoveVarConfirm()
 | 
						|
        setRemovedVars([[id, inputs.advanced_settings.groups[index].group_name, 'output']])
 | 
						|
        setRemoveType('group')
 | 
						|
        setRemovedGroupIndex(index)
 | 
						|
        return
 | 
						|
      }
 | 
						|
      const newInputs = produce(inputs, (draft) => {
 | 
						|
        draft.advanced_settings.groups.splice(index, 1)
 | 
						|
      })
 | 
						|
      setInputs(newInputs)
 | 
						|
    }
 | 
						|
  }, [id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm])
 | 
						|
 | 
						|
  const handleGroupEnabledChange = useCallback((enabled: boolean) => {
 | 
						|
    const newInputs = produce(inputs, (draft) => {
 | 
						|
      if (!draft.advanced_settings)
 | 
						|
        draft.advanced_settings = { group_enabled: false, groups: [] }
 | 
						|
      if (enabled) {
 | 
						|
        if (draft.advanced_settings.groups.length === 0) {
 | 
						|
          const DEFAULT_GROUP_NAME = 'Group1'
 | 
						|
          draft.advanced_settings.groups = [{
 | 
						|
            output_type: draft.output_type,
 | 
						|
            variables: draft.variables,
 | 
						|
            group_name: DEFAULT_GROUP_NAME,
 | 
						|
            groupId: uuid4(),
 | 
						|
          }]
 | 
						|
 | 
						|
          handleOutVarRenameChange(id, [id, 'output'], [id, DEFAULT_GROUP_NAME, 'output'])
 | 
						|
        }
 | 
						|
      }
 | 
						|
      else {
 | 
						|
        if (draft.advanced_settings.groups.length > 0) {
 | 
						|
          if (draft.advanced_settings.groups.length > 1) {
 | 
						|
            const useVars = draft.advanced_settings.groups.filter((item, index) => index > 0 && isVarUsedInNodes([id, item.group_name, 'output']))
 | 
						|
            if (useVars.length > 0) {
 | 
						|
              showRemoveVarConfirm()
 | 
						|
              setRemovedVars(useVars.map(item => [id, item.group_name, 'output']))
 | 
						|
              setRemoveType('enableChanged')
 | 
						|
              return
 | 
						|
            }
 | 
						|
          }
 | 
						|
          draft.output_type = draft.advanced_settings.groups[0].output_type
 | 
						|
          draft.variables = draft.advanced_settings.groups[0].variables
 | 
						|
          handleOutVarRenameChange(id, [id, draft.advanced_settings.groups[0].group_name, 'output'], [id, 'output'])
 | 
						|
        }
 | 
						|
      }
 | 
						|
      draft.advanced_settings.group_enabled = enabled
 | 
						|
    })
 | 
						|
    setInputs(newInputs)
 | 
						|
  }, [handleOutVarRenameChange, id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm])
 | 
						|
 | 
						|
  const handleAddGroup = useCallback(() => {
 | 
						|
    let maxInGroupName = 1
 | 
						|
    inputs.advanced_settings.groups.forEach((item) => {
 | 
						|
      const match = item.group_name.match(/(\d+)$/)
 | 
						|
      if (match) {
 | 
						|
        const num = Number.parseInt(match[1], 10)
 | 
						|
        if (num > maxInGroupName)
 | 
						|
          maxInGroupName = num
 | 
						|
      }
 | 
						|
    })
 | 
						|
    const newInputs = produce(inputs, (draft) => {
 | 
						|
      draft.advanced_settings.groups.push({
 | 
						|
        output_type: VarType.any,
 | 
						|
        variables: [],
 | 
						|
        group_name: `Group${maxInGroupName + 1}`,
 | 
						|
        groupId: uuid4(),
 | 
						|
      })
 | 
						|
    })
 | 
						|
    setInputs(newInputs)
 | 
						|
  }, [inputs, setInputs])
 | 
						|
 | 
						|
  const handleVarGroupNameChange = useCallback((groupId: string) => {
 | 
						|
    return (name: string) => {
 | 
						|
      const index = inputs.advanced_settings.groups.findIndex(item => item.groupId === groupId)
 | 
						|
      const newInputs = produce(inputs, (draft) => {
 | 
						|
        draft.advanced_settings.groups[index].group_name = name
 | 
						|
      })
 | 
						|
      handleOutVarRenameChange(id, [id, inputs.advanced_settings.groups[index].group_name, 'output'], [id, name, 'output'])
 | 
						|
      setInputs(newInputs)
 | 
						|
    }
 | 
						|
  }, [handleOutVarRenameChange, id, inputs, setInputs])
 | 
						|
 | 
						|
  const onRemoveVarConfirm = useCallback(() => {
 | 
						|
    removedVars.forEach((v) => {
 | 
						|
      removeUsedVarInNodes(v)
 | 
						|
    })
 | 
						|
    hideRemoveVarConfirm()
 | 
						|
    if (removeType === 'group') {
 | 
						|
      const newInputs = produce(inputs, (draft) => {
 | 
						|
        draft.advanced_settings.groups.splice(removedGroupIndex, 1)
 | 
						|
      })
 | 
						|
      setInputs(newInputs)
 | 
						|
    }
 | 
						|
    else {
 | 
						|
      // removeType === 'enableChanged' to enabled
 | 
						|
      const newInputs = produce(inputs, (draft) => {
 | 
						|
        draft.advanced_settings.group_enabled = false
 | 
						|
        draft.output_type = draft.advanced_settings.groups[0].output_type
 | 
						|
        draft.variables = draft.advanced_settings.groups[0].variables
 | 
						|
      })
 | 
						|
      setInputs(newInputs)
 | 
						|
    }
 | 
						|
  }, [removedVars, hideRemoveVarConfirm, removeType, removeUsedVarInNodes, inputs, setInputs, removedGroupIndex])
 | 
						|
 | 
						|
  return {
 | 
						|
    readOnly,
 | 
						|
    inputs,
 | 
						|
    handleListOrTypeChange,
 | 
						|
    isEnableGroup,
 | 
						|
    handleGroupEnabledChange,
 | 
						|
    handleAddGroup,
 | 
						|
    handleListOrTypeChangeInGroup,
 | 
						|
    handleGroupRemoved,
 | 
						|
    handleVarGroupNameChange,
 | 
						|
    isShowRemoveVarConfirm,
 | 
						|
    hideRemoveVarConfirm,
 | 
						|
    onRemoveVarConfirm,
 | 
						|
    getAvailableVars,
 | 
						|
    filterVar,
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export default useConfig
 |