|
import type { FC } from 'react' |
|
import React from 'react' |
|
import { useTranslation } from 'react-i18next' |
|
import useConfig from './use-config' |
|
import ApiInput from './components/api-input' |
|
import KeyValue from './components/key-value' |
|
import EditBody from './components/edit-body' |
|
import AuthorizationModal from './components/authorization' |
|
import type { HttpNodeType } from './types' |
|
import Timeout from './components/timeout' |
|
import cn from '@/utils/classnames' |
|
import Field from '@/app/components/workflow/nodes/_base/components/field' |
|
import Split from '@/app/components/workflow/nodes/_base/components/split' |
|
import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars' |
|
import { Settings01 } from '@/app/components/base/icons/src/vender/line/general' |
|
import type { NodePanelProps } from '@/app/components/workflow/types' |
|
import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form' |
|
import ResultPanel from '@/app/components/workflow/run/result-panel' |
|
|
|
const i18nPrefix = 'workflow.nodes.http' |
|
|
|
const Panel: FC<NodePanelProps<HttpNodeType>> = ({ |
|
id, |
|
data, |
|
}) => { |
|
const { t } = useTranslation() |
|
|
|
const { |
|
readOnly, |
|
isDataReady, |
|
inputs, |
|
handleMethodChange, |
|
handleUrlChange, |
|
headers, |
|
setHeaders, |
|
addHeader, |
|
params, |
|
setParams, |
|
addParam, |
|
setBody, |
|
isShowAuthorization, |
|
showAuthorization, |
|
hideAuthorization, |
|
setAuthorization, |
|
setTimeout, |
|
|
|
isShowSingleRun, |
|
hideSingleRun, |
|
runningStatus, |
|
handleRun, |
|
handleStop, |
|
varInputs, |
|
inputVarValues, |
|
setInputVarValues, |
|
runResult, |
|
} = useConfig(id, data) |
|
|
|
if (!isDataReady) |
|
return null |
|
|
|
return ( |
|
<div className='mt-2'> |
|
<div className='px-4 pb-4 space-y-4'> |
|
<Field |
|
title={t(`${i18nPrefix}.api`)} |
|
operations={ |
|
<div |
|
onClick={showAuthorization} |
|
className={cn(!readOnly && 'cursor-pointer hover:bg-gray-50', 'flex items-center h-6 space-x-1 px-2 rounded-md ')} |
|
> |
|
{!readOnly && <Settings01 className='w-3 h-3 text-gray-500' />} |
|
<div className='text-xs font-medium text-gray-500'> |
|
{t(`${i18nPrefix}.authorization.authorization`)} |
|
<span className='ml-1 text-gray-700'>{t(`${i18nPrefix}.authorization.${inputs.authorization.type}`)}</span> |
|
</div> |
|
</div> |
|
} |
|
> |
|
<ApiInput |
|
nodeId={id} |
|
readonly={readOnly} |
|
method={inputs.method} |
|
onMethodChange={handleMethodChange} |
|
url={inputs.url} |
|
onUrlChange={handleUrlChange} |
|
/> |
|
</Field> |
|
<Field |
|
title={t(`${i18nPrefix}.headers`)} |
|
> |
|
<KeyValue |
|
nodeId={id} |
|
list={headers} |
|
onChange={setHeaders} |
|
onAdd={addHeader} |
|
readonly={readOnly} |
|
/> |
|
</Field> |
|
<Field |
|
title={t(`${i18nPrefix}.params`)} |
|
> |
|
<KeyValue |
|
nodeId={id} |
|
list={params} |
|
onChange={setParams} |
|
onAdd={addParam} |
|
readonly={readOnly} |
|
/> |
|
</Field> |
|
<Field |
|
title={t(`${i18nPrefix}.body`)} |
|
> |
|
<EditBody |
|
nodeId={id} |
|
readonly={readOnly} |
|
payload={inputs.body} |
|
onChange={setBody} |
|
/> |
|
</Field> |
|
</div> |
|
<Split /> |
|
<div className='px-4 pt-4 pb-4'> |
|
<Timeout |
|
nodeId={id} |
|
readonly={readOnly} |
|
payload={inputs.timeout} |
|
onChange={setTimeout} |
|
/> |
|
</div> |
|
{(isShowAuthorization && !readOnly) && ( |
|
<AuthorizationModal |
|
nodeId={id} |
|
isShow |
|
onHide={hideAuthorization} |
|
payload={inputs.authorization} |
|
onChange={setAuthorization} |
|
/> |
|
)} |
|
<Split /> |
|
<div className='px-4 pt-4 pb-2'> |
|
<OutputVars> |
|
<> |
|
<VarItem |
|
name='body' |
|
type='string' |
|
description={t(`${i18nPrefix}.outputVars.body`)} |
|
/> |
|
<VarItem |
|
name='status_code' |
|
type='number' |
|
description={t(`${i18nPrefix}.outputVars.statusCode`)} |
|
/> |
|
<VarItem |
|
name='headers' |
|
type='object' |
|
description={t(`${i18nPrefix}.outputVars.headers`)} |
|
/> |
|
<VarItem |
|
name='files' |
|
type='Array[File]' |
|
description={t(`${i18nPrefix}.outputVars.files`)} |
|
/> |
|
</> |
|
</OutputVars> |
|
</div> |
|
{isShowSingleRun && ( |
|
<BeforeRunForm |
|
nodeName={inputs.title} |
|
onHide={hideSingleRun} |
|
forms={[ |
|
{ |
|
inputs: varInputs, |
|
values: inputVarValues, |
|
onChange: setInputVarValues, |
|
}, |
|
]} |
|
runningStatus={runningStatus} |
|
onRun={handleRun} |
|
onStop={handleStop} |
|
result={<ResultPanel {...runResult} showSteps={false} />} |
|
/> |
|
)} |
|
</div > |
|
) |
|
} |
|
|
|
export default React.memo(Panel) |
|
|