| 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) |
| } |
| |
| }, [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]) |
|
|
| |
| 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) |
| }, []) |
|
|
| |
| 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, |
| setHeaders, |
| addHeader, |
| isHeaderKeyValueEdit, |
| toggleIsHeaderKeyValueEdit, |
| |
| params, |
| setParams, |
| addParam, |
| isParamKeyValueEdit, |
| toggleIsParamKeyValueEdit, |
| |
| setBody, |
| |
| isShowAuthorization, |
| showAuthorization, |
| hideAuthorization, |
| setAuthorization, |
| setTimeout, |
| |
| isShowSingleRun, |
| hideSingleRun, |
| runningStatus, |
| handleRun, |
| handleStop, |
| varInputs, |
| inputVarValues, |
| setInputVarValues, |
| runResult, |
| } |
| } |
|
|
| export default useConfig |
|
|