Spaces:
Build error
Build error
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 | |