1
- import React , { useState , useEffect } from 'react' ;
1
+ import React from 'react' ;
2
+ import useForm from './useForm' ;
2
3
3
- function useForm ( validator , initialValue , callback ) {
4
- const [ state , setState ] = useState ( initialValue ) ;
5
- const [ disable , setDisable ] = useState ( true ) ;
6
- const [ isDirty , setIsDirty ] = useState ( false ) ;
7
-
8
- useEffect ( ( ) => {
9
- if ( isDirty ) {
10
- setDisable ( validateState ( ) ) ;
11
- }
12
- } , [ state ] ) ;
13
-
14
- useEffect ( ( ) => {
15
- setDisable ( validateState ( ) ) ;
16
- } , [ ] ) ;
17
-
18
- function handleOnChange ( event ) {
19
- setIsDirty ( true ) ;
20
-
21
- const name = event . target . name ;
22
- const value = event . target . value ;
23
-
24
- let error = '' ;
25
- if ( validator [ name ] . required ) {
26
- if ( ! value ) {
27
- error = 'This is required field.' ;
28
- }
29
- }
30
-
31
- if (
32
- typeof validator [ name ] . validator === 'object' &&
33
- validator [ name ] . validator !== null
34
- ) {
35
- if ( value && ! validator [ name ] . validator . regEx . test ( value ) ) {
36
- error = validator [ name ] . validator . error ;
37
- }
38
- }
39
-
40
- setState ( prevState => ( {
41
- ...prevState ,
42
- [ name ] : { value, error } ,
43
- } ) ) ;
44
- }
45
-
46
- function handleOnSubmit ( event ) {
47
- event . preventDefault ( ) ;
48
-
49
- callback ( ) ;
50
- }
51
-
52
- function validateState ( ) {
53
- return Object . keys ( validator ) . some ( key => {
54
- const isRequiredField = validator [ key ] . required ;
55
- const hasValue = state [ key ] . value ;
56
-
57
- return ( ! hasValue && isRequiredField ) || state [ key ] . error ;
58
- } ) ;
59
- }
4
+ function Form ( ) {
5
+ // Define your state schema
6
+ const stateSchema = {
7
+ fname : { value : '' , error : '' } ,
8
+ lname : { value : '' , error : '' } ,
9
+ tags : { value : '' , error : '' } ,
10
+ } ;
60
11
61
- return { state, disable, handleOnChange, handleOnSubmit } ;
62
- }
12
+ // Define your validationStateSchema
63
13
64
- function Form ( ) {
65
- const validator = {
14
+ // Note: validationStateSchema and stateSchema property
15
+ // should be the same in-order validation works!
16
+ const validationStateSchema = {
66
17
fname : {
67
18
required : true ,
68
19
validator : {
@@ -71,7 +22,7 @@ function Form() {
71
22
} ,
72
23
} ,
73
24
lname : {
74
- required : false ,
25
+ required : true ,
75
26
validator : {
76
27
regEx : / ^ [ a - z A - Z ] + $ / ,
77
28
error : 'Invalid last name format.' ,
@@ -86,28 +37,13 @@ function Form() {
86
37
} ,
87
38
} ;
88
39
89
- const initialValue = {
90
- fname : {
91
- value : '' ,
92
- error : '' ,
93
- } ,
94
- lname : {
95
- value : '' ,
96
- error : '' ,
97
- } ,
98
- tags : {
99
- value : '' ,
100
- error : '' ,
101
- } ,
102
- } ;
103
-
104
- function onSubmitForm ( ) {
105
- alert ( 'Form submitted.' ) ;
40
+ function onSubmitForm ( state ) {
41
+ alert ( JSON . stringify ( state , null , 2 ) ) ;
106
42
}
107
43
108
44
const { state, handleOnChange, handleOnSubmit, disable } = useForm (
109
- validator ,
110
- initialValue ,
45
+ stateSchema ,
46
+ validationStateSchema ,
111
47
onSubmitForm
112
48
) ;
113
49
@@ -129,8 +65,9 @@ function Form() {
129
65
onChange = { handleOnChange }
130
66
/>
131
67
</ label >
68
+ { state . fname . error && < p style = { errorStyle } > { state . fname . error } </ p > }
132
69
</ div >
133
- { state . fname . error && < p style = { errorStyle } > { state . fname . error } </ p > }
70
+
134
71
< div >
135
72
< label htmlFor = "lname" >
136
73
Last name:
@@ -141,8 +78,8 @@ function Form() {
141
78
onChange = { handleOnChange }
142
79
/>
143
80
</ label >
81
+ { state . lname . error && < p style = { errorStyle } > { state . lname . error } </ p > }
144
82
</ div >
145
- { state . lname . error && < p style = { errorStyle } > { state . lname . error } </ p > }
146
83
147
84
< div >
148
85
< label htmlFor = "tags" >
@@ -154,8 +91,8 @@ function Form() {
154
91
onChange = { handleOnChange }
155
92
/>
156
93
</ label >
94
+ { state . tags . error && < p style = { errorStyle } > { state . tags . error } </ p > }
157
95
</ div >
158
- { state . tags . error && < p style = { errorStyle } > { state . tags . error } </ p > }
159
96
160
97
< input type = "submit" name = "submit" disabled = { disable } />
161
98
</ form >
0 commit comments