123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- import {
- memo,
- useCallback,
- useMemo,
- } from 'react'
- import { useTranslation } from 'react-i18next'
- import { useNodes } from 'reactflow'
- import FormItem from '../nodes/_base/components/before-run-form/form-item'
- import {
- BlockEnum,
- InputVarType,
- WorkflowRunningStatus,
- } from '../types'
- import {
- useStore,
- useWorkflowStore,
- } from '../store'
- import { useWorkflowRun } from '../hooks'
- import type { StartNodeType } from '../nodes/start/types'
- import { TransferMethod } from '../../base/text-generation/types'
- import Button from '@/app/components/base/button'
- import { useFeatures } from '@/app/components/base/features/hooks'
- import {
- getProcessedInputs,
- } from '@/app/components/base/chat/chat/utils'
- import { useCheckInputsForms } from '@/app/components/base/chat/chat/check-input-forms-hooks'
- type Props = {
- onRun: () => void
- }
- const InputsPanel = ({ onRun }: Props) => {
- const { t } = useTranslation()
- const workflowStore = useWorkflowStore()
- const fileSettings = useFeatures(s => s.features.file)
- const nodes = useNodes<StartNodeType>()
- const inputs = useStore(s => s.inputs)
- const files = useStore(s => s.files)
- const workflowRunningData = useStore(s => s.workflowRunningData)
- const {
- handleRun,
- } = useWorkflowRun()
- const startNode = nodes.find(node => node.data.type === BlockEnum.Start)
- const startVariables = startNode?.data.variables
- const { checkInputsForm } = useCheckInputsForms()
- const variables = useMemo(() => {
- const data = startVariables || []
- if (fileSettings?.image?.enabled) {
- return [
- ...data,
- {
- type: InputVarType.files,
- variable: '__image',
- required: false,
- label: 'files',
- },
- ]
- }
- return data
- }, [fileSettings?.image?.enabled, startVariables])
- const handleValueChange = (variable: string, v: any) => {
- const {
- inputs,
- setInputs,
- } = workflowStore.getState()
- if (variable === '__image') {
- workflowStore.setState({
- files: v,
- })
- }
- else {
- setInputs({
- ...inputs,
- [variable]: v,
- })
- }
- }
- const doRun = useCallback(() => {
- if (!checkInputsForm(inputs, variables as any))
- return
- onRun()
- handleRun({ inputs: getProcessedInputs(inputs, variables as any), files })
- }, [files, handleRun, inputs, onRun, variables, checkInputsForm])
- const canRun = useMemo(() => {
- if (files?.some(item => (item.transfer_method as any) === TransferMethod.local_file && !item.upload_file_id))
- return false
- return true
- }, [files])
- return (
- <>
- <div className='pt-3 px-4 pb-2'>
- {
- variables.map((variable, index) => (
- <div
- key={variable.variable}
- className='mb-2 last-of-type:mb-0'
- >
- <FormItem
- autoFocus={index === 0}
- className='!block'
- payload={variable}
- value={inputs[variable.variable]}
- onChange={v => handleValueChange(variable.variable, v)}
- />
- </div>
- ))
- }
- </div>
- <div className='flex items-center justify-between px-4 py-2'>
- <Button
- variant='primary'
- disabled={!canRun || workflowRunningData?.result?.status === WorkflowRunningStatus.Running}
- className='w-full'
- onClick={doRun}
- >
- {t('workflow.singleRun.startRun')}
- </Button>
- </div>
- </>
- )
- }
- export default memo(InputsPanel)
|