react-hook-form 7.24.0 → 7.25.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.
- package/README.md +27 -4
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.mjs +89 -92
- 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/createFormControl.d.ts.map +1 -1
- package/dist/logic/getProxyFormState.d.ts.map +1 -1
- package/dist/types/form.d.ts +12 -4
- package/dist/types/form.d.ts.map +1 -1
- package/dist/useController.d.ts.map +1 -1
- package/dist/useFieldArray.d.ts.map +1 -1
- package/package.json +17 -17
package/dist/index.esm.mjs
CHANGED
@@ -70,22 +70,17 @@ const useFormContext = () => React.useContext(HookFormContext);
|
|
70
70
|
const FormProvider = (props) => (React.createElement(HookFormContext.Provider, { value: omit(props, 'children') }, props.children));
|
71
71
|
|
72
72
|
var getProxyFormState = (formState, _proxyFormState, localProxyFormState, isRoot = true) => {
|
73
|
-
function createGetter(prop) {
|
74
|
-
return () => {
|
75
|
-
if (prop in formState) {
|
76
|
-
if (_proxyFormState[prop] !== VALIDATION_MODE.all) {
|
77
|
-
_proxyFormState[prop] = !isRoot || VALIDATION_MODE.all;
|
78
|
-
}
|
79
|
-
localProxyFormState && (localProxyFormState[prop] = true);
|
80
|
-
return formState[prop];
|
81
|
-
}
|
82
|
-
return undefined;
|
83
|
-
};
|
84
|
-
}
|
85
73
|
const result = {};
|
86
74
|
for (const key in formState) {
|
87
75
|
Object.defineProperty(result, key, {
|
88
|
-
get:
|
76
|
+
get: () => {
|
77
|
+
const _key = key;
|
78
|
+
if (_proxyFormState[_key] !== VALIDATION_MODE.all) {
|
79
|
+
_proxyFormState[_key] = !isRoot || VALIDATION_MODE.all;
|
80
|
+
}
|
81
|
+
localProxyFormState && (localProxyFormState[_key] = true);
|
82
|
+
return formState[_key];
|
83
|
+
},
|
89
84
|
});
|
90
85
|
}
|
91
86
|
return result;
|
@@ -242,11 +237,11 @@ function useController(props) {
|
|
242
237
|
updateMounted(name, true);
|
243
238
|
return () => {
|
244
239
|
const _shouldUnregisterField = control._options.shouldUnregister || shouldUnregister;
|
245
|
-
isArrayField
|
240
|
+
(isArrayField
|
246
241
|
? _shouldUnregisterField && !control._stateFlags.action
|
247
|
-
: _shouldUnregisterField
|
248
|
-
|
249
|
-
|
242
|
+
: _shouldUnregisterField)
|
243
|
+
? control.unregister(name)
|
244
|
+
: updateMounted(name, false);
|
250
245
|
};
|
251
246
|
}, [name, control, isArrayField, shouldUnregister]);
|
252
247
|
return {
|
@@ -280,15 +275,10 @@ function useController(props) {
|
|
280
275
|
reportValidity: () => elm.reportValidity(),
|
281
276
|
};
|
282
277
|
}
|
283
|
-
}, [name, control]),
|
278
|
+
}, [name, control._fields]),
|
284
279
|
},
|
285
280
|
formState,
|
286
|
-
fieldState:
|
287
|
-
invalid: !!get(formState.errors, name),
|
288
|
-
isDirty: !!get(formState.dirtyFields, name),
|
289
|
-
isTouched: !!get(formState.touchedFields, name),
|
290
|
-
error: get(formState.errors, name),
|
291
|
-
},
|
281
|
+
fieldState: control.getFieldState(name, formState),
|
292
282
|
};
|
293
283
|
}
|
294
284
|
|
@@ -465,89 +455,89 @@ const useFieldArray = (props) => {
|
|
465
455
|
});
|
466
456
|
const updateValues = React.useCallback((updatedFieldArrayValues) => {
|
467
457
|
_actioned.current = true;
|
468
|
-
|
458
|
+
control._updateFieldArray(name, updatedFieldArrayValues);
|
469
459
|
}, [control, name]);
|
470
460
|
const append$1 = (value, options) => {
|
471
461
|
const appendValue = convertToArrayPayload(cloneObject(value));
|
472
462
|
const updatedFieldArrayValues = append(control._getFieldArray(name), appendValue);
|
473
463
|
control._names.focus = getFocusFieldName(name, updatedFieldArrayValues.length - 1, options);
|
474
464
|
ids.current = append(ids.current, appendValue.map(generateId));
|
475
|
-
setFields(updatedFieldArrayValues);
|
476
465
|
updateValues(updatedFieldArrayValues);
|
477
|
-
|
466
|
+
setFields(updatedFieldArrayValues);
|
467
|
+
control._updateFieldArray(name, updatedFieldArrayValues, append, {
|
478
468
|
argA: fillEmptyArray(value),
|
479
|
-
}
|
469
|
+
});
|
480
470
|
};
|
481
471
|
const prepend$1 = (value, options) => {
|
482
472
|
const prependValue = convertToArrayPayload(cloneObject(value));
|
483
473
|
const updatedFieldArrayValues = prepend(control._getFieldArray(name), prependValue);
|
484
474
|
control._names.focus = getFocusFieldName(name, 0, options);
|
485
475
|
ids.current = prepend(ids.current, prependValue.map(generateId));
|
486
|
-
setFields(updatedFieldArrayValues);
|
487
476
|
updateValues(updatedFieldArrayValues);
|
488
|
-
|
477
|
+
setFields(updatedFieldArrayValues);
|
478
|
+
control._updateFieldArray(name, updatedFieldArrayValues, prepend, {
|
489
479
|
argA: fillEmptyArray(value),
|
490
|
-
}
|
480
|
+
});
|
491
481
|
};
|
492
482
|
const remove = (index) => {
|
493
483
|
const updatedFieldArrayValues = removeArrayAt(control._getFieldArray(name), index);
|
494
484
|
ids.current = removeArrayAt(ids.current, index);
|
495
|
-
setFields(updatedFieldArrayValues);
|
496
485
|
updateValues(updatedFieldArrayValues);
|
497
|
-
|
486
|
+
setFields(updatedFieldArrayValues);
|
487
|
+
control._updateFieldArray(name, updatedFieldArrayValues, removeArrayAt, {
|
498
488
|
argA: index,
|
499
|
-
}
|
489
|
+
});
|
500
490
|
};
|
501
491
|
const insert$1 = (index, value, options) => {
|
502
492
|
const insertValue = convertToArrayPayload(cloneObject(value));
|
503
493
|
const updatedFieldArrayValues = insert(control._getFieldArray(name), index, insertValue);
|
504
|
-
updateValues(updatedFieldArrayValues);
|
505
494
|
control._names.focus = getFocusFieldName(name, index, options);
|
506
495
|
ids.current = insert(ids.current, index, insertValue.map(generateId));
|
496
|
+
updateValues(updatedFieldArrayValues);
|
507
497
|
setFields(updatedFieldArrayValues);
|
508
|
-
control._updateFieldArray(name, insert, {
|
498
|
+
control._updateFieldArray(name, updatedFieldArrayValues, insert, {
|
509
499
|
argA: index,
|
510
500
|
argB: fillEmptyArray(value),
|
511
|
-
}
|
501
|
+
});
|
512
502
|
};
|
513
503
|
const swap = (indexA, indexB) => {
|
514
504
|
const updatedFieldArrayValues = control._getFieldArray(name);
|
515
505
|
swapArrayAt(updatedFieldArrayValues, indexA, indexB);
|
516
506
|
swapArrayAt(ids.current, indexA, indexB);
|
517
|
-
setFields(updatedFieldArrayValues);
|
518
507
|
updateValues(updatedFieldArrayValues);
|
519
|
-
|
508
|
+
setFields(updatedFieldArrayValues);
|
509
|
+
control._updateFieldArray(name, updatedFieldArrayValues, swapArrayAt, {
|
520
510
|
argA: indexA,
|
521
511
|
argB: indexB,
|
522
|
-
},
|
512
|
+
}, false);
|
523
513
|
};
|
524
514
|
const move = (from, to) => {
|
525
515
|
const updatedFieldArrayValues = control._getFieldArray(name);
|
526
516
|
moveArrayAt(updatedFieldArrayValues, from, to);
|
527
517
|
moveArrayAt(ids.current, from, to);
|
528
|
-
setFields(updatedFieldArrayValues);
|
529
518
|
updateValues(updatedFieldArrayValues);
|
530
|
-
|
519
|
+
setFields(updatedFieldArrayValues);
|
520
|
+
control._updateFieldArray(name, updatedFieldArrayValues, moveArrayAt, {
|
531
521
|
argA: from,
|
532
522
|
argB: to,
|
533
|
-
},
|
523
|
+
}, false);
|
534
524
|
};
|
535
525
|
const update = (index, value) => {
|
536
526
|
const updatedFieldArrayValues = updateAt(control._getFieldArray(name), index, value);
|
537
527
|
ids.current = [...updatedFieldArrayValues].map((item, i) => !item || i === index ? generateId() : ids.current[i]);
|
538
|
-
setFields([...updatedFieldArrayValues]);
|
539
528
|
updateValues(updatedFieldArrayValues);
|
540
|
-
|
529
|
+
setFields([...updatedFieldArrayValues]);
|
530
|
+
control._updateFieldArray(name, updatedFieldArrayValues, updateAt, {
|
541
531
|
argA: index,
|
542
532
|
argB: value,
|
543
|
-
},
|
533
|
+
}, true, false);
|
544
534
|
};
|
545
535
|
const replace = (value) => {
|
546
536
|
const updatedFieldArrayValues = convertToArrayPayload(value);
|
547
537
|
ids.current = updatedFieldArrayValues.map(generateId);
|
548
538
|
updateValues([...updatedFieldArrayValues]);
|
549
539
|
setFields([...updatedFieldArrayValues]);
|
550
|
-
control._updateFieldArray(name, () => updatedFieldArrayValues, {},
|
540
|
+
control._updateFieldArray(name, [...updatedFieldArrayValues], () => updatedFieldArrayValues, {}, true, false);
|
551
541
|
};
|
552
542
|
React.useEffect(() => {
|
553
543
|
control._stateFlags.action = false;
|
@@ -573,7 +563,7 @@ const useFieldArray = (props) => {
|
|
573
563
|
control._proxyFormState.isValid && control._updateValid();
|
574
564
|
}, [fields, name, control]);
|
575
565
|
React.useEffect(() => {
|
576
|
-
!get(control._formValues, name) &&
|
566
|
+
!get(control._formValues, name) && control._updateFieldArray(name);
|
577
567
|
return () => {
|
578
568
|
(control._options.shouldUnregister || shouldUnregister) &&
|
579
569
|
control.unregister(name);
|
@@ -1143,33 +1133,38 @@ function createFormControl(props = {}) {
|
|
1143
1133
|
}
|
1144
1134
|
return isValid;
|
1145
1135
|
};
|
1146
|
-
const _updateFieldArray = (name,
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1150
|
-
|
1151
|
-
|
1152
|
-
|
1153
|
-
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
1157
|
-
|
1158
|
-
|
1159
|
-
|
1160
|
-
|
1161
|
-
|
1162
|
-
|
1136
|
+
const _updateFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndErrors = true) => {
|
1137
|
+
if (args && method) {
|
1138
|
+
_stateFlags.action = true;
|
1139
|
+
if (shouldUpdateFieldsAndErrors && Array.isArray(get(_fields, name))) {
|
1140
|
+
const fieldValues = method(get(_fields, name), args.argA, args.argB);
|
1141
|
+
shouldSetValues && set(_fields, name, fieldValues);
|
1142
|
+
}
|
1143
|
+
if (_proxyFormState.errors &&
|
1144
|
+
shouldUpdateFieldsAndErrors &&
|
1145
|
+
Array.isArray(get(_formState.errors, name))) {
|
1146
|
+
const errors = method(get(_formState.errors, name), args.argA, args.argB);
|
1147
|
+
shouldSetValues && set(_formState.errors, name, errors);
|
1148
|
+
unsetEmptyArray(_formState.errors, name);
|
1149
|
+
}
|
1150
|
+
if (_proxyFormState.touchedFields &&
|
1151
|
+
Array.isArray(get(_formState.touchedFields, name))) {
|
1152
|
+
const touchedFields = method(get(_formState.touchedFields, name), args.argA, args.argB);
|
1153
|
+
shouldSetValues && set(_formState.touchedFields, name, touchedFields);
|
1154
|
+
}
|
1155
|
+
if (_proxyFormState.dirtyFields) {
|
1156
|
+
_formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
|
1157
|
+
}
|
1158
|
+
_subjects.state.next({
|
1159
|
+
isDirty: _getDirty(name, values),
|
1160
|
+
dirtyFields: _formState.dirtyFields,
|
1161
|
+
errors: _formState.errors,
|
1162
|
+
isValid: _formState.isValid,
|
1163
|
+
});
|
1163
1164
|
}
|
1164
|
-
|
1165
|
-
|
1165
|
+
else {
|
1166
|
+
set(_formValues, name, values);
|
1166
1167
|
}
|
1167
|
-
_subjects.state.next({
|
1168
|
-
isDirty: _getDirty(name, values),
|
1169
|
-
dirtyFields: _formState.dirtyFields,
|
1170
|
-
errors: _formState.errors,
|
1171
|
-
isValid: _formState.isValid,
|
1172
|
-
});
|
1173
1168
|
};
|
1174
1169
|
const updateErrors = (name, error) => (set(_formState.errors, name, error),
|
1175
1170
|
_subjects.state.next({
|
@@ -1348,7 +1343,10 @@ function createFormControl(props = {}) {
|
|
1348
1343
|
fieldReference.refs.forEach((radioRef) => (radioRef.checked = radioRef.value === fieldValue));
|
1349
1344
|
}
|
1350
1345
|
}
|
1351
|
-
else if (
|
1346
|
+
else if (isFileInput(fieldReference.ref)) {
|
1347
|
+
fieldReference.ref.value = '';
|
1348
|
+
}
|
1349
|
+
else {
|
1352
1350
|
fieldReference.ref.value = fieldValue;
|
1353
1351
|
if (!fieldReference.ref.type) {
|
1354
1352
|
_subjects.watch.next({
|
@@ -1378,7 +1376,8 @@ function createFormControl(props = {}) {
|
|
1378
1376
|
const setValue = (name, value, options = {}) => {
|
1379
1377
|
const field = get(_fields, name);
|
1380
1378
|
const isFieldArray = _names.array.has(name);
|
1381
|
-
|
1379
|
+
const cloneValue = cloneObject(value);
|
1380
|
+
set(_formValues, name, cloneValue);
|
1382
1381
|
if (isFieldArray) {
|
1383
1382
|
_subjects.array.next({
|
1384
1383
|
name,
|
@@ -1390,14 +1389,14 @@ function createFormControl(props = {}) {
|
|
1390
1389
|
_subjects.state.next({
|
1391
1390
|
name,
|
1392
1391
|
dirtyFields: _formState.dirtyFields,
|
1393
|
-
isDirty: _getDirty(name,
|
1392
|
+
isDirty: _getDirty(name, cloneValue),
|
1394
1393
|
});
|
1395
1394
|
}
|
1396
1395
|
}
|
1397
1396
|
else {
|
1398
|
-
field && !field._f && !isNullOrUndefined(
|
1399
|
-
? setValues(name,
|
1400
|
-
: setFieldValue(name,
|
1397
|
+
field && !field._f && !isNullOrUndefined(cloneValue)
|
1398
|
+
? setValues(name, cloneValue, options)
|
1399
|
+
: setFieldValue(name, cloneValue, options);
|
1401
1400
|
}
|
1402
1401
|
isWatched(name, _names) && _subjects.state.next({});
|
1403
1402
|
_subjects.watch.next({
|
@@ -1441,10 +1440,9 @@ function createFormControl(props = {}) {
|
|
1441
1440
|
}
|
1442
1441
|
!isBlurEvent && watched && _subjects.state.next({});
|
1443
1442
|
validateFields[name] = validateFields[name] ? +1 : 1;
|
1444
|
-
|
1445
|
-
|
1446
|
-
|
1447
|
-
});
|
1443
|
+
_subjects.state.next({
|
1444
|
+
isValidating: true,
|
1445
|
+
});
|
1448
1446
|
if (_options.resolver) {
|
1449
1447
|
const { errors } = await _executeSchema([name]);
|
1450
1448
|
const previousErrorLookupResult = schemaErrorLookup(_formState.errors, _fields, name);
|
@@ -1502,6 +1500,12 @@ function createFormControl(props = {}) {
|
|
1502
1500
|
? get(values, fieldNames)
|
1503
1501
|
: fieldNames.map((name) => get(values, name));
|
1504
1502
|
};
|
1503
|
+
const getFieldState = (name, formState) => ({
|
1504
|
+
invalid: !!get((formState || _formState).errors, name),
|
1505
|
+
isDirty: !!get((formState || _formState).dirtyFields, name),
|
1506
|
+
isTouched: !!get((formState || _formState).touchedFields, name),
|
1507
|
+
error: get((formState || _formState).errors, name),
|
1508
|
+
});
|
1505
1509
|
const clearErrors = (name) => {
|
1506
1510
|
name
|
1507
1511
|
? convertToArrayPayload(name).forEach((inputName) => unset(_formState.errors, inputName))
|
@@ -1766,6 +1770,7 @@ function createFormControl(props = {}) {
|
|
1766
1770
|
control: {
|
1767
1771
|
register,
|
1768
1772
|
unregister,
|
1773
|
+
getFieldState,
|
1769
1774
|
_executeSchema,
|
1770
1775
|
_getWatch,
|
1771
1776
|
_getDirty,
|
@@ -1778,15 +1783,9 @@ function createFormControl(props = {}) {
|
|
1778
1783
|
get _fields() {
|
1779
1784
|
return _fields;
|
1780
1785
|
},
|
1781
|
-
set _fields(value) {
|
1782
|
-
_fields = value;
|
1783
|
-
},
|
1784
1786
|
get _formValues() {
|
1785
1787
|
return _formValues;
|
1786
1788
|
},
|
1787
|
-
set _formValues(value) {
|
1788
|
-
_formValues = value;
|
1789
|
-
},
|
1790
1789
|
get _stateFlags() {
|
1791
1790
|
return _stateFlags;
|
1792
1791
|
},
|
@@ -1796,9 +1795,6 @@ function createFormControl(props = {}) {
|
|
1796
1795
|
get _defaultValues() {
|
1797
1796
|
return _defaultValues;
|
1798
1797
|
},
|
1799
|
-
set _defaultValues(value) {
|
1800
|
-
_defaultValues = value;
|
1801
|
-
},
|
1802
1798
|
get _names() {
|
1803
1799
|
return _names;
|
1804
1800
|
},
|
@@ -1830,6 +1826,7 @@ function createFormControl(props = {}) {
|
|
1830
1826
|
unregister,
|
1831
1827
|
setError,
|
1832
1828
|
setFocus,
|
1829
|
+
getFieldState,
|
1833
1830
|
};
|
1834
1831
|
}
|
1835
1832
|
|