@@ -5,11 +5,12 @@ import { useFormContext } from './useFormContext';
5
5
import { FieldState } from 'final-form' ;
6
6
7
7
type FormGroupState = {
8
+ dirty : boolean ;
8
9
errors : object ;
9
- valid : boolean ;
10
10
invalid : boolean ;
11
11
pristine : boolean ;
12
- dirty : boolean ;
12
+ touched : boolean ;
13
+ valid : boolean ;
13
14
} ;
14
15
15
16
/**
@@ -58,18 +59,23 @@ export const useFormGroup = (name: string): FormGroupState => {
58
59
const form = useForm ( ) ;
59
60
const formContext = useFormContext ( ) ;
60
61
const [ state , setState ] = useState < FormGroupState > ( {
62
+ dirty : false ,
61
63
errors : undefined ,
62
- valid : true ,
63
64
invalid : false ,
64
65
pristine : true ,
65
- dirty : false ,
66
+ touched : false ,
67
+ valid : true ,
66
68
} ) ;
67
69
68
70
useEffect ( ( ) => {
69
71
const unsubscribe = form . subscribe (
70
72
( ) => {
71
73
const fields = formContext . getGroupFields ( name ) ;
72
- const fieldStates = fields . map ( form . getFieldState ) ;
74
+ const fieldStates = fields
75
+ . map ( field => {
76
+ return form . getFieldState ( field ) ;
77
+ } )
78
+ . filter ( fieldState => fieldState != undefined ) ; // eslint-disable-line
73
79
const newState = getFormGroupState ( fieldStates ) ;
74
80
75
81
setState ( oldState => {
@@ -86,6 +92,7 @@ export const useFormGroup = (name: string): FormGroupState => {
86
92
dirty : true ,
87
93
pristine : true ,
88
94
valid : true ,
95
+ touched : true ,
89
96
}
90
97
) ;
91
98
return unsubscribe ;
@@ -102,8 +109,8 @@ export const useFormGroup = (name: string): FormGroupState => {
102
109
*/
103
110
export const getFormGroupState = (
104
111
fieldStates : FieldState < any > [ ]
105
- ) : FormGroupState =>
106
- fieldStates . reduce (
112
+ ) : FormGroupState => {
113
+ return fieldStates . reduce (
107
114
( acc , fieldState ) => {
108
115
let errors = acc . errors || { } ;
109
116
@@ -112,20 +119,23 @@ export const getFormGroupState = (
112
119
}
113
120
114
121
const newState = {
122
+ dirty : acc . dirty || fieldState . dirty ,
115
123
errors,
116
- valid : acc . valid && fieldState . valid ,
117
124
invalid : acc . invalid || fieldState . invalid ,
118
125
pristine : acc . pristine && fieldState . pristine ,
119
- dirty : acc . dirty || fieldState . dirty ,
126
+ touched : acc . touched || fieldState . touched ,
127
+ valid : acc . valid && fieldState . valid ,
120
128
} ;
121
129
122
130
return newState ;
123
131
} ,
124
132
{
133
+ dirty : false ,
125
134
errors : undefined ,
126
- valid : true ,
127
135
invalid : false ,
128
136
pristine : true ,
129
- dirty : false ,
137
+ valid : true ,
138
+ touched : false ,
130
139
}
131
140
) ;
141
+ } ;
0 commit comments