Spaces:
Build error
Build error
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) | |
} | |
// eslint-disable-next-line react-hooks/exhaustive-deps | |
}, [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) | |
}, []) | |
// single run | |
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, | |
// single run | |
isShowSingleRun, | |
hideSingleRun, | |
runningStatus, | |
isCompleted, | |
handleRun, | |
handleStop, | |
varInputs, | |
inputVarValues, | |
setInputVarValues, | |
runResult, | |
handleCodeAndVarsChange, | |
} | |
} | |
export default useConfig | |