Spaces:
Building
Building
import { useCallback } from 'react' | |
import { useTranslation } from 'react-i18next' | |
import { useEmbeddedChatbotContext } from '../context' | |
import Input from './form-input' | |
import { PortalSelect } from '@/app/components/base/select' | |
import { InputVarType } from '@/app/components/workflow/types' | |
import { FileUploaderInAttachmentWrapper } from '@/app/components/base/file-uploader' | |
const Form = () => { | |
const { t } = useTranslation() | |
const { | |
appParams, | |
inputsForms, | |
newConversationInputs, | |
newConversationInputsRef, | |
handleNewConversationInputsChange, | |
isMobile, | |
} = useEmbeddedChatbotContext() | |
const handleFormChange = useCallback((variable: string, value: any) => { | |
handleNewConversationInputsChange({ | |
...newConversationInputsRef.current, | |
[variable]: value, | |
}) | |
}, [newConversationInputsRef, handleNewConversationInputsChange]) | |
const renderField = (form: any) => { | |
const { | |
label, | |
required, | |
variable, | |
options, | |
} = form | |
if (form.type === 'text-input' || form.type === 'paragraph') { | |
return ( | |
<Input | |
form={form} | |
value={newConversationInputs[variable]} | |
onChange={handleFormChange} | |
/> | |
) | |
} | |
if (form.type === 'number') { | |
return ( | |
<input | |
className="grow h-9 rounded-lg bg-gray-100 px-2.5 outline-none appearance-none" | |
type="number" | |
value={newConversationInputs[variable] || ''} | |
onChange={e => handleFormChange(variable, e.target.value)} | |
placeholder={`${label}${!required ? `(${t('appDebug.variableTable.optional')})` : ''}`} | |
/> | |
) | |
} | |
if (form.type === 'number') { | |
return ( | |
<input | |
className="grow h-9 rounded-lg bg-gray-100 px-2.5 outline-none appearance-none" | |
type="number" | |
value={newConversationInputs[variable] || ''} | |
onChange={e => handleFormChange(variable, e.target.value)} | |
placeholder={`${label}${!required ? `(${t('appDebug.variableTable.optional')})` : ''}`} | |
/> | |
) | |
} | |
if (form.type === InputVarType.singleFile) { | |
return ( | |
<FileUploaderInAttachmentWrapper | |
value={newConversationInputs[variable] ? [newConversationInputs[variable]] : []} | |
onChange={files => handleFormChange(variable, files[0])} | |
fileConfig={{ | |
allowed_file_types: form.allowed_file_types, | |
allowed_file_extensions: form.allowed_file_extensions, | |
allowed_file_upload_methods: form.allowed_file_upload_methods, | |
number_limits: 1, | |
fileUploadConfig: (appParams as any).system_parameters, | |
}} | |
/> | |
) | |
} | |
if (form.type === InputVarType.multiFiles) { | |
return ( | |
<FileUploaderInAttachmentWrapper | |
value={newConversationInputs[variable]} | |
onChange={files => handleFormChange(variable, files)} | |
fileConfig={{ | |
allowed_file_types: form.allowed_file_types, | |
allowed_file_extensions: form.allowed_file_extensions, | |
allowed_file_upload_methods: form.allowed_file_upload_methods, | |
number_limits: form.max_length, | |
fileUploadConfig: (appParams as any).system_parameters, | |
}} | |
/> | |
) | |
} | |
return ( | |
<PortalSelect | |
popupClassName='w-[200px]' | |
value={newConversationInputs[variable]} | |
items={options.map((option: string) => ({ value: option, name: option }))} | |
onSelect={item => handleFormChange(variable, item.value as string)} | |
placeholder={`${label}${!required ? `(${t('appDebug.variableTable.optional')})` : ''}`} | |
/> | |
) | |
} | |
if (!inputsForms.length) | |
return null | |
return ( | |
<div className='mb-4 py-2'> | |
{ | |
inputsForms.map(form => ( | |
<div | |
key={form.variable} | |
className={`flex mb-3 last-of-type:mb-0 text-sm text-gray-900 ${isMobile && '!flex-wrap'}`} | |
> | |
<div className={`shrink-0 mr-2 py-2 w-[128px] ${isMobile && '!w-full'}`}>{form.label}</div> | |
{renderField(form)} | |
</div> | |
)) | |
} | |
</div> | |
) | |
} | |
export default Form | |