|
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 |
|
|