| 
                        123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 | 
                        - import React, { useEffect, useState } from 'react'
 - import Button from '@/app/components/base/button'
 - import Input from '@/app/components/base/input'
 - import Textarea from '@/app/components/base/textarea'
 - import DatePicker from '@/app/components/base/date-and-time-picker/date-picker'
 - import TimePicker from '@/app/components/base/date-and-time-picker/time-picker'
 - import Checkbox from '@/app/components/base/checkbox'
 - import Select from '@/app/components/base/select'
 - 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',
 -   DATE = 'date',
 -   TIME = 'time',
 -   DATETIME = 'datetime',
 -   CHECKBOX = 'checkbox',
 -   SELECT = 'select',
 - }
 - const MarkdownForm = ({ node }: any) => {
 -   const { onSend } = useChatContext()
 - 
 -   const [formValues, setFormValues] = useState<{ [key: string]: any }>({})
 - 
 -   useEffect(() => {
 -     const initialValues: { [key: string]: any } = {}
 -     node.children.forEach((child: any) => {
 -       if ([SUPPORTED_TAGS.INPUT, SUPPORTED_TAGS.TEXTAREA].includes(child.tagName))
 -         initialValues[child.properties.name] = child.properties.value
 -     })
 -     setFormValues(initialValues)
 -   }, [node.children])
 - 
 -   const getFormValues = (children: any) => {
 -     const values: { [key: string]: any } = {}
 -     children.forEach((child: any) => {
 -       if ([SUPPORTED_TAGS.INPUT, SUPPORTED_TAGS.TEXTAREA].includes(child.tagName))
 -         values[child.properties.name] = formValues[child.properties.name]
 -     })
 -     return values
 -   }
 - 
 -   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 && Object.values(SUPPORTED_TYPES).includes(child.properties.type)) {
 -           if (child.properties.type === SUPPORTED_TYPES.DATE || child.properties.type === SUPPORTED_TYPES.DATETIME) {
 -             return (
 -               <DatePicker
 -                 key={index}
 -                 value={formValues[child.properties.name]}
 -                 needTimePicker={child.properties.type === SUPPORTED_TYPES.DATETIME}
 -                 onChange={(date) => {
 -                   setFormValues(prevValues => ({
 -                     ...prevValues,
 -                     [child.properties.name]: date,
 -                   }))
 -                 }}
 -                 onClear={() => {
 -                   setFormValues(prevValues => ({
 -                     ...prevValues,
 -                     [child.properties.name]: undefined,
 -                   }))
 -                 }}
 -               />
 -             )
 -           }
 -           if (child.properties.type === SUPPORTED_TYPES.TIME) {
 -             return (
 -               <TimePicker
 -                 key={index}
 -                 value={formValues[child.properties.name]}
 -                 onChange={(time) => {
 -                   setFormValues(prevValues => ({
 -                     ...prevValues,
 -                     [child.properties.name]: time,
 -                   }))
 -                 }}
 -                 onClear={() => {
 -                   setFormValues(prevValues => ({
 -                     ...prevValues,
 -                     [child.properties.name]: undefined,
 -                   }))
 -                 }}
 -               />
 -             )
 -           }
 -           if (child.properties.type === SUPPORTED_TYPES.CHECKBOX) {
 -             return (
 -               <div className='mt-2 flex items-center h-6 space-x-2' key={index}>
 -                 <Checkbox
 -                   key={index}
 -                   checked={formValues[child.properties.name]}
 -                   onCheck={() => {
 -                     setFormValues(prevValues => ({
 -                       ...prevValues,
 -                       [child.properties.name]: !prevValues[child.properties.name],
 -                     }))
 -                   }}
 -                 />
 -                 <span>{child.properties.dataTip || child.properties['data-tip'] || ''}</span>
 -               </div>
 -             )
 -           }
 -           if (child.properties.type === SUPPORTED_TYPES.SELECT) {
 -             return (
 -               <Select
 -                 key={index}
 -                 allowSearch={false}
 -                 className="w-full"
 -                 items={(() => {
 -                   let options = child.properties.dataOptions || child.properties['data-options'] || []
 -                   if (typeof options === 'string') {
 -                     try {
 -                       options = JSON.parse(options)
 -                     }
 -                     catch (e) {
 -                       console.error('Failed to parse options:', e)
 -                       options = []
 -                     }
 -                   }
 -                   return options.map((option: string) => ({
 -                     name: option,
 -                     value: option,
 -                   }))
 -                 })()}
 -                 defaultValue={formValues[child.properties.name]}
 -                 onSelect={(item) => {
 -                   setFormValues(prevValues => ({
 -                     ...prevValues,
 -                     [child.properties.name]: item.value,
 -                   }))
 -                 }}
 -               />
 -             )
 -           }
 - 
 -           return (
 -             <Input
 -               key={index}
 -               type={child.properties.type}
 -               name={child.properties.name}
 -               placeholder={child.properties.placeholder}
 -               value={formValues[child.properties.name]}
 -               onChange={(e) => {
 -                 setFormValues(prevValues => ({
 -                   ...prevValues,
 -                   [child.properties.name]: e.target.value,
 -                 }))
 -               }}
 -             />
 -           )
 -         }
 -         if (child.tagName === SUPPORTED_TAGS.TEXTAREA) {
 -           return (
 -             <Textarea
 -               key={index}
 -               name={child.properties.name}
 -               placeholder={child.properties.placeholder}
 -               value={formValues[child.properties.name]}
 -               onChange={(e) => {
 -                 setFormValues(prevValues => ({
 -                   ...prevValues,
 -                   [child.properties.name]: 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
 
 
  |