1
- import { Input } from '../.. /components/ui/input'
2
- import React , { useEffect , useRef , useState } from ' react'
1
+ import { Input } from "@/app /components/ui/input" ;
2
+ import React , { useEffect , useRef , useState } from " react" ;
3
3
import {
4
4
Select ,
5
5
SelectContent ,
6
6
SelectItem ,
7
7
SelectTrigger ,
8
8
SelectValue ,
9
- } from "../../components/ui/select"
10
- import { Checkbox } from "../../components/ui/checkbox"
11
-
12
- import { Label } from "../../components/ui/label"
13
- import { RadioGroup , RadioGroupItem } from "../../components/ui/radio-group"
14
- import { Button } from '../../components/ui/button'
15
- import FieldEdit from './FieldEdit'
16
- import { db } from '../../configs'
17
- import { userResponses } from '../../configs/schema'
18
- import moment from 'moment'
19
- import { toast } from 'sonner'
20
- import { SignInButton , useUser } from '@clerk/nextjs'
21
-
22
- function FormUi ( { jsonForm, selectedTheme, selectedStyle,
23
- onFieldUpdate, deleteField, editable= true , formId= 0 , enabledSignIn= false } ) {
24
- const [ formData , setFormData ] = useState ( ) ;
25
- let formRef = useRef ( ) ;
26
- const { user, isSignedIn} = useUser ( ) ;
27
- const handleInputChange = ( event ) => {
28
- const { name, value} = event . target ;
9
+ } from "@/app/components/ui/select" ;
10
+ import { Checkbox } from "@/app/components/ui/checkbox" ;
11
+
12
+ import { Label } from "@/app/components/ui/label" ;
13
+ import { RadioGroup , RadioGroupItem } from "@/app/components/ui/radio-group" ;
14
+ import { Button } from "@/app/components/ui/button" ;
15
+ import FieldEdit from "./FieldEdit" ;
16
+ import { db } from "@/app/configs" ;
17
+ import { userResponses } from "@/app/configs/schema" ;
18
+ import moment from "moment" ;
19
+ import { toast } from "sonner" ;
20
+ import { SignInButton , useUser } from "@clerk/nextjs" ;
21
+
22
+ function FormUi ( {
23
+ jsonForm,
24
+ selectedTheme,
25
+ selectedStyle,
26
+ onFieldUpdate,
27
+ deleteField,
28
+ editable = true ,
29
+ formId = 0 ,
30
+ enabledSignIn = false ,
31
+ } ) {
32
+ const [ formData , setFormData ] = useState ( ) ;
33
+ let formRef = useRef ( ) ;
34
+ const { user, isSignedIn } = useUser ( ) ;
35
+ const handleInputChange = ( event ) => {
36
+ const { name, value } = event . target ;
29
37
setFormData ( {
30
38
...formData ,
31
- [ name ] :value
32
- } )
33
- }
39
+ [ name ] : value ,
40
+ } ) ;
41
+ } ;
34
42
35
- const hadleSelectChange = ( name , value ) => {
43
+ const hadleSelectChange = ( name , value ) => {
36
44
setFormData ( {
37
45
...formData ,
38
- [ name ] :value
39
- } )
40
- }
46
+ [ name ] : value ,
47
+ } ) ;
48
+ } ;
41
49
42
- const onFormSubmit = async ( event ) => {
43
- event . preventDefault ( )
50
+ const onFormSubmit = async ( event ) => {
51
+ event . preventDefault ( ) ;
44
52
console . log ( formData ) ;
45
53
46
- const result = await db . insert ( userResponses )
47
- . values ( {
48
- jsonResponse :formData ,
49
- createdAt :moment ( ) . format ( 'DD/MM/yyy' ) ,
50
- formRef :formId
51
- } )
54
+ const result = await db . insert ( userResponses ) . values ( {
55
+ jsonResponse : formData ,
56
+ createdAt : moment ( ) . format ( "DD/MM/yyy" ) ,
57
+ formRef : formId ,
58
+ } ) ;
52
59
53
- if ( result )
54
- {
60
+ if ( result ) {
55
61
formRef . reset ( ) ;
56
- toast ( 'Response Submitted Successfully !' )
62
+ toast ( "Response Submitted Successfully !" ) ;
63
+ } else {
64
+ toast ( "Error while saving your form !" ) ;
57
65
}
58
- else {
59
- toast ( 'Error while saving your form !' )
66
+ } ;
60
67
61
- }
62
- }
68
+ const handleCheckboxChange = ( fieldName , itemName , value ) => {
69
+ const list = formData ?. [ fieldName ] ? formData ?. [ fieldName ] : [ ] ;
63
70
64
- const handleCheckboxChange = ( fieldName , itemName , value ) => {
65
-
66
- const list = formData ?. [ fieldName ] ?formData ?. [ fieldName ] :[ ] ;
67
-
68
- if ( value )
69
- {
71
+ if ( value ) {
70
72
list . push ( {
71
- label :itemName ,
72
- value :value
73
- } )
73
+ label : itemName ,
74
+ value : value ,
75
+ } ) ;
74
76
setFormData ( {
75
77
...formData ,
76
- [ fieldName ] :list
77
- } )
78
- } else {
79
- const result = list . filter ( ( item ) => item . label == itemName ) ;
80
- setFormData ( {
81
- ...formData ,
82
- [ fieldName ] :result
83
- } )
78
+ [ fieldName ] : list ,
79
+ } ) ;
80
+ } else {
81
+ const result = list . filter ( ( item ) => item . label == itemName ) ;
82
+ setFormData ( {
83
+ ...formData ,
84
+ [ fieldName ] : result ,
85
+ } ) ;
84
86
}
85
-
86
- }
87
+ } ;
87
88
88
89
return (
89
- < form
90
-
91
- ref = { ( e ) => formRef = e }
92
- onSubmit = { onFormSubmit }
93
- className = 'border p-5 md:w-[600px] rounded-lg'
94
- data-theme = { selectedTheme }
95
- style = { {
96
- boxShadow : selectedStyle ?. key == 'boxshadow' && '5px 5px 0px black' ,
97
- border : selectedStyle ?. key == 'border' && selectedStyle . value
98
- } }
99
- >
100
-
101
- < h2 className = 'font-bold text-center text-2xl' > { jsonForm ?. formTitle } </ h2 >
102
- < h2 className = 'text-sm text-gray-400 text-center' > { jsonForm ?. formHeading } < /h2 >
90
+ < form
91
+ ref = { ( e ) => ( formRef = e ) }
92
+ onSubmit = { onFormSubmit }
93
+ className = "border p-5 md:w-[600px] rounded-lg"
94
+ data-theme = { selectedTheme }
95
+ style = { {
96
+ boxShadow : selectedStyle ?. key == "boxshadow" && "5px 5px 0px black" ,
97
+ border : selectedStyle ?. key == "border" && selectedStyle . value ,
98
+ } }
99
+ >
100
+ < h2 className = "font-bold text-center text-2xl" > { jsonForm ?. formTitle } </ h2 >
101
+ < h2 className = "text-sm text-gray-400 text-center" >
102
+ { jsonForm ?. formHeading }
103
+ </ h2 >
103
104
104
105
{ jsonForm ?. fields ?. map ( ( field , index ) => (
105
- < div key = { index } className = 'flex items-center gap-2' >
106
- { field . fieldType == 'select' ?
107
- < div className = 'my-3 w-full' >
108
- < label className = 'text-xs text-gray-500' > { field . label } </ label >
109
-
110
- < Select required = { field ?. required }
111
- onValueChange = { ( v ) => hadleSelectChange ( field . fieldName , v ) } >
106
+ < div key = { index } className = "flex items-center gap-2" >
107
+ { field . fieldType == "select" ? (
108
+ < div className = "my-3 w-full" >
109
+ < label className = "text-xs text-gray-500" > { field . label } </ label >
110
+
111
+ < Select
112
+ required = { field ?. required }
113
+ onValueChange = { ( v ) => hadleSelectChange ( field . fieldName , v ) }
114
+ >
112
115
< SelectTrigger className = "w-full bg-transparent" >
113
116
< SelectValue placeholder = { field . placeholder } />
114
117
</ SelectTrigger >
115
118
< SelectContent >
116
119
{ field . options . map ( ( item , index ) => (
117
- < SelectItem key = { index } value = { item . label ?item . label :item } > { item . label ?item . label :item } </ SelectItem >
120
+ < SelectItem
121
+ key = { index }
122
+ value = { item . label ? item . label : item }
123
+ >
124
+ { item . label ? item . label : item }
125
+ </ SelectItem >
118
126
) ) }
119
127
</ SelectContent >
120
128
</ Select >
121
129
</ div >
122
- : field . fieldType == 'radio' ?
123
- < div className = 'w-full my-3' >
124
- < label className = 'text-xs text-gray-500' > { field . label } </ label >
125
-
126
- < RadioGroup required = { field ?. required } >
127
- { field . options . map ( ( item , index ) => (
128
- < div key = { index } className = "flex items-center space-x-2" >
129
- < RadioGroupItem value = { item . label } id = { item . label }
130
- onClick = { ( ) => hadleSelectChange ( field . fieldName , item . label ) }
131
- />
132
- < Label htmlFor = { item . label } > { item . label } </ Label >
133
- </ div >
134
- ) ) }
135
-
136
-
137
- </ RadioGroup >
138
-
139
- </ div >
140
- :field . fieldType == 'checkbox' ?
141
- < div className = 'my-3 w-full' >
142
- < label className = 'text-xs text-gray-500' > { field ?. label } </ label >
143
- { field ?. options ?field ?. options ?. map ( ( item , index ) => (
144
- < div key = { index } className = 'flex gap-2 items-center' >
145
- < Checkbox
146
- onCheckedChange = { ( v ) => handleCheckboxChange ( field ?. label , item . label ?item . label :item , v ) } />
147
- < h2 > { item . label ?item . label :item } </ h2 >
148
-
130
+ ) : field . fieldType == "radio" ? (
131
+ < div className = "w-full my-3" >
132
+ < label className = "text-xs text-gray-500" > { field . label } </ label >
133
+
134
+ < RadioGroup required = { field ?. required } >
135
+ { field . options . map ( ( item , index ) => (
136
+ < div key = { index } className = "flex items-center space-x-2" >
137
+ < RadioGroupItem
138
+ value = { item . label }
139
+ id = { item . label }
140
+ onClick = { ( ) =>
141
+ hadleSelectChange ( field . fieldName , item . label )
142
+ }
143
+ />
144
+ < Label htmlFor = { item . label } > { item . label } </ Label >
145
+ </ div >
146
+ ) ) }
147
+ </ RadioGroup >
148
+ </ div >
149
+ ) : field . fieldType == "checkbox" ? (
150
+ < div className = "my-3 w-full" >
151
+ < label className = "text-xs text-gray-500" > { field ?. label } </ label >
152
+ { field ?. options ? (
153
+ field ?. options ?. map ( ( item , index ) => (
154
+ < div key = { index } className = "flex gap-2 items-center" >
155
+ < Checkbox
156
+ onCheckedChange = { ( v ) =>
157
+ handleCheckboxChange (
158
+ field ?. label ,
159
+ item . label ? item . label : item ,
160
+ v
161
+ )
162
+ }
163
+ />
164
+ < h2 > { item . label ? item . label : item } </ h2 >
149
165
</ div >
150
166
) )
151
- :
152
- < div className = 'flex gap-2 items-center' >
153
- < Checkbox required = { field . required } />
154
- < h2 > { field . label } </ h2 >
155
- </ div >
156
- }
167
+ ) : (
168
+ < div className = "flex gap-2 items-center" >
169
+ < Checkbox required = { field . required } />
170
+ < h2 > { field . label } </ h2 >
157
171
</ div >
158
-
159
- : < div className = 'my-3 w-full' >
160
- < label className = 'text-xs text-gray-500' > { field . label } </ label >
161
- < Input type = { field ?. type }
162
- placeholder = { field . placeholder }
163
- name = { field . fieldName }
164
- className = "bg-transparent"
165
- required = { field ?. required }
166
- onChange = { ( e ) => handleInputChange ( e ) }
167
- />
168
- </ div > }
169
-
170
- { editable && < div >
171
- < FieldEdit defaultValue = { field }
172
- onUpdate = { ( value ) => onFieldUpdate ( value , index ) }
173
- deleteField = { ( ) => deleteField ( index ) }
174
- />
175
- </ div > }
172
+ ) }
173
+ </ div >
174
+ ) : (
175
+ < div className = "my-3 w-full" >
176
+ < label className = "text-xs text-gray-500" > { field . label } </ label >
177
+ < Input
178
+ type = { field ?. type }
179
+ placeholder = { field . placeholder }
180
+ name = { field . fieldName }
181
+ className = "bg-transparent"
182
+ required = { field ?. required }
183
+ onChange = { ( e ) => handleInputChange ( e ) }
184
+ />
185
+ </ div >
186
+ ) }
187
+
188
+ { editable && (
189
+ < div >
190
+ < FieldEdit
191
+ defaultValue = { field }
192
+ onUpdate = { ( value ) => onFieldUpdate ( value , index ) }
193
+ deleteField = { ( ) => deleteField ( index ) }
194
+ />
195
+ </ div >
196
+ ) }
176
197
</ div >
177
198
) ) }
178
- { ! enabledSignIn ?
179
- < button className = ' btn btn-primary' > Submit</ button > :
180
- isSignedIn ?
181
- < button className = ' btn btn-primary' > Submit</ button > :
182
- < Button >
183
- < SignInButton mode = 'modal' > Sign In before Submit </ SignInButton >
184
- </ Button > }
185
-
186
-
199
+ { ! enabledSignIn ? (
200
+ < button className = " btn btn-primary" > Submit</ button >
201
+ ) : isSignedIn ? (
202
+ < button className = " btn btn-primary" > Submit</ button >
203
+ ) : (
204
+ < Button >
205
+ < SignInButton mode = "modal" > Sign In before Submit </ SignInButton >
206
+ </ Button >
207
+ ) }
187
208
</ form >
188
- )
209
+ ) ;
189
210
}
190
211
191
- export default FormUi
212
+ export default FormUi ;
0 commit comments