import { memo, useCallback, useEffect, 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 { getProcessedInputs, } from '@/app/components/base/chat/chat/utils' import { useCheckInputsForms } from '@/app/components/base/chat/chat/check-input-forms-hooks' import { useHooksStore } from '../hooks-store' type Props = { onRun: () => void } const InputsPanel = ({ onRun }: Props) => { const { t } = useTranslation() const workflowStore = useWorkflowStore() const { inputs, setInputs } = useStore(s => ({ inputs: s.inputs, setInputs: s.setInputs, })) const fileSettings = useHooksStore(s => s.configsMap?.fileSettings) const nodes = useNodes() 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 initialInputs = useMemo(() => { const initInputs: Record = {} if (startVariables) { startVariables.forEach((variable) => { if (variable.default) initInputs[variable.variable] = variable.default }) } return initInputs }, [startVariables]) useEffect(() => { setInputs({ ...initialInputs, ...inputs, }) }, [initialInputs]) 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 ( <>
{ variables.map((variable, index) => (
handleValueChange(variable.variable, v)} />
)) }
) } export default memo(InputsPanel)