react-hook-form 7.57.0-next.0 → 7.58.0

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 (126) hide show
  1. package/README.md +8 -4
  2. package/dist/__typetest__/form.test-d.d.ts +1 -1
  3. package/dist/__typetest__/form.test-d.d.ts.map +1 -1
  4. package/dist/controller.d.ts +1 -1
  5. package/dist/controller.d.ts.map +1 -1
  6. package/dist/form.d.ts +1 -1
  7. package/dist/form.d.ts.map +1 -1
  8. package/dist/index.cjs.js +1 -1
  9. package/dist/index.cjs.js.map +1 -1
  10. package/dist/index.esm.mjs +116 -107
  11. package/dist/index.esm.mjs.map +1 -1
  12. package/dist/index.umd.js +1 -1
  13. package/dist/index.umd.js.map +1 -1
  14. package/dist/logic/appendErrors.d.ts +1 -1
  15. package/dist/logic/appendErrors.d.ts.map +1 -1
  16. package/dist/logic/createFormControl.d.ts +1 -1
  17. package/dist/logic/createFormControl.d.ts.map +1 -1
  18. package/dist/logic/generateId.d.ts.map +1 -1
  19. package/dist/logic/generateWatchOutput.d.ts +1 -1
  20. package/dist/logic/generateWatchOutput.d.ts.map +1 -1
  21. package/dist/logic/getFieldValue.d.ts +1 -1
  22. package/dist/logic/getFieldValue.d.ts.map +1 -1
  23. package/dist/logic/getFieldValueAs.d.ts +1 -1
  24. package/dist/logic/getFieldValueAs.d.ts.map +1 -1
  25. package/dist/logic/getFocusFieldName.d.ts +1 -1
  26. package/dist/logic/getFocusFieldName.d.ts.map +1 -1
  27. package/dist/logic/getProxyFormState.d.ts +1 -1
  28. package/dist/logic/getProxyFormState.d.ts.map +1 -1
  29. package/dist/logic/getResolverOptions.d.ts +1 -1
  30. package/dist/logic/getResolverOptions.d.ts.map +1 -1
  31. package/dist/logic/getRuleValue.d.ts +1 -1
  32. package/dist/logic/getRuleValue.d.ts.map +1 -1
  33. package/dist/logic/getValidateError.d.ts +1 -1
  34. package/dist/logic/getValidateError.d.ts.map +1 -1
  35. package/dist/logic/getValidationModes.d.ts +1 -1
  36. package/dist/logic/getValidationModes.d.ts.map +1 -1
  37. package/dist/logic/getValueAndMessage.d.ts +1 -1
  38. package/dist/logic/getValueAndMessage.d.ts.map +1 -1
  39. package/dist/logic/hasPromiseValidation.d.ts +1 -1
  40. package/dist/logic/hasPromiseValidation.d.ts.map +1 -1
  41. package/dist/logic/hasValidation.d.ts +1 -1
  42. package/dist/logic/hasValidation.d.ts.map +1 -1
  43. package/dist/logic/isNameInFieldArray.d.ts +1 -1
  44. package/dist/logic/isNameInFieldArray.d.ts.map +1 -1
  45. package/dist/logic/isWatched.d.ts +1 -1
  46. package/dist/logic/isWatched.d.ts.map +1 -1
  47. package/dist/logic/iterateFieldsByAction.d.ts +1 -1
  48. package/dist/logic/iterateFieldsByAction.d.ts.map +1 -1
  49. package/dist/logic/schemaErrorLookup.d.ts +1 -1
  50. package/dist/logic/schemaErrorLookup.d.ts.map +1 -1
  51. package/dist/logic/shouldRenderFormState.d.ts +1 -1
  52. package/dist/logic/shouldRenderFormState.d.ts.map +1 -1
  53. package/dist/logic/shouldSubscribeByName.d.ts +1 -1
  54. package/dist/logic/shouldSubscribeByName.d.ts.map +1 -1
  55. package/dist/logic/skipValidation.d.ts +1 -1
  56. package/dist/logic/skipValidation.d.ts.map +1 -1
  57. package/dist/logic/updateFieldArrayRootError.d.ts +1 -1
  58. package/dist/logic/updateFieldArrayRootError.d.ts.map +1 -1
  59. package/dist/logic/validateField.d.ts +1 -1
  60. package/dist/logic/validateField.d.ts.map +1 -1
  61. package/dist/react-server.esm.mjs +30 -16
  62. package/dist/react-server.esm.mjs.map +1 -1
  63. package/dist/types/controller.d.ts +3 -3
  64. package/dist/types/controller.d.ts.map +1 -1
  65. package/dist/types/errors.d.ts +3 -3
  66. package/dist/types/errors.d.ts.map +1 -1
  67. package/dist/types/fieldArray.d.ts +4 -4
  68. package/dist/types/fieldArray.d.ts.map +1 -1
  69. package/dist/types/fields.d.ts +2 -2
  70. package/dist/types/fields.d.ts.map +1 -1
  71. package/dist/types/form.d.ts +25 -22
  72. package/dist/types/form.d.ts.map +1 -1
  73. package/dist/types/path/common.d.ts +1 -1
  74. package/dist/types/path/common.d.ts.map +1 -1
  75. package/dist/types/path/eager.d.ts +16 -3
  76. package/dist/types/path/eager.d.ts.map +1 -1
  77. package/dist/types/path/index.d.ts +1 -1
  78. package/dist/types/path/index.d.ts.map +1 -1
  79. package/dist/types/resolvers.d.ts +3 -3
  80. package/dist/types/resolvers.d.ts.map +1 -1
  81. package/dist/types/utils.d.ts +1 -1
  82. package/dist/types/utils.d.ts.map +1 -1
  83. package/dist/types/validator.d.ts +4 -4
  84. package/dist/types/validator.d.ts.map +1 -1
  85. package/dist/useController.d.ts +1 -1
  86. package/dist/useController.d.ts.map +1 -1
  87. package/dist/useFieldArray.d.ts +1 -1
  88. package/dist/useFieldArray.d.ts.map +1 -1
  89. package/dist/useForm.d.ts +1 -1
  90. package/dist/useForm.d.ts.map +1 -1
  91. package/dist/useFormContext.d.ts +1 -1
  92. package/dist/useFormContext.d.ts.map +1 -1
  93. package/dist/useFormState.d.ts +1 -1
  94. package/dist/useFormState.d.ts.map +1 -1
  95. package/dist/useIsomorphicLayoutEffect.d.ts +3 -0
  96. package/dist/useIsomorphicLayoutEffect.d.ts.map +1 -0
  97. package/dist/useWatch.d.ts +1 -92
  98. package/dist/useWatch.d.ts.map +1 -1
  99. package/dist/utils/createSubject.d.ts +1 -1
  100. package/dist/utils/createSubject.d.ts.map +1 -1
  101. package/dist/utils/flatten.d.ts +1 -1
  102. package/dist/utils/flatten.d.ts.map +1 -1
  103. package/dist/utils/get.d.ts.map +1 -1
  104. package/dist/utils/isCheckBoxInput.d.ts +1 -1
  105. package/dist/utils/isCheckBoxInput.d.ts.map +1 -1
  106. package/dist/utils/isEmptyObject.d.ts +1 -1
  107. package/dist/utils/isEmptyObject.d.ts.map +1 -1
  108. package/dist/utils/isFileInput.d.ts +1 -1
  109. package/dist/utils/isFileInput.d.ts.map +1 -1
  110. package/dist/utils/isMessage.d.ts +1 -1
  111. package/dist/utils/isMessage.d.ts.map +1 -1
  112. package/dist/utils/isMultipleSelect.d.ts +1 -1
  113. package/dist/utils/isMultipleSelect.d.ts.map +1 -1
  114. package/dist/utils/isPrimitive.d.ts +1 -1
  115. package/dist/utils/isPrimitive.d.ts.map +1 -1
  116. package/dist/utils/isRadioInput.d.ts +1 -1
  117. package/dist/utils/isRadioInput.d.ts.map +1 -1
  118. package/dist/utils/isRadioOrCheckbox.d.ts +1 -1
  119. package/dist/utils/isRadioOrCheckbox.d.ts.map +1 -1
  120. package/dist/utils/live.d.ts +1 -1
  121. package/dist/utils/live.d.ts.map +1 -1
  122. package/dist/utils/set.d.ts +1 -1
  123. package/dist/utils/set.d.ts.map +1 -1
  124. package/package.json +14 -14
  125. package/dist/useDeepEqualEffect.d.ts +0 -3
  126. package/dist/useDeepEqualEffect.d.ts.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import React__default, { useEffect } from 'react';
2
+ import React__default from 'react';
3
3
 
4
4
  var isCheckBoxInput = (element) => element.type === 'checkbox';
5
5
 
@@ -62,15 +62,19 @@ function cloneObject(data) {
62
62
  return copy;
63
63
  }
64
64
 
65
- var compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];
65
+ var isKey = (value) => /^\w*$/.test(value);
66
66
 
67
67
  var isUndefined = (val) => val === undefined;
68
68
 
69
+ var compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];
70
+
71
+ var stringToPath = (input) => compact(input.replace(/["|']|\]/g, '').split(/\.|\[/));
72
+
69
73
  var get = (object, path, defaultValue) => {
70
74
  if (!path || !isObject(object)) {
71
75
  return defaultValue;
72
76
  }
73
- const result = compact(path.split(/[,[\].]+?/)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], object);
77
+ const result = (isKey(path) ? [path] : stringToPath(path)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], object);
74
78
  return isUndefined(result) || result === object
75
79
  ? isUndefined(object[path])
76
80
  ? defaultValue
@@ -80,10 +84,6 @@ var get = (object, path, defaultValue) => {
80
84
 
81
85
  var isBoolean = (value) => typeof value === 'boolean';
82
86
 
83
- var isKey = (value) => /^\w*$/.test(value);
84
-
85
- var stringToPath = (input) => compact(input.replace(/["|']|\]/g, '').split(/\.|\[/));
86
-
87
87
  var set = (object, path, value) => {
88
88
  let index = -1;
89
89
  const tempPath = isKey(path) ? [path] : stringToPath(path);
@@ -132,6 +132,7 @@ const INPUT_VALIDATION_RULES = {
132
132
  };
133
133
 
134
134
  const HookFormContext = React__default.createContext(null);
135
+ HookFormContext.displayName = 'HookFormContext';
135
136
  /**
136
137
  * This custom hook allows you to access the form context. useFormContext is intended to be used in deeply nested structures, where it would become inconvenient to pass the context as a prop. To be used with {@link FormProvider}.
137
138
  *
@@ -217,47 +218,7 @@ var getProxyFormState = (formState, control, localProxyFormState, isRoot = true)
217
218
  return result;
218
219
  };
219
220
 
220
- var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
221
-
222
- function deepEqual(object1, object2) {
223
- if (isPrimitive(object1) || isPrimitive(object2)) {
224
- return object1 === object2;
225
- }
226
- if (isDateObject(object1) && isDateObject(object2)) {
227
- return object1.getTime() === object2.getTime();
228
- }
229
- const keys1 = Object.keys(object1);
230
- const keys2 = Object.keys(object2);
231
- if (keys1.length !== keys2.length) {
232
- return false;
233
- }
234
- for (const key of keys1) {
235
- const val1 = object1[key];
236
- if (!keys2.includes(key)) {
237
- return false;
238
- }
239
- if (key !== 'ref') {
240
- const val2 = object2[key];
241
- if ((isDateObject(val1) && isDateObject(val2)) ||
242
- (isObject(val1) && isObject(val2)) ||
243
- (Array.isArray(val1) && Array.isArray(val2))
244
- ? !deepEqual(val1, val2)
245
- : val1 !== val2) {
246
- return false;
247
- }
248
- }
249
- }
250
- return true;
251
- }
252
-
253
- const useDeepEqualEffect = (effect, deps) => {
254
- const ref = React.useRef(deps);
255
- if (!deepEqual(deps, ref.current)) {
256
- ref.current = deps;
257
- }
258
- // eslint-disable-next-line react-hooks/exhaustive-deps
259
- React.useEffect(effect, ref.current);
260
- };
221
+ const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
261
222
 
262
223
  /**
263
224
  * This custom hook allows you to subscribe to each form state, and isolate the re-render at the custom hook level. It has its scope in terms of form state subscription, so it would not affect other useFormState and useForm. Using this hook can reduce the re-render impact on large and complex form application.
@@ -303,8 +264,8 @@ function useFormState(props) {
303
264
  isValid: false,
304
265
  errors: false,
305
266
  });
306
- useDeepEqualEffect(() => control._subscribe({
307
- name: name,
267
+ useIsomorphicLayoutEffect(() => control._subscribe({
268
+ name,
308
269
  formState: _localProxyFormState.current,
309
270
  exact,
310
271
  callback: (formState) => {
@@ -353,34 +314,18 @@ var generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) =>
353
314
  */
354
315
  function useWatch(props) {
355
316
  const methods = useFormContext();
356
- const { control = methods.control, name, defaultValue, disabled, exact, compute, } = props || {};
357
- const _compute = React__default.useRef(compute);
358
- const _computeFormValues = React__default.useRef(undefined);
359
- _compute.current = compute;
360
- const defaultValueMemo = React__default.useMemo(() => control._getWatch(name, defaultValue), [control, name, defaultValue]);
361
- const [value, updateValue] = React__default.useState(_compute.current ? _compute.current(defaultValueMemo) : defaultValueMemo);
362
- useDeepEqualEffect(() => control._subscribe({
363
- name: name,
317
+ const { control = methods.control, name, defaultValue, disabled, exact, } = props || {};
318
+ const _defaultValue = React__default.useRef(defaultValue);
319
+ const [value, updateValue] = React__default.useState(control._getWatch(name, _defaultValue.current));
320
+ useIsomorphicLayoutEffect(() => control._subscribe({
321
+ name,
364
322
  formState: {
365
323
  values: true,
366
324
  },
367
325
  exact,
368
- callback: (formState) => {
369
- if (!disabled) {
370
- const formValues = generateWatchOutput(name, control._names, formState.values || control._formValues, false, defaultValue);
371
- if (_compute.current) {
372
- const computedFormValues = _compute.current(formValues);
373
- if (!deepEqual(computedFormValues, _computeFormValues.current)) {
374
- updateValue(computedFormValues);
375
- _computeFormValues.current = computedFormValues;
376
- }
377
- }
378
- else {
379
- updateValue(formValues);
380
- }
381
- }
382
- },
383
- }), [defaultValue, disabled, name, exact]);
326
+ callback: (formState) => !disabled &&
327
+ updateValue(generateWatchOutput(name, control._names, formState.values || control._formValues, false, _defaultValue.current)),
328
+ }), [name, control, disabled, exact]);
384
329
  React__default.useEffect(() => control._removeUnmounted());
385
330
  return value;
386
331
  }
@@ -411,13 +356,12 @@ function useWatch(props) {
411
356
  */
412
357
  function useController(props) {
413
358
  const methods = useFormContext();
414
- const { name, disabled, control = methods.control, shouldUnregister, defaultValue, } = props;
359
+ const { name, disabled, control = methods.control, shouldUnregister } = props;
415
360
  const isArrayField = isNameInFieldArray(control._names.array, name);
416
- const defaultValueMemo = React__default.useMemo(() => get(control._formValues, name, get(control._defaultValues, name, defaultValue)), [control, name, defaultValue]);
417
361
  const value = useWatch({
418
362
  control,
419
363
  name,
420
- defaultValue: defaultValueMemo,
364
+ defaultValue: get(control._formValues, name, get(control._defaultValues, name, props.defaultValue)),
421
365
  exact: true,
422
366
  });
423
367
  const formState = useFormState({
@@ -431,7 +375,6 @@ function useController(props) {
431
375
  value,
432
376
  ...(isBoolean(props.disabled) ? { disabled: props.disabled } : {}),
433
377
  }));
434
- _props.current = props;
435
378
  const fieldState = React__default.useMemo(() => Object.defineProperties({}, {
436
379
  invalid: {
437
380
  enumerable: true,
@@ -471,7 +414,12 @@ function useController(props) {
471
414
  const ref = React__default.useCallback((elm) => {
472
415
  const field = get(control._fields, name);
473
416
  if (field && elm) {
474
- field._f.ref = elm;
417
+ field._f.ref = {
418
+ focus: () => elm.focus && elm.focus(),
419
+ select: () => elm.select && elm.select(),
420
+ setCustomValidity: (message) => elm.setCustomValidity(message),
421
+ reportValidity: () => elm.reportValidity(),
422
+ };
475
423
  }
476
424
  }, [control._fields, name]);
477
425
  const field = React__default.useMemo(() => ({
@@ -727,6 +675,39 @@ var createSubject = () => {
727
675
  };
728
676
  };
729
677
 
678
+ var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
679
+
680
+ function deepEqual(object1, object2) {
681
+ if (isPrimitive(object1) || isPrimitive(object2)) {
682
+ return object1 === object2;
683
+ }
684
+ if (isDateObject(object1) && isDateObject(object2)) {
685
+ return object1.getTime() === object2.getTime();
686
+ }
687
+ const keys1 = Object.keys(object1);
688
+ const keys2 = Object.keys(object2);
689
+ if (keys1.length !== keys2.length) {
690
+ return false;
691
+ }
692
+ for (const key of keys1) {
693
+ const val1 = object1[key];
694
+ if (!keys2.includes(key)) {
695
+ return false;
696
+ }
697
+ if (key !== 'ref') {
698
+ const val2 = object2[key];
699
+ if ((isDateObject(val1) && isDateObject(val2)) ||
700
+ (isObject(val1) && isObject(val2)) ||
701
+ (Array.isArray(val1) && Array.isArray(val2))
702
+ ? !deepEqual(val1, val2)
703
+ : val1 !== val2) {
704
+ return false;
705
+ }
706
+ }
707
+ }
708
+ return true;
709
+ }
710
+
730
711
  var isEmptyObject = (value) => isObject(value) && !Object.keys(value).length;
731
712
 
732
713
  var isFileInput = (element) => element.type === 'file';
@@ -1012,6 +993,12 @@ function schemaErrorLookup(errors, _fields, name) {
1012
993
  error: foundError,
1013
994
  };
1014
995
  }
996
+ if (foundError && foundError.root && foundError.root.type) {
997
+ return {
998
+ name: `${fieldName}.root`,
999
+ error: foundError.root,
1000
+ };
1001
+ }
1015
1002
  names.pop();
1016
1003
  }
1017
1004
  return {
@@ -1290,7 +1277,7 @@ function createFormControl(props = {}) {
1290
1277
  };
1291
1278
  const _fields = {};
1292
1279
  let _defaultValues = isObject(_options.defaultValues) || isObject(_options.values)
1293
- ? cloneObject(_options.values || _options.defaultValues) || {}
1280
+ ? cloneObject(_options.defaultValues || _options.values) || {}
1294
1281
  : {};
1295
1282
  let _formValues = _options.shouldUnregister
1296
1283
  ? {}
@@ -1325,8 +1312,6 @@ function createFormControl(props = {}) {
1325
1312
  array: createSubject(),
1326
1313
  state: createSubject(),
1327
1314
  };
1328
- const validationModeBeforeSubmit = getValidationModes(_options.mode);
1329
- const validationModeAfterSubmit = getValidationModes(_options.reValidateMode);
1330
1315
  const shouldDisplayAllAssociatedErrors = _options.criteriaMode === VALIDATION_MODE.all;
1331
1316
  const debounce = (callback) => (wait) => {
1332
1317
  clearTimeout(timer);
@@ -1597,13 +1582,17 @@ function createFormControl(props = {}) {
1597
1582
  }
1598
1583
  else if (fieldReference.refs) {
1599
1584
  if (isCheckBoxInput(fieldReference.ref)) {
1600
- fieldReference.refs.length > 1
1601
- ? fieldReference.refs.forEach((checkboxRef) => (!checkboxRef.defaultChecked || !checkboxRef.disabled) &&
1602
- (checkboxRef.checked = Array.isArray(fieldValue)
1603
- ? !!fieldValue.find((data) => data === checkboxRef.value)
1604
- : fieldValue === checkboxRef.value))
1605
- : fieldReference.refs[0] &&
1606
- (fieldReference.refs[0].checked = !!fieldValue);
1585
+ fieldReference.refs.forEach((checkboxRef) => {
1586
+ if (!checkboxRef.defaultChecked || !checkboxRef.disabled) {
1587
+ if (Array.isArray(fieldValue)) {
1588
+ checkboxRef.checked = !!fieldValue.find((data) => data === checkboxRef.value);
1589
+ }
1590
+ else {
1591
+ checkboxRef.checked =
1592
+ fieldValue === checkboxRef.value || !!fieldValue;
1593
+ }
1594
+ }
1595
+ });
1607
1596
  }
1608
1597
  else {
1609
1598
  fieldReference.refs.forEach((radioRef) => (radioRef.checked = radioRef.value === fieldValue));
@@ -1629,8 +1618,11 @@ function createFormControl(props = {}) {
1629
1618
  };
1630
1619
  const setValues = (name, value, options) => {
1631
1620
  for (const fieldKey in value) {
1621
+ if (!value.hasOwnProperty(fieldKey)) {
1622
+ return;
1623
+ }
1632
1624
  const fieldValue = value[fieldKey];
1633
- const fieldName = `${name}.${fieldKey}`;
1625
+ const fieldName = name + '.' + fieldKey;
1634
1626
  const field = get(_fields, fieldName);
1635
1627
  (_names.array.has(name) ||
1636
1628
  isObject(fieldValue) ||
@@ -1685,6 +1677,8 @@ function createFormControl(props = {}) {
1685
1677
  (isDateObject(fieldValue) && isNaN(fieldValue.getTime())) ||
1686
1678
  deepEqual(fieldValue, get(_formValues, name, fieldValue));
1687
1679
  };
1680
+ const validationModeBeforeSubmit = getValidationModes(_options.mode);
1681
+ const validationModeAfterSubmit = getValidationModes(_options.reValidateMode);
1688
1682
  if (field) {
1689
1683
  let error;
1690
1684
  let isValid;
@@ -2227,6 +2221,7 @@ function createFormControl(props = {}) {
2227
2221
  setError,
2228
2222
  _subscribe,
2229
2223
  _runSchema,
2224
+ _focusError,
2230
2225
  _getWatch,
2231
2226
  _getDirty,
2232
2227
  _setValid,
@@ -2296,6 +2291,9 @@ function createFormControl(props = {}) {
2296
2291
  }
2297
2292
 
2298
2293
  var generateId = () => {
2294
+ if (!isUndefined(crypto) && crypto.randomUUID) {
2295
+ return crypto.randomUUID();
2296
+ }
2299
2297
  const d = typeof performance === 'undefined' ? Date.now() : performance.now() * 1000;
2300
2298
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
2301
2299
  const r = (Math.random() * 16 + d) % 16 | 0;
@@ -2404,22 +2402,24 @@ function useFieldArray(props) {
2404
2402
  const [fields, setFields] = React__default.useState(control._getFieldArray(name));
2405
2403
  const ids = React__default.useRef(control._getFieldArray(name).map(generateId));
2406
2404
  const _fieldIds = React__default.useRef(fields);
2405
+ const _name = React__default.useRef(name);
2407
2406
  const _actioned = React__default.useRef(false);
2407
+ _name.current = name;
2408
2408
  _fieldIds.current = fields;
2409
2409
  control._names.array.add(name);
2410
- React__default.useMemo(() => rules &&
2411
- control.register(name, rules), [control, rules, name]);
2412
- useEffect(() => control._subjects.array.subscribe({
2410
+ rules &&
2411
+ control.register(name, rules);
2412
+ useIsomorphicLayoutEffect(() => control._subjects.array.subscribe({
2413
2413
  next: ({ values, name: fieldArrayName, }) => {
2414
- if (fieldArrayName === name || !fieldArrayName) {
2415
- const fieldValues = get(values, name);
2414
+ if (fieldArrayName === _name.current || !fieldArrayName) {
2415
+ const fieldValues = get(values, _name.current);
2416
2416
  if (Array.isArray(fieldValues)) {
2417
2417
  setFields(fieldValues);
2418
2418
  ids.current = fieldValues.map(generateId);
2419
2419
  }
2420
2420
  }
2421
2421
  },
2422
- }).unsubscribe, [control, name]);
2422
+ }).unsubscribe, [control]);
2423
2423
  const updateValues = React__default.useCallback((updatedFieldArrayValues) => {
2424
2424
  _actioned.current = true;
2425
2425
  control._setFieldArray(name, updatedFieldArrayValues);
@@ -2599,7 +2599,6 @@ function useFieldArray(props) {
2599
2599
  };
2600
2600
  }
2601
2601
 
2602
- const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React__default.useLayoutEffect : React__default.useEffect;
2603
2602
  /**
2604
2603
  * Custom hook to manage the entire form.
2605
2604
  *
@@ -2652,14 +2651,21 @@ function useForm(props = {}) {
2652
2651
  : props.defaultValues,
2653
2652
  });
2654
2653
  if (!_formControl.current) {
2655
- _formControl.current = {
2656
- ...(props.formControl ? props.formControl : createFormControl(props)),
2657
- formState,
2658
- };
2659
- if (props.formControl &&
2660
- props.defaultValues &&
2661
- !isFunction(props.defaultValues)) {
2662
- props.formControl.reset(props.defaultValues, props.resetOptions);
2654
+ if (props.formControl) {
2655
+ _formControl.current = {
2656
+ ...props.formControl,
2657
+ formState,
2658
+ };
2659
+ if (props.defaultValues && !isFunction(props.defaultValues)) {
2660
+ props.formControl.reset(props.defaultValues, props.resetOptions);
2661
+ }
2662
+ }
2663
+ else {
2664
+ const { formControl, ...rest } = createFormControl(props);
2665
+ _formControl.current = {
2666
+ ...rest,
2667
+ formState,
2668
+ };
2663
2669
  }
2664
2670
  }
2665
2671
  const control = _formControl.current.control;
@@ -2685,10 +2691,13 @@ function useForm(props = {}) {
2685
2691
  if (props.reValidateMode) {
2686
2692
  control._options.reValidateMode = props.reValidateMode;
2687
2693
  }
2688
- if (props.errors && !isEmptyObject(props.errors)) {
2694
+ }, [control, props.mode, props.reValidateMode]);
2695
+ React__default.useEffect(() => {
2696
+ if (props.errors) {
2689
2697
  control._setErrors(props.errors);
2698
+ control._focusError();
2690
2699
  }
2691
- }, [control, props.errors, props.mode, props.reValidateMode]);
2700
+ }, [control, props.errors]);
2692
2701
  React__default.useEffect(() => {
2693
2702
  props.shouldUnregister &&
2694
2703
  control._subjects.state.next({