Spaces:
Paused
Paused
| 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, | |
| // single run | |
| isShowSingleRun, | |
| hideSingleRun, | |
| runningStatus, | |
| handleRun, | |
| handleStop, | |
| varInputs, | |
| inputVarValues, | |
| setInputVarValues, | |
| runResult, | |
| } = useConfig(id, data) | |
| // To prevent prompt editor in body not update 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) | |