| import Button from '@/app/components/base/button' |
| import Input from '@/app/components/base/input' |
| import Textarea from '@/app/components/base/textarea' |
| import { useChatContext } from '@/app/components/base/chat/chat/context' |
|
|
| enum DATA_FORMAT { |
| TEXT = 'text', |
| JSON = 'json', |
| } |
| enum SUPPORTED_TAGS { |
| LABEL = 'label', |
| INPUT = 'input', |
| TEXTAREA = 'textarea', |
| BUTTON = 'button', |
| } |
| enum SUPPORTED_TYPES { |
| TEXT = 'text', |
| PASSWORD = 'password', |
| EMAIL = 'email', |
| NUMBER = 'number', |
| } |
| const MarkdownForm = ({ node }: any) => { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const { onSend } = useChatContext() |
|
|
| const getFormValues = (children: any) => { |
| const formValues: { [key: string]: any } = {} |
| children.forEach((child: any) => { |
| if (child.tagName === SUPPORTED_TAGS.INPUT) |
| formValues[child.properties.name] = child.properties.value |
| if (child.tagName === SUPPORTED_TAGS.TEXTAREA) |
| formValues[child.properties.name] = child.properties.value |
| }) |
| return formValues |
| } |
| const onSubmit = (e: any) => { |
| e.preventDefault() |
| const format = node.properties.dataFormat || DATA_FORMAT.TEXT |
| const result = getFormValues(node.children) |
| if (format === DATA_FORMAT.JSON) { |
| onSend?.(JSON.stringify(result)) |
| } |
| else { |
| const textResult = Object.entries(result) |
| .map(([key, value]) => `${key}: ${value}`) |
| .join('\n') |
| onSend?.(textResult) |
| } |
| } |
| return ( |
| <form |
| autoComplete="off" |
| className='flex flex-col self-stretch' |
| onSubmit={(e: any) => { |
| e.preventDefault() |
| e.stopPropagation() |
| }} |
| > |
| {node.children.filter((i: any) => i.type === 'element').map((child: any, index: number) => { |
| if (child.tagName === SUPPORTED_TAGS.LABEL) { |
| return ( |
| <label |
| key={index} |
| htmlFor={child.properties.for} |
| className="my-2 system-md-semibold text-text-secondary" |
| > |
| {child.children[0]?.value || ''} |
| </label> |
| ) |
| } |
| if (child.tagName === SUPPORTED_TAGS.INPUT) { |
| if (Object.values(SUPPORTED_TYPES).includes(child.properties.type)) { |
| return ( |
| <Input |
| key={index} |
| type={child.properties.type} |
| name={child.properties.name} |
| placeholder={child.properties.placeholder} |
| value={child.properties.value} |
| onChange={(e) => { |
| e.preventDefault() |
| child.properties.value = e.target.value |
| }} |
| /> |
| ) |
| } |
| else { |
| return <p key={index}>Unsupported input type: {child.properties.type}</p> |
| } |
| } |
| if (child.tagName === SUPPORTED_TAGS.TEXTAREA) { |
| return ( |
| <Textarea |
| key={index} |
| name={child.properties.name} |
| placeholder={child.properties.placeholder} |
| value={child.properties.value} |
| onChange={(e) => { |
| e.preventDefault() |
| child.properties.value = e.target.value |
| }} |
| /> |
| ) |
| } |
| if (child.tagName === SUPPORTED_TAGS.BUTTON) { |
| const variant = child.properties.dataVariant |
| const size = child.properties.dataSize |
| |
| return ( |
| <Button |
| variant={variant} |
| size={size} |
| className='mt-4' |
| key={index} |
| onClick={onSubmit} |
| > |
| <span className='text-[13px]'>{child.children[0]?.value || ''}</span> |
| </Button> |
| ) |
| } |
| |
| return <p key={index}>Unsupported tag: {child.tagName}</p> |
| })} |
| </form> |
| ) |
| } |
| MarkdownForm.displayName = 'MarkdownForm' |
| export default MarkdownForm |
|
|