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