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.
- package/README.md +8 -4
- package/dist/__typetest__/form.test-d.d.ts +1 -1
- package/dist/__typetest__/form.test-d.d.ts.map +1 -1
- package/dist/controller.d.ts +1 -1
- package/dist/controller.d.ts.map +1 -1
- package/dist/form.d.ts +1 -1
- package/dist/form.d.ts.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.mjs +116 -107
- package/dist/index.esm.mjs.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/logic/appendErrors.d.ts +1 -1
- package/dist/logic/appendErrors.d.ts.map +1 -1
- package/dist/logic/createFormControl.d.ts +1 -1
- package/dist/logic/createFormControl.d.ts.map +1 -1
- package/dist/logic/generateId.d.ts.map +1 -1
- package/dist/logic/generateWatchOutput.d.ts +1 -1
- package/dist/logic/generateWatchOutput.d.ts.map +1 -1
- package/dist/logic/getFieldValue.d.ts +1 -1
- package/dist/logic/getFieldValue.d.ts.map +1 -1
- package/dist/logic/getFieldValueAs.d.ts +1 -1
- package/dist/logic/getFieldValueAs.d.ts.map +1 -1
- package/dist/logic/getFocusFieldName.d.ts +1 -1
- package/dist/logic/getFocusFieldName.d.ts.map +1 -1
- package/dist/logic/getProxyFormState.d.ts +1 -1
- package/dist/logic/getProxyFormState.d.ts.map +1 -1
- package/dist/logic/getResolverOptions.d.ts +1 -1
- package/dist/logic/getResolverOptions.d.ts.map +1 -1
- package/dist/logic/getRuleValue.d.ts +1 -1
- package/dist/logic/getRuleValue.d.ts.map +1 -1
- package/dist/logic/getValidateError.d.ts +1 -1
- package/dist/logic/getValidateError.d.ts.map +1 -1
- package/dist/logic/getValidationModes.d.ts +1 -1
- package/dist/logic/getValidationModes.d.ts.map +1 -1
- package/dist/logic/getValueAndMessage.d.ts +1 -1
- package/dist/logic/getValueAndMessage.d.ts.map +1 -1
- package/dist/logic/hasPromiseValidation.d.ts +1 -1
- package/dist/logic/hasPromiseValidation.d.ts.map +1 -1
- package/dist/logic/hasValidation.d.ts +1 -1
- package/dist/logic/hasValidation.d.ts.map +1 -1
- package/dist/logic/isNameInFieldArray.d.ts +1 -1
- package/dist/logic/isNameInFieldArray.d.ts.map +1 -1
- package/dist/logic/isWatched.d.ts +1 -1
- package/dist/logic/isWatched.d.ts.map +1 -1
- package/dist/logic/iterateFieldsByAction.d.ts +1 -1
- package/dist/logic/iterateFieldsByAction.d.ts.map +1 -1
- package/dist/logic/schemaErrorLookup.d.ts +1 -1
- package/dist/logic/schemaErrorLookup.d.ts.map +1 -1
- package/dist/logic/shouldRenderFormState.d.ts +1 -1
- package/dist/logic/shouldRenderFormState.d.ts.map +1 -1
- package/dist/logic/shouldSubscribeByName.d.ts +1 -1
- package/dist/logic/shouldSubscribeByName.d.ts.map +1 -1
- package/dist/logic/skipValidation.d.ts +1 -1
- package/dist/logic/skipValidation.d.ts.map +1 -1
- package/dist/logic/updateFieldArrayRootError.d.ts +1 -1
- package/dist/logic/updateFieldArrayRootError.d.ts.map +1 -1
- package/dist/logic/validateField.d.ts +1 -1
- package/dist/logic/validateField.d.ts.map +1 -1
- package/dist/react-server.esm.mjs +30 -16
- package/dist/react-server.esm.mjs.map +1 -1
- package/dist/types/controller.d.ts +3 -3
- package/dist/types/controller.d.ts.map +1 -1
- package/dist/types/errors.d.ts +3 -3
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/fieldArray.d.ts +4 -4
- package/dist/types/fieldArray.d.ts.map +1 -1
- package/dist/types/fields.d.ts +2 -2
- package/dist/types/fields.d.ts.map +1 -1
- package/dist/types/form.d.ts +25 -22
- package/dist/types/form.d.ts.map +1 -1
- package/dist/types/path/common.d.ts +1 -1
- package/dist/types/path/common.d.ts.map +1 -1
- package/dist/types/path/eager.d.ts +16 -3
- package/dist/types/path/eager.d.ts.map +1 -1
- package/dist/types/path/index.d.ts +1 -1
- package/dist/types/path/index.d.ts.map +1 -1
- package/dist/types/resolvers.d.ts +3 -3
- package/dist/types/resolvers.d.ts.map +1 -1
- package/dist/types/utils.d.ts +1 -1
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/types/validator.d.ts +4 -4
- package/dist/types/validator.d.ts.map +1 -1
- package/dist/useController.d.ts +1 -1
- package/dist/useController.d.ts.map +1 -1
- package/dist/useFieldArray.d.ts +1 -1
- package/dist/useFieldArray.d.ts.map +1 -1
- package/dist/useForm.d.ts +1 -1
- package/dist/useForm.d.ts.map +1 -1
- package/dist/useFormContext.d.ts +1 -1
- package/dist/useFormContext.d.ts.map +1 -1
- package/dist/useFormState.d.ts +1 -1
- package/dist/useFormState.d.ts.map +1 -1
- package/dist/useIsomorphicLayoutEffect.d.ts +3 -0
- package/dist/useIsomorphicLayoutEffect.d.ts.map +1 -0
- package/dist/useWatch.d.ts +1 -92
- package/dist/useWatch.d.ts.map +1 -1
- package/dist/utils/createSubject.d.ts +1 -1
- package/dist/utils/createSubject.d.ts.map +1 -1
- package/dist/utils/flatten.d.ts +1 -1
- package/dist/utils/flatten.d.ts.map +1 -1
- package/dist/utils/get.d.ts.map +1 -1
- package/dist/utils/isCheckBoxInput.d.ts +1 -1
- package/dist/utils/isCheckBoxInput.d.ts.map +1 -1
- package/dist/utils/isEmptyObject.d.ts +1 -1
- package/dist/utils/isEmptyObject.d.ts.map +1 -1
- package/dist/utils/isFileInput.d.ts +1 -1
- package/dist/utils/isFileInput.d.ts.map +1 -1
- package/dist/utils/isMessage.d.ts +1 -1
- package/dist/utils/isMessage.d.ts.map +1 -1
- package/dist/utils/isMultipleSelect.d.ts +1 -1
- package/dist/utils/isMultipleSelect.d.ts.map +1 -1
- package/dist/utils/isPrimitive.d.ts +1 -1
- package/dist/utils/isPrimitive.d.ts.map +1 -1
- package/dist/utils/isRadioInput.d.ts +1 -1
- package/dist/utils/isRadioInput.d.ts.map +1 -1
- package/dist/utils/isRadioOrCheckbox.d.ts +1 -1
- package/dist/utils/isRadioOrCheckbox.d.ts.map +1 -1
- package/dist/utils/live.d.ts +1 -1
- package/dist/utils/live.d.ts.map +1 -1
- package/dist/utils/set.d.ts +1 -1
- package/dist/utils/set.d.ts.map +1 -1
- package/package.json +14 -14
- package/dist/useDeepEqualEffect.d.ts +0 -3
- package/dist/useDeepEqualEffect.d.ts.map +0 -1
package/dist/index.esm.mjs
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import * as React from 'react';
|
2
|
-
import React__default
|
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
|
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 =
|
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
|
-
|
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
|
-
|
307
|
-
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,
|
357
|
-
const
|
358
|
-
const
|
359
|
-
|
360
|
-
|
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
|
-
|
370
|
-
|
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
|
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:
|
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 =
|
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.
|
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.
|
1601
|
-
|
1602
|
-
(
|
1603
|
-
|
1604
|
-
|
1605
|
-
|
1606
|
-
|
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 =
|
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
|
-
|
2411
|
-
control.register(name, rules)
|
2412
|
-
|
2410
|
+
rules &&
|
2411
|
+
control.register(name, rules);
|
2412
|
+
useIsomorphicLayoutEffect(() => control._subjects.array.subscribe({
|
2413
2413
|
next: ({ values, name: fieldArrayName, }) => {
|
2414
|
-
if (fieldArrayName ===
|
2415
|
-
const fieldValues = get(values,
|
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
|
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
|
-
|
2656
|
-
|
2657
|
-
|
2658
|
-
|
2659
|
-
|
2660
|
-
props.defaultValues &&
|
2661
|
-
|
2662
|
-
|
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
|
-
|
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
|
2700
|
+
}, [control, props.errors]);
|
2692
2701
|
React__default.useEffect(() => {
|
2693
2702
|
props.shouldUnregister &&
|
2694
2703
|
control._subjects.state.next({
|