react-hook-form 7.40.0 → 7.41.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/__tests__/controller.server.test.d.ts +2 -0
  2. package/dist/__tests__/controller.server.test.d.ts.map +1 -0
  3. package/dist/__tests__/controller.test.d.ts +2 -0
  4. package/dist/__tests__/controller.test.d.ts.map +1 -0
  5. package/dist/__tests__/logic/validateField.test.d.ts +2 -0
  6. package/dist/__tests__/logic/validateField.test.d.ts.map +1 -0
  7. package/dist/__tests__/type.test.d.ts +2 -0
  8. package/dist/__tests__/type.test.d.ts.map +1 -0
  9. package/dist/__tests__/useController.test.d.ts +2 -0
  10. package/dist/__tests__/useController.test.d.ts.map +1 -0
  11. package/dist/__tests__/useFieldArray/append.test.d.ts +2 -0
  12. package/dist/__tests__/useFieldArray/append.test.d.ts.map +1 -0
  13. package/dist/__tests__/useFieldArray/focus.test.d.ts +2 -0
  14. package/dist/__tests__/useFieldArray/focus.test.d.ts.map +1 -0
  15. package/dist/__tests__/useFieldArray/insert.test.d.ts +2 -0
  16. package/dist/__tests__/useFieldArray/insert.test.d.ts.map +1 -0
  17. package/dist/__tests__/useFieldArray/move.test.d.ts +2 -0
  18. package/dist/__tests__/useFieldArray/move.test.d.ts.map +1 -0
  19. package/dist/__tests__/useFieldArray/prepend.test.d.ts +2 -0
  20. package/dist/__tests__/useFieldArray/prepend.test.d.ts.map +1 -0
  21. package/dist/__tests__/useFieldArray/remove.test.d.ts +2 -0
  22. package/dist/__tests__/useFieldArray/remove.test.d.ts.map +1 -0
  23. package/dist/__tests__/useFieldArray/replace.test.d.ts +2 -0
  24. package/dist/__tests__/useFieldArray/replace.test.d.ts.map +1 -0
  25. package/dist/__tests__/useFieldArray/swap.test.d.ts +2 -0
  26. package/dist/__tests__/useFieldArray/swap.test.d.ts.map +1 -0
  27. package/dist/__tests__/useFieldArray/update.test.d.ts +2 -0
  28. package/dist/__tests__/useFieldArray/update.test.d.ts.map +1 -0
  29. package/dist/__tests__/useFieldArray.test.d.ts +2 -0
  30. package/dist/__tests__/useFieldArray.test.d.ts.map +1 -0
  31. package/dist/__tests__/useForm/clearErrors.test.d.ts +2 -0
  32. package/dist/__tests__/useForm/clearErrors.test.d.ts.map +1 -0
  33. package/dist/__tests__/useForm/formState.test.d.ts +2 -0
  34. package/dist/__tests__/useForm/formState.test.d.ts.map +1 -0
  35. package/dist/__tests__/useForm/getFieldState.test.d.ts +2 -0
  36. package/dist/__tests__/useForm/getFieldState.test.d.ts.map +1 -0
  37. package/dist/__tests__/useForm/getValues.test.d.ts +2 -0
  38. package/dist/__tests__/useForm/getValues.test.d.ts.map +1 -0
  39. package/dist/__tests__/useForm/handleSubmit.test.d.ts +2 -0
  40. package/dist/__tests__/useForm/handleSubmit.test.d.ts.map +1 -0
  41. package/dist/__tests__/useForm/register.test.d.ts +2 -0
  42. package/dist/__tests__/useForm/register.test.d.ts.map +1 -0
  43. package/dist/__tests__/useForm/reset.test.d.ts +2 -0
  44. package/dist/__tests__/useForm/reset.test.d.ts.map +1 -0
  45. package/dist/__tests__/useForm/resetField.test.d.ts +2 -0
  46. package/dist/__tests__/useForm/resetField.test.d.ts.map +1 -0
  47. package/dist/__tests__/useForm/resolver.test.d.ts +2 -0
  48. package/dist/__tests__/useForm/resolver.test.d.ts.map +1 -0
  49. package/dist/__tests__/useForm/setError.test.d.ts +2 -0
  50. package/dist/__tests__/useForm/setError.test.d.ts.map +1 -0
  51. package/dist/__tests__/useForm/setValue.test.d.ts +2 -0
  52. package/dist/__tests__/useForm/setValue.test.d.ts.map +1 -0
  53. package/dist/__tests__/useForm/trigger.test.d.ts +2 -0
  54. package/dist/__tests__/useForm/trigger.test.d.ts.map +1 -0
  55. package/dist/__tests__/useForm/unregister.test.d.ts +2 -0
  56. package/dist/__tests__/useForm/unregister.test.d.ts.map +1 -0
  57. package/dist/__tests__/useForm/watch.test.d.ts +2 -0
  58. package/dist/__tests__/useForm/watch.test.d.ts.map +1 -0
  59. package/dist/__tests__/useForm.server.test.d.ts +2 -0
  60. package/dist/__tests__/useForm.server.test.d.ts.map +1 -0
  61. package/dist/__tests__/useForm.test.d.ts +2 -0
  62. package/dist/__tests__/useForm.test.d.ts.map +1 -0
  63. package/dist/__tests__/useFormContext.server.test.d.ts +2 -0
  64. package/dist/__tests__/useFormContext.server.test.d.ts.map +1 -0
  65. package/dist/__tests__/useFormContext.test.d.ts +2 -0
  66. package/dist/__tests__/useFormContext.test.d.ts.map +1 -0
  67. package/dist/__tests__/useFormState.test.d.ts +2 -0
  68. package/dist/__tests__/useFormState.test.d.ts.map +1 -0
  69. package/dist/__tests__/useWatch.test.d.ts +2 -0
  70. package/dist/__tests__/useWatch.test.d.ts.map +1 -0
  71. package/dist/controller.d.ts +1 -1
  72. package/dist/controller.d.ts.map +1 -1
  73. package/dist/index.cjs.js +1 -1
  74. package/dist/index.cjs.js.map +1 -1
  75. package/dist/index.esm.mjs +77 -60
  76. package/dist/index.esm.mjs.map +1 -1
  77. package/dist/index.umd.js +1 -1
  78. package/dist/index.umd.js.map +1 -1
  79. package/dist/logic/createFormControl.d.ts +25 -2
  80. package/dist/logic/createFormControl.d.ts.map +1 -1
  81. package/dist/logic/generateWatchOutput.d.ts +2 -2
  82. package/dist/logic/generateWatchOutput.d.ts.map +1 -1
  83. package/dist/{utils → logic}/getValidationModes.d.ts +0 -0
  84. package/dist/{utils → logic}/getValidationModes.d.ts.map +1 -1
  85. package/dist/logic/updateFieldArrayRootError.d.ts +1 -1
  86. package/dist/logic/updateFieldArrayRootError.d.ts.map +1 -1
  87. package/dist/logic/validateField.d.ts.map +1 -1
  88. package/dist/tsdoc-metadata.json +11 -0
  89. package/dist/types/errors.d.ts +2 -2
  90. package/dist/types/errors.d.ts.map +1 -1
  91. package/dist/types/form.d.ts +11 -7
  92. package/dist/types/form.d.ts.map +1 -1
  93. package/dist/types/path/eager.d.ts +5 -5
  94. package/dist/types/path/eager.d.ts.map +1 -1
  95. package/dist/types/utils.d.ts +1 -0
  96. package/dist/types/utils.d.ts.map +1 -1
  97. package/dist/types/validator.d.ts +1 -1
  98. package/dist/types/validator.d.ts.map +1 -1
  99. package/dist/useFieldArray.d.ts.map +1 -1
  100. package/dist/useForm.d.ts.map +1 -1
  101. package/dist/useFormContext.d.ts +1 -0
  102. package/dist/useFormContext.d.ts.map +1 -1
  103. package/dist/useFormState.d.ts.map +1 -1
  104. package/dist/useSubscribe.d.ts +1 -1
  105. package/dist/useSubscribe.d.ts.map +1 -1
  106. package/dist/useWatch.d.ts.map +1 -1
  107. package/dist/utils/isHTMLElement.d.ts.map +1 -1
  108. package/package.json +18 -18
@@ -173,7 +173,7 @@ function useSubscribe(props) {
173
173
  React.useEffect(() => {
174
174
  const subscription = !props.disabled &&
175
175
  _props.current.subject.subscribe({
176
- next: _props.current.callback,
176
+ next: _props.current.next,
177
177
  });
178
178
  return () => {
179
179
  subscription && subscription.unsubscribe();
@@ -218,6 +218,7 @@ function useFormState(props) {
218
218
  const _mounted = React.useRef(true);
219
219
  const _localProxyFormState = React.useRef({
220
220
  isDirty: false,
221
+ isLoading: false,
221
222
  dirtyFields: false,
222
223
  touchedFields: false,
223
224
  isValidating: false,
@@ -228,13 +229,13 @@ function useFormState(props) {
228
229
  _name.current = name;
229
230
  useSubscribe({
230
231
  disabled,
231
- callback: React.useCallback((value) => _mounted.current &&
232
+ next: (value) => _mounted.current &&
232
233
  shouldSubscribeByName(_name.current, value.name, exact) &&
233
234
  shouldRenderFormState(value, _localProxyFormState.current) &&
234
235
  updateFormState({
235
236
  ...control._formState,
236
237
  ...value,
237
- }), [control, exact]),
238
+ }),
238
239
  subject: control._subjects.state,
239
240
  });
240
241
  React.useEffect(() => {
@@ -255,10 +256,10 @@ function useFormState(props) {
255
256
 
256
257
  var isString = (value) => typeof value === 'string';
257
258
 
258
- var generateWatchOutput = (names, _names, formValues, isGlobal) => {
259
+ var generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) => {
259
260
  if (isString(names)) {
260
261
  isGlobal && _names.watch.add(names);
261
- return get(formValues, names);
262
+ return get(formValues, names, defaultValue);
262
263
  }
263
264
  if (Array.isArray(names)) {
264
265
  return names.map((fieldName) => (isGlobal && _names.watch.add(fieldName), get(formValues, fieldName)));
@@ -327,16 +328,13 @@ function useWatch(props) {
327
328
  useSubscribe({
328
329
  disabled,
329
330
  subject: control._subjects.watch,
330
- callback: (formState) => {
331
+ next: (formState) => {
331
332
  if (shouldSubscribeByName(_name.current, formState.name, exact)) {
332
- const fieldValues = generateWatchOutput(_name.current, control._names, formState.values || control._formValues);
333
- updateValue(isUndefined(fieldValues) ? defaultValue : cloneObject(fieldValues));
333
+ updateValue(cloneObject(generateWatchOutput(_name.current, control._names, formState.values || control._formValues, false, defaultValue)));
334
334
  }
335
335
  },
336
336
  });
337
- const [value, updateValue] = React.useState(isUndefined(defaultValue)
338
- ? control._getWatch(name)
339
- : defaultValue);
337
+ const [value, updateValue] = React.useState(control._getWatch(name, defaultValue));
340
338
  React.useEffect(() => control._removeUnmounted());
341
339
  return value;
342
340
  }
@@ -568,6 +566,14 @@ var getFocusFieldName = (name, index, options = {}) => options.shouldFocus || is
568
566
  `${name}.${isUndefined(options.focusIndex) ? index : options.focusIndex}.`
569
567
  : '';
570
568
 
569
+ var getValidationModes = (mode) => ({
570
+ isOnSubmit: !mode || mode === VALIDATION_MODE.onSubmit,
571
+ isOnBlur: mode === VALIDATION_MODE.onBlur,
572
+ isOnChange: mode === VALIDATION_MODE.onChange,
573
+ isOnAll: mode === VALIDATION_MODE.all,
574
+ isOnTouch: mode === VALIDATION_MODE.onTouched,
575
+ });
576
+
571
577
  var isWatched = (name, _names, isBlurEvent) => !isBlurEvent &&
572
578
  (_names.watchAll ||
573
579
  _names.watch.has(name) ||
@@ -666,7 +672,9 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
666
672
  const isRadio = isRadioInput(ref);
667
673
  const isCheckBox = isCheckBoxInput(ref);
668
674
  const isRadioOrCheckbox = isRadio || isCheckBox;
669
- const isEmpty = ((valueAsNumber || isFileInput(ref)) && !ref.value) ||
675
+ const isEmpty = ((valueAsNumber || isFileInput(ref)) &&
676
+ isUndefined(ref.value) &&
677
+ isUndefined(inputValue)) ||
670
678
  inputValue === '' ||
671
679
  (Array.isArray(inputValue) && !inputValue.length);
672
680
  const appendErrorsCurry = appendErrors.bind(null, name, validateAllFieldCriteria, error);
@@ -831,14 +839,6 @@ function append(data, value) {
831
839
 
832
840
  var fillEmptyArray = (value) => Array.isArray(value) ? value.map(() => undefined) : undefined;
833
841
 
834
- var getValidationModes = (mode) => ({
835
- isOnSubmit: !mode || mode === VALIDATION_MODE.onSubmit,
836
- isOnBlur: mode === VALIDATION_MODE.onBlur,
837
- isOnChange: mode === VALIDATION_MODE.onChange,
838
- isOnAll: mode === VALIDATION_MODE.all,
839
- isOnTouch: mode === VALIDATION_MODE.onTouched,
840
- });
841
-
842
842
  function insert(data, index, value) {
843
843
  return [
844
844
  ...data.slice(0, index),
@@ -980,17 +980,16 @@ function useFieldArray(props) {
980
980
  control._names.array.add(name);
981
981
  props.rules &&
982
982
  control.register(name, props.rules);
983
- const callback = React.useCallback(({ values, name: fieldArrayName, }) => {
984
- if (fieldArrayName === _name.current || !fieldArrayName) {
985
- const fieldValues = get(values, _name.current);
986
- if (Array.isArray(fieldValues)) {
987
- setFields(fieldValues);
988
- ids.current = fieldValues.map(generateId);
989
- }
990
- }
991
- }, []);
992
983
  useSubscribe({
993
- callback,
984
+ next: ({ values, name: fieldArrayName, }) => {
985
+ if (fieldArrayName === _name.current || !fieldArrayName) {
986
+ const fieldValues = get(values, _name.current);
987
+ if (Array.isArray(fieldValues)) {
988
+ setFields(fieldValues);
989
+ ids.current = fieldValues.map(generateId);
990
+ }
991
+ }
992
+ },
994
993
  subject: control._subjects.array,
995
994
  });
996
995
  const updateValues = React.useCallback((updatedFieldArrayValues) => {
@@ -1205,8 +1204,8 @@ function deepEqual(object1, object2) {
1205
1204
 
1206
1205
  var isHTMLElement = (value) => {
1207
1206
  const owner = value ? value.ownerDocument : 0;
1208
- const ElementClass = owner && owner.defaultView ? owner.defaultView.HTMLElement : HTMLElement;
1209
- return value instanceof ElementClass;
1207
+ return (value instanceof
1208
+ (owner && owner.defaultView ? owner.defaultView.HTMLElement : HTMLElement));
1210
1209
  };
1211
1210
 
1212
1211
  var isMultipleSelect = (element) => element.type === `select-multiple`;
@@ -1386,14 +1385,16 @@ const defaultOptions = {
1386
1385
  reValidateMode: VALIDATION_MODE.onChange,
1387
1386
  shouldFocusError: true,
1388
1387
  };
1389
- function createFormControl(props = {}) {
1388
+ function createFormControl(props = {}, flushRootRender) {
1390
1389
  let _options = {
1391
1390
  ...defaultOptions,
1392
1391
  ...props,
1393
1392
  };
1393
+ const shouldCaptureDirtyFields = props.resetOptions && props.resetOptions.keepDirtyValues;
1394
1394
  let _formState = {
1395
1395
  submitCount: 0,
1396
1396
  isDirty: false,
1397
+ isLoading: true,
1397
1398
  isValidating: false,
1398
1399
  isSubmitted: false,
1399
1400
  isSubmitting: false,
@@ -1404,7 +1405,9 @@ function createFormControl(props = {}) {
1404
1405
  errors: {},
1405
1406
  };
1406
1407
  let _fields = {};
1407
- let _defaultValues = cloneObject(_options.defaultValues) || {};
1408
+ let _defaultValues = isObject(_options.defaultValues)
1409
+ ? cloneObject(_options.defaultValues) || {}
1410
+ : {};
1408
1411
  let _formValues = _options.shouldUnregister
1409
1412
  ? {}
1410
1413
  : cloneObject(_defaultValues);
@@ -1455,7 +1458,6 @@ function createFormControl(props = {}) {
1455
1458
  }
1456
1459
  };
1457
1460
  const _updateIsValidating = (value) => _proxyFormState.isValidating &&
1458
- value !== _formState.isValidating &&
1459
1461
  _subjects.state.next({
1460
1462
  isValidating: value,
1461
1463
  });
@@ -1523,16 +1525,16 @@ function createFormControl(props = {}) {
1523
1525
  _formState.isDirty = output.isDirty = _getDirty();
1524
1526
  shouldUpdateField = isPreviousDirty !== output.isDirty;
1525
1527
  }
1526
- if (_proxyFormState.dirtyFields) {
1527
- isPreviousDirty = get(_formState.dirtyFields, name);
1528
- const isCurrentFieldPristine = deepEqual(get(_defaultValues, name), fieldValue);
1529
- isCurrentFieldPristine
1530
- ? unset(_formState.dirtyFields, name)
1531
- : set(_formState.dirtyFields, name, true);
1532
- output.dirtyFields = _formState.dirtyFields;
1533
- shouldUpdateField =
1534
- shouldUpdateField || isPreviousDirty !== !isCurrentFieldPristine;
1535
- }
1528
+ const isCurrentFieldPristine = deepEqual(get(_defaultValues, name), fieldValue);
1529
+ isPreviousDirty = get(_formState.dirtyFields, name);
1530
+ isCurrentFieldPristine
1531
+ ? unset(_formState.dirtyFields, name)
1532
+ : set(_formState.dirtyFields, name, true);
1533
+ output.dirtyFields = _formState.dirtyFields;
1534
+ shouldUpdateField =
1535
+ shouldUpdateField ||
1536
+ (_proxyFormState.dirtyFields &&
1537
+ isPreviousDirty !== !isCurrentFieldPristine);
1536
1538
  }
1537
1539
  if (isBlurEvent) {
1538
1540
  const isPreviousFieldTouched = get(_formState.touchedFields, name);
@@ -1647,7 +1649,7 @@ function createFormControl(props = {}) {
1647
1649
  : isString(names)
1648
1650
  ? { [names]: defaultValue }
1649
1651
  : defaultValue),
1650
- }, isGlobal);
1652
+ }, isGlobal, defaultValue);
1651
1653
  const _getFieldArray = (name) => compact(get(_stateFlags.mount ? _formValues : _defaultValues, name, props.shouldUnregister ? get(_defaultValues, name, []) : []));
1652
1654
  const setFieldValue = (name, value, options = {}) => {
1653
1655
  const field = get(_fields, name);
@@ -1693,7 +1695,8 @@ function createFormControl(props = {}) {
1693
1695
  }
1694
1696
  (options.shouldDirty || options.shouldTouch) &&
1695
1697
  updateTouchAndDirty(name, fieldValue, options.shouldTouch, options.shouldDirty, true);
1696
- options.shouldValidate && trigger(name);
1698
+ options.shouldValidate &&
1699
+ trigger(name);
1697
1700
  };
1698
1701
  const setValues = (name, value, options) => {
1699
1702
  for (const fieldKey in value) {
@@ -1737,6 +1740,7 @@ function createFormControl(props = {}) {
1737
1740
  _subjects.watch.next({
1738
1741
  name,
1739
1742
  });
1743
+ !_stateFlags.mount && flushRootRender();
1740
1744
  };
1741
1745
  const onChange = async (event) => {
1742
1746
  const target = event.target;
@@ -1793,14 +1797,9 @@ function createFormControl(props = {}) {
1793
1797
  isValid = await executeBuiltInValidation(_fields, true);
1794
1798
  }
1795
1799
  }
1796
- if (!isPrimitive(fieldValue) || getCurrentFieldValue() === fieldValue) {
1797
- field._f.deps &&
1798
- trigger(field._f.deps);
1799
- shouldRenderByError(name, isValid, error, fieldState);
1800
- }
1801
- else {
1802
- _updateIsValidating(false);
1803
- }
1800
+ field._f.deps &&
1801
+ trigger(field._f.deps);
1802
+ shouldRenderByError(name, isValid, error, fieldState);
1804
1803
  }
1805
1804
  };
1806
1805
  const trigger = async (name, options = {}) => {
@@ -2070,7 +2069,7 @@ function createFormControl(props = {}) {
2070
2069
  _defaultValues = updatedValues;
2071
2070
  }
2072
2071
  if (!keepStateOptions.keepValues) {
2073
- if (keepStateOptions.keepDirtyValues) {
2072
+ if (keepStateOptions.keepDirtyValues || shouldCaptureDirtyFields) {
2074
2073
  for (const fieldName of _names.mount) {
2075
2074
  get(_formState.dirtyFields, fieldName)
2076
2075
  ? set(values, fieldName, get(_formValues, fieldName))
@@ -2117,6 +2116,7 @@ function createFormControl(props = {}) {
2117
2116
  watchAll: false,
2118
2117
  focus: '',
2119
2118
  };
2119
+ !_stateFlags.mount && flushRootRender();
2120
2120
  _stateFlags.mount =
2121
2121
  !_proxyFormState.isValid || !!keepStateOptions.keepIsValid;
2122
2122
  _stateFlags.watch = !!props.shouldUnregister;
@@ -2160,6 +2160,14 @@ function createFormControl(props = {}) {
2160
2160
  }
2161
2161
  }
2162
2162
  };
2163
+ if (isFunction(_options.defaultValues)) {
2164
+ _options.defaultValues().then((values) => {
2165
+ reset(values, _options.resetOptions);
2166
+ _subjects.state.next({
2167
+ isLoading: false,
2168
+ });
2169
+ });
2170
+ }
2163
2171
  return {
2164
2172
  control: {
2165
2173
  register,
@@ -2173,6 +2181,7 @@ function createFormControl(props = {}) {
2173
2181
  _removeUnmounted,
2174
2182
  _updateFieldArray,
2175
2183
  _getFieldArray,
2184
+ _reset,
2176
2185
  _subjects,
2177
2186
  _proxyFormState,
2178
2187
  get _fields() {
@@ -2262,6 +2271,7 @@ function useForm(props = {}) {
2262
2271
  const [formState, updateFormState] = React.useState({
2263
2272
  isDirty: false,
2264
2273
  isValidating: false,
2274
+ isLoading: true,
2265
2275
  isSubmitted: false,
2266
2276
  isSubmitting: false,
2267
2277
  isSubmitSuccessful: false,
@@ -2270,11 +2280,13 @@ function useForm(props = {}) {
2270
2280
  dirtyFields: {},
2271
2281
  touchedFields: {},
2272
2282
  errors: {},
2273
- defaultValues: props.defaultValues,
2283
+ defaultValues: isFunction(props.defaultValues)
2284
+ ? undefined
2285
+ : props.defaultValues,
2274
2286
  });
2275
2287
  if (!_formControl.current) {
2276
2288
  _formControl.current = {
2277
- ...createFormControl(props),
2289
+ ...createFormControl(props, () => updateFormState((formState) => ({ ...formState }))),
2278
2290
  formState,
2279
2291
  };
2280
2292
  }
@@ -2282,7 +2294,7 @@ function useForm(props = {}) {
2282
2294
  control._options = props;
2283
2295
  useSubscribe({
2284
2296
  subject: control._subjects.state,
2285
- callback: React.useCallback((value) => {
2297
+ next: (value) => {
2286
2298
  if (shouldRenderFormState(value, control._proxyFormState, true)) {
2287
2299
  control._formState = {
2288
2300
  ...control._formState,
@@ -2290,7 +2302,7 @@ function useForm(props = {}) {
2290
2302
  };
2291
2303
  updateFormState({ ...control._formState });
2292
2304
  }
2293
- }, [control]),
2305
+ },
2294
2306
  });
2295
2307
  React.useEffect(() => {
2296
2308
  if (!control._stateFlags.mount) {
@@ -2303,6 +2315,11 @@ function useForm(props = {}) {
2303
2315
  }
2304
2316
  control._removeUnmounted();
2305
2317
  });
2318
+ React.useEffect(() => {
2319
+ if (props.values && !deepEqual(props.values, control._defaultValues)) {
2320
+ control._reset(props.values, control._options.resetOptions);
2321
+ }
2322
+ }, [props.values, control]);
2306
2323
  React.useEffect(() => {
2307
2324
  formState.submitCount && control._focusError();
2308
2325
  }, [control, formState.submitCount]);