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