Spaces:
Build error
Build error
File size: 4,333 Bytes
a8b3f00 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
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 supportedTypes = ['text', 'password', 'email', 'number']
// <form data-format="text">
// <label for="username">Username:</label>
// <input type="text" name="username" />
// <label for="password">Password:</label>
// <input type="password" name="password" />
// <label for="content">Content:</label>
// <textarea name="content"></textarea>
// <button data-size="small" data-variant="primary">Login</button>
// </form>
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
|