File size: 4,470 Bytes
c867d8f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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