Spaces:
Paused
Paused
| import { useCallback, useEffect, useMemo, useState } from 'react' | |
| import produce from 'immer' | |
| import { useBoolean } from 'ahooks' | |
| import useVarList from '../_base/hooks/use-var-list' | |
| import { VarType } from '../../types' | |
| import type { Var } from '../../types' | |
| import { useStore } from '../../store' | |
| import { type Authorization, type Body, BodyType, type HttpNodeType, type Method, type Timeout } from './types' | |
| import useKeyValueList from './hooks/use-key-value-list' | |
| import { transformToBodyPayload } from './utils' | |
| 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' | |
| const useConfig = (id: string, payload: HttpNodeType) => { | |
| const { nodesReadOnly: readOnly } = useNodesReadOnly() | |
| const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type] | |
| const { inputs, setInputs } = useNodeCrud<HttpNodeType>(id, payload) | |
| const { handleVarListChange, handleAddVariable } = useVarList<HttpNodeType>({ | |
| inputs, | |
| setInputs, | |
| }) | |
| const [isDataReady, setIsDataReady] = useState(false) | |
| useEffect(() => { | |
| const isReady = defaultConfig && Object.keys(defaultConfig).length > 0 | |
| if (isReady) { | |
| const newInputs = { | |
| ...defaultConfig, | |
| ...inputs, | |
| } | |
| const bodyData = newInputs.body.data | |
| if (typeof bodyData === 'string') | |
| newInputs.body.data = transformToBodyPayload(bodyData, [BodyType.formData, BodyType.xWwwFormUrlencoded].includes(newInputs.body.type)) | |
| setInputs(newInputs) | |
| setIsDataReady(true) | |
| } | |
| // eslint-disable-next-line react-hooks/exhaustive-deps | |
| }, [defaultConfig]) | |
| const handleMethodChange = useCallback((method: Method) => { | |
| const newInputs = produce(inputs, (draft: HttpNodeType) => { | |
| draft.method = method | |
| }) | |
| setInputs(newInputs) | |
| }, [inputs, setInputs]) | |
| const handleUrlChange = useCallback((url: string) => { | |
| const newInputs = produce(inputs, (draft: HttpNodeType) => { | |
| draft.url = url | |
| }) | |
| setInputs(newInputs) | |
| }, [inputs, setInputs]) | |
| const handleFieldChange = useCallback((field: string) => { | |
| return (value: string) => { | |
| const newInputs = produce(inputs, (draft: HttpNodeType) => { | |
| (draft as any)[field] = value | |
| }) | |
| setInputs(newInputs) | |
| } | |
| }, [inputs, setInputs]) | |
| const { | |
| list: headers, | |
| setList: setHeaders, | |
| addItem: addHeader, | |
| isKeyValueEdit: isHeaderKeyValueEdit, | |
| toggleIsKeyValueEdit: toggleIsHeaderKeyValueEdit, | |
| } = useKeyValueList(inputs.headers, handleFieldChange('headers')) | |
| const { | |
| list: params, | |
| setList: setParams, | |
| addItem: addParam, | |
| isKeyValueEdit: isParamKeyValueEdit, | |
| toggleIsKeyValueEdit: toggleIsParamKeyValueEdit, | |
| } = useKeyValueList(inputs.params, handleFieldChange('params')) | |
| const setBody = useCallback((data: Body) => { | |
| const newInputs = produce(inputs, (draft: HttpNodeType) => { | |
| draft.body = data | |
| }) | |
| setInputs(newInputs) | |
| }, [inputs, setInputs]) | |
| // authorization | |
| const [isShowAuthorization, { | |
| setTrue: showAuthorization, | |
| setFalse: hideAuthorization, | |
| }] = useBoolean(false) | |
| const setAuthorization = useCallback((authorization: Authorization) => { | |
| const newInputs = produce(inputs, (draft: HttpNodeType) => { | |
| draft.authorization = authorization | |
| }) | |
| setInputs(newInputs) | |
| }, [inputs, setInputs]) | |
| const setTimeout = useCallback((timeout: Timeout) => { | |
| const newInputs = produce(inputs, (draft: HttpNodeType) => { | |
| draft.timeout = timeout | |
| }) | |
| setInputs(newInputs) | |
| }, [inputs, setInputs]) | |
| const filterVar = useCallback((varPayload: Var) => { | |
| return [VarType.string, VarType.number, VarType.secret].includes(varPayload.type) | |
| }, []) | |
| // single run | |
| const { | |
| isShowSingleRun, | |
| hideSingleRun, | |
| getInputVars, | |
| runningStatus, | |
| handleRun, | |
| handleStop, | |
| runInputData, | |
| setRunInputData, | |
| runResult, | |
| } = useOneStepRun<HttpNodeType>({ | |
| id, | |
| data: inputs, | |
| defaultRunInputData: {}, | |
| }) | |
| const fileVarInputs = useMemo(() => { | |
| if (!Array.isArray(inputs.body.data)) | |
| return '' | |
| const res = inputs.body.data | |
| .filter(item => item.file?.length) | |
| .map(item => item.file ? `{{#${item.file.join('.')}#}}` : '') | |
| .join(' ') | |
| return res | |
| }, [inputs.body.data]) | |
| const varInputs = getInputVars([ | |
| inputs.url, | |
| inputs.headers, | |
| inputs.params, | |
| typeof inputs.body.data === 'string' ? inputs.body.data : inputs.body.data.map(item => item.value).join(''), | |
| fileVarInputs, | |
| ]) | |
| 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]) | |
| return { | |
| readOnly, | |
| isDataReady, | |
| inputs, | |
| handleVarListChange, | |
| handleAddVariable, | |
| filterVar, | |
| handleMethodChange, | |
| handleUrlChange, | |
| // headers | |
| headers, | |
| setHeaders, | |
| addHeader, | |
| isHeaderKeyValueEdit, | |
| toggleIsHeaderKeyValueEdit, | |
| // params | |
| params, | |
| setParams, | |
| addParam, | |
| isParamKeyValueEdit, | |
| toggleIsParamKeyValueEdit, | |
| // body | |
| setBody, | |
| // authorization | |
| isShowAuthorization, | |
| showAuthorization, | |
| hideAuthorization, | |
| setAuthorization, | |
| setTimeout, | |
| // single run | |
| isShowSingleRun, | |
| hideSingleRun, | |
| runningStatus, | |
| handleRun, | |
| handleStop, | |
| varInputs, | |
| inputVarValues, | |
| setInputVarValues, | |
| runResult, | |
| } | |
| } | |
| export default useConfig | |