mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 10:53:02 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			138 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { useCallback, useEffect, useRef } from 'react'
 | |
| import produce from 'immer'
 | |
| import useVarList from '../_base/hooks/use-var-list'
 | |
| import type { Var, Variable } from '../../types'
 | |
| import { VarType } from '../../types'
 | |
| import { useStore } from '../../store'
 | |
| import type { TemplateTransformNodeType } from './types'
 | |
| import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
 | |
| import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run'
 | |
| import {
 | |
|   useNodesReadOnly,
 | |
| } from '@/app/components/workflow/hooks'
 | |
| import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
 | |
| 
 | |
| const useConfig = (id: string, payload: TemplateTransformNodeType) => {
 | |
|   const { nodesReadOnly: readOnly } = useNodesReadOnly()
 | |
|   const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type]
 | |
| 
 | |
|   const { inputs, setInputs: doSetInputs } = useNodeCrud<TemplateTransformNodeType>(id, payload)
 | |
|   const inputsRef = useRef(inputs)
 | |
|   const setInputs = useCallback((newPayload: TemplateTransformNodeType) => {
 | |
|     doSetInputs(newPayload)
 | |
|     inputsRef.current = newPayload
 | |
|   }, [doSetInputs])
 | |
| 
 | |
|   const { availableVars } = useAvailableVarList(id, {
 | |
|     onlyLeafNodeVar: false,
 | |
|     filterVar: () => true,
 | |
|   })
 | |
| 
 | |
|   const { handleAddVariable: handleAddEmptyVariable } = useVarList<TemplateTransformNodeType>({
 | |
|     inputs,
 | |
|     setInputs,
 | |
|   })
 | |
| 
 | |
|   const handleVarListChange = useCallback((newList: Variable[]) => {
 | |
|     const newInputs = produce(inputsRef.current, (draft: any) => {
 | |
|       draft.variables = newList
 | |
|     })
 | |
|     setInputs(newInputs)
 | |
|   }, [setInputs])
 | |
| 
 | |
|   const handleAddVariable = useCallback((payload: Variable) => {
 | |
|     const newInputs = produce(inputsRef.current, (draft: any) => {
 | |
|       draft.variables.push(payload)
 | |
|     })
 | |
|     setInputs(newInputs)
 | |
|   }, [setInputs])
 | |
| 
 | |
|   // rename var in code
 | |
|   const handleVarNameChange = useCallback((oldName: string, newName: string) => {
 | |
|     const newInputs = produce(inputsRef.current, (draft: any) => {
 | |
|       draft.template = draft.template.replaceAll(`{{ ${oldName} }}`, `{{ ${newName} }}`)
 | |
|     })
 | |
|     setInputs(newInputs)
 | |
|   }, [setInputs])
 | |
| 
 | |
|   useEffect(() => {
 | |
|     if (inputs.template)
 | |
|       return
 | |
| 
 | |
|     const isReady = defaultConfig && Object.keys(defaultConfig).length > 0
 | |
|     if (isReady) {
 | |
|       setInputs({
 | |
|         ...inputs,
 | |
|         ...defaultConfig,
 | |
|       })
 | |
|     }
 | |
|   // eslint-disable-next-line react-hooks/exhaustive-deps
 | |
|   }, [defaultConfig])
 | |
| 
 | |
|   const handleCodeChange = useCallback((template: string) => {
 | |
|     const newInputs = produce(inputsRef.current, (draft: any) => {
 | |
|       draft.template = template
 | |
|     })
 | |
|     setInputs(newInputs)
 | |
|   }, [setInputs])
 | |
| 
 | |
|   // single run
 | |
|   const {
 | |
|     isShowSingleRun,
 | |
|     hideSingleRun,
 | |
|     toVarInputs,
 | |
|     runningStatus,
 | |
|     handleRun,
 | |
|     handleStop,
 | |
|     runInputData,
 | |
|     setRunInputData,
 | |
|     runResult,
 | |
|   } = useOneStepRun<TemplateTransformNodeType>({
 | |
|     id,
 | |
|     data: inputs,
 | |
|     defaultRunInputData: {},
 | |
|   })
 | |
|   const varInputs = toVarInputs(inputs.variables)
 | |
| 
 | |
|   const inputVarValues = (() => {
 | |
|     const vars: Record<string, any> = {}
 | |
|     Object.keys(runInputData)
 | |
|       .forEach((key) => {
 | |
|         vars[key] = runInputData[key]
 | |
|       })
 | |
|     return vars
 | |
|   })()
 | |
| 
 | |
|   const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
 | |
|     setRunInputData(newPayload)
 | |
|   }, [setRunInputData])
 | |
| 
 | |
|   const filterVar = useCallback((varPayload: Var) => {
 | |
|     return [VarType.string, VarType.number, VarType.object, VarType.array, VarType.arrayNumber, VarType.arrayString, VarType.arrayObject].includes(varPayload.type)
 | |
|   }, [])
 | |
| 
 | |
|   return {
 | |
|     readOnly,
 | |
|     inputs,
 | |
|     availableVars,
 | |
|     handleVarListChange,
 | |
|     handleVarNameChange,
 | |
|     handleAddVariable,
 | |
|     handleAddEmptyVariable,
 | |
|     handleCodeChange,
 | |
|     filterVar,
 | |
|     // single run
 | |
|     isShowSingleRun,
 | |
|     hideSingleRun,
 | |
|     runningStatus,
 | |
|     handleRun,
 | |
|     handleStop,
 | |
|     varInputs,
 | |
|     inputVarValues,
 | |
|     setInputVarValues,
 | |
|     runResult,
 | |
|   }
 | |
| }
 | |
| 
 | |
| export default useConfig
 | 
