@@ -4,22 +4,52 @@ import { setValueByPath, deepClone, getValueByPath } from '../../utils/getters-s
4
4
import { validateFormElement } from './form-helpers' ;
5
5
import { debounce } from 'lodash-es' ;
6
6
7
- export function useForm ( initialState , { validations , onChange, transform } ) {
7
+ function useFormState ( initialState , { onChange, transform } ) {
8
8
const [ formState , setFormState ] = useState ( initialState ) ;
9
- const [ submitAttempted , setSubmitAttempted ] = useState ( false ) ;
10
- const { getAllKeys : getElementNames , get : getElementRefs , push : registerElementRef } = useArrayValueMap ( ) ;
11
- const _onChange = useCallback ( debounce ( onChange , 500 ) , [ ] ) ;
12
- const _transfrom = useCallback (
13
- debounce ( ( name ) => {
14
- setFormState ( ( prevFormState ) => transform ( deepClone ( prevFormState ) , name ) ) ;
15
- } , 1000 ) ,
16
- [ setFormState , transform ]
9
+ const _onChange = useCallback ( debounce ( onChange , 1000 ) , [ ] ) ;
10
+ const _transform = useCallback (
11
+ debounce (
12
+ ( nextFormState , name ) =>
13
+ transform ( nextFormState , name , ( state ) => {
14
+ setFormState ( state ) ;
15
+ } ) ,
16
+ 500
17
+ ) ,
18
+ [ setFormState ]
17
19
) ;
18
20
19
21
useEffect ( ( ) => {
20
22
_onChange ( formState ) ;
21
23
} , [ formState , _onChange ] ) ;
22
24
25
+ return {
26
+ getState ( ) {
27
+ return formState ;
28
+ } ,
29
+ updateState ( name , value ) {
30
+ setFormState ( ( prevFormState ) => {
31
+ const nextFormState = nextState ( prevFormState , name , value ) ;
32
+
33
+ setTimeout ( ( ) => {
34
+ _transform ( nextFormState , name ) ;
35
+ } ) ;
36
+
37
+ return nextFormState ;
38
+ } ) ;
39
+ } ,
40
+ resetState ( ) {
41
+ setFormState ( initialState ) ;
42
+ } ,
43
+ } ;
44
+ }
45
+
46
+ export function useForm ( initialState , { validations, onChange, transform } ) {
47
+ const { getState, updateState, resetState } = useFormState ( initialState , { onChange, transform } ) ;
48
+ const [ submitAttempted , setSubmitAttempted ] = useState ( false ) ;
49
+ const { getAllKeys : getElementNames , get : getElementRefs , push : registerElementRef } = useArrayValueMap ( ) ;
50
+
51
+ const formState = getState ( ) ;
52
+
23
53
return {
24
54
register ( name , elementRef ) {
25
55
registerElementRef ( name , elementRef ) ;
@@ -34,11 +64,7 @@ export function useForm(initialState, { validations, onChange, transform }) {
34
64
}
35
65
} ,
36
66
update ( name , value ) {
37
- setFormState ( ( prevFormState ) => nextState ( prevFormState , name , value ) , name ) ;
38
-
39
- setTimeout ( ( ) => {
40
- _transfrom ( name ) ;
41
- } ) ;
67
+ updateState ( name , value ) ;
42
68
43
69
if ( validations ) {
44
70
this . validateForm ( nextState ( formState , name , value ) ) ;
@@ -51,7 +77,7 @@ export function useForm(initialState, { validations, onChange, transform }) {
51
77
return getValueByPath ( formState , name ) ;
52
78
} ,
53
79
reset ( ) {
54
- setFormState ( initialState ) ;
80
+ resetState ( ) ;
55
81
setSubmitAttempted ( false ) ;
56
82
} ,
57
83
setSubmitedAttempted ( ) {
0 commit comments