|
import { useCallback, useEffect, useState } from 'react' |
|
import produce from 'immer' |
|
import useVarList from '../_base/hooks/use-var-list' |
|
import useOutputVarList from '../_base/hooks/use-output-var-list' |
|
import { BlockEnum, VarType } from '../../types' |
|
import type { Var, Variable } from '../../types' |
|
import { useStore } from '../../store' |
|
import type { CodeNodeType, OutputVar } from './types' |
|
import { CodeLanguage } 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 { fetchNodeDefault } from '@/service/workflow' |
|
import { useStore as useAppStore } from '@/app/components/app/store' |
|
import { |
|
useNodesReadOnly, |
|
} from '@/app/components/workflow/hooks' |
|
|
|
const useConfig = (id: string, payload: CodeNodeType) => { |
|
const { nodesReadOnly: readOnly } = useNodesReadOnly() |
|
|
|
const appId = useAppStore.getState().appDetail?.id |
|
|
|
const [allLanguageDefault, setAllLanguageDefault] = useState<Record<CodeLanguage, CodeNodeType> | null>(null) |
|
useEffect(() => { |
|
if (appId) { |
|
(async () => { |
|
const { config: javaScriptConfig } = await fetchNodeDefault(appId, BlockEnum.Code, { code_language: CodeLanguage.javascript }) as any |
|
const { config: pythonConfig } = await fetchNodeDefault(appId, BlockEnum.Code, { code_language: CodeLanguage.python3 }) as any |
|
setAllLanguageDefault({ |
|
[CodeLanguage.javascript]: javaScriptConfig as CodeNodeType, |
|
[CodeLanguage.python3]: pythonConfig as CodeNodeType, |
|
} as any) |
|
})() |
|
} |
|
}, [appId]) |
|
|
|
const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type] |
|
const { inputs, setInputs } = useNodeCrud<CodeNodeType>(id, payload) |
|
const { handleVarListChange, handleAddVariable } = useVarList<CodeNodeType>({ |
|
inputs, |
|
setInputs, |
|
}) |
|
|
|
const [outputKeyOrders, setOutputKeyOrders] = useState<string[]>([]) |
|
const syncOutputKeyOrders = useCallback((outputs: OutputVar) => { |
|
setOutputKeyOrders(Object.keys(outputs)) |
|
}, []) |
|
useEffect(() => { |
|
if (inputs.code) { |
|
if (inputs.outputs && Object.keys(inputs.outputs).length > 0) |
|
syncOutputKeyOrders(inputs.outputs) |
|
|
|
return |
|
} |
|
|
|
const isReady = defaultConfig && Object.keys(defaultConfig).length > 0 |
|
if (isReady) { |
|
setInputs({ |
|
...inputs, |
|
...defaultConfig, |
|
}) |
|
syncOutputKeyOrders(defaultConfig.outputs) |
|
} |
|
|
|
}, [defaultConfig]) |
|
|
|
const handleCodeChange = useCallback((code: string) => { |
|
const newInputs = produce(inputs, (draft) => { |
|
draft.code = code |
|
}) |
|
setInputs(newInputs) |
|
}, [inputs, setInputs]) |
|
|
|
const handleCodeLanguageChange = useCallback((codeLanguage: CodeLanguage) => { |
|
const currDefaultConfig = allLanguageDefault?.[codeLanguage] |
|
|
|
const newInputs = produce(inputs, (draft) => { |
|
draft.code_language = codeLanguage |
|
if (!currDefaultConfig) |
|
return |
|
draft.code = currDefaultConfig.code |
|
draft.variables = currDefaultConfig.variables |
|
draft.outputs = currDefaultConfig.outputs |
|
}) |
|
setInputs(newInputs) |
|
}, [allLanguageDefault, inputs, setInputs]) |
|
|
|
const { |
|
handleVarsChange, |
|
handleAddVariable: handleAddOutputVariable, |
|
handleRemoveVariable, |
|
isShowRemoveVarConfirm, |
|
hideRemoveVarConfirm, |
|
onRemoveVarConfirm, |
|
} = useOutputVarList<CodeNodeType>({ |
|
id, |
|
inputs, |
|
setInputs, |
|
outputKeyOrders, |
|
onOutputKeyOrdersChange: setOutputKeyOrders, |
|
}) |
|
|
|
const filterVar = useCallback((varPayload: Var) => { |
|
return [VarType.string, VarType.number, VarType.secret, VarType.object, VarType.array, VarType.arrayNumber, VarType.arrayString, VarType.arrayObject].includes(varPayload.type) |
|
}, []) |
|
|
|
|
|
const { |
|
isShowSingleRun, |
|
hideSingleRun, |
|
toVarInputs, |
|
runningStatus, |
|
isCompleted, |
|
handleRun, |
|
handleStop, |
|
runInputData, |
|
setRunInputData, |
|
runResult, |
|
} = useOneStepRun<CodeNodeType>({ |
|
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 handleCodeAndVarsChange = useCallback((code: string, inputVariables: Variable[], outputVariables: OutputVar) => { |
|
const newInputs = produce(inputs, (draft) => { |
|
draft.code = code |
|
draft.variables = inputVariables |
|
draft.outputs = outputVariables |
|
}) |
|
setInputs(newInputs) |
|
syncOutputKeyOrders(outputVariables) |
|
}, [inputs, setInputs, syncOutputKeyOrders]) |
|
return { |
|
readOnly, |
|
inputs, |
|
outputKeyOrders, |
|
handleVarListChange, |
|
handleAddVariable, |
|
handleRemoveVariable, |
|
handleCodeChange, |
|
handleCodeLanguageChange, |
|
handleVarsChange, |
|
filterVar, |
|
handleAddOutputVariable, |
|
isShowRemoveVarConfirm, |
|
hideRemoveVarConfirm, |
|
onRemoveVarConfirm, |
|
|
|
isShowSingleRun, |
|
hideSingleRun, |
|
runningStatus, |
|
isCompleted, |
|
handleRun, |
|
handleStop, |
|
varInputs, |
|
inputVarValues, |
|
setInputVarValues, |
|
runResult, |
|
handleCodeAndVarsChange, |
|
} |
|
} |
|
|
|
export default useConfig |
|
|