react-hook-form 7.24.2 → 7.25.3
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 +21 -4
- package/dist/constants.d.ts +1 -0
- package/dist/constants.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 +77 -87
- 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 +8 -7
- 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 +16 -16
package/dist/index.esm.mjs
CHANGED
@@ -40,6 +40,7 @@ var get = (obj, path, defaultValue) => {
|
|
40
40
|
|
41
41
|
const EVENTS = {
|
42
42
|
BLUR: 'blur',
|
43
|
+
FOCUS_OUT: 'focusout',
|
43
44
|
CHANGE: 'change',
|
44
45
|
};
|
45
46
|
const VALIDATION_MODE = {
|
@@ -70,22 +71,17 @@ const useFormContext = () => React.useContext(HookFormContext);
|
|
70
71
|
const FormProvider = (props) => (React.createElement(HookFormContext.Provider, { value: omit(props, 'children') }, props.children));
|
71
72
|
|
72
73
|
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
74
|
const result = {};
|
86
75
|
for (const key in formState) {
|
87
76
|
Object.defineProperty(result, key, {
|
88
|
-
get:
|
77
|
+
get: () => {
|
78
|
+
const _key = key;
|
79
|
+
if (_proxyFormState[_key] !== VALIDATION_MODE.all) {
|
80
|
+
_proxyFormState[_key] = !isRoot || VALIDATION_MODE.all;
|
81
|
+
}
|
82
|
+
localProxyFormState && (localProxyFormState[_key] = true);
|
83
|
+
return formState[_key];
|
84
|
+
},
|
89
85
|
});
|
90
86
|
}
|
91
87
|
return result;
|
@@ -280,15 +276,10 @@ function useController(props) {
|
|
280
276
|
reportValidity: () => elm.reportValidity(),
|
281
277
|
};
|
282
278
|
}
|
283
|
-
}, [name, control]),
|
279
|
+
}, [name, control._fields]),
|
284
280
|
},
|
285
281
|
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
|
-
},
|
282
|
+
fieldState: control.getFieldState(name, formState),
|
292
283
|
};
|
293
284
|
}
|
294
285
|
|
@@ -465,89 +456,89 @@ const useFieldArray = (props) => {
|
|
465
456
|
});
|
466
457
|
const updateValues = React.useCallback((updatedFieldArrayValues) => {
|
467
458
|
_actioned.current = true;
|
468
|
-
|
459
|
+
control._updateFieldArray(name, updatedFieldArrayValues);
|
469
460
|
}, [control, name]);
|
470
461
|
const append$1 = (value, options) => {
|
471
462
|
const appendValue = convertToArrayPayload(cloneObject(value));
|
472
463
|
const updatedFieldArrayValues = append(control._getFieldArray(name), appendValue);
|
473
464
|
control._names.focus = getFocusFieldName(name, updatedFieldArrayValues.length - 1, options);
|
474
465
|
ids.current = append(ids.current, appendValue.map(generateId));
|
475
|
-
setFields(updatedFieldArrayValues);
|
476
466
|
updateValues(updatedFieldArrayValues);
|
477
|
-
|
467
|
+
setFields(updatedFieldArrayValues);
|
468
|
+
control._updateFieldArray(name, updatedFieldArrayValues, append, {
|
478
469
|
argA: fillEmptyArray(value),
|
479
|
-
}
|
470
|
+
});
|
480
471
|
};
|
481
472
|
const prepend$1 = (value, options) => {
|
482
473
|
const prependValue = convertToArrayPayload(cloneObject(value));
|
483
474
|
const updatedFieldArrayValues = prepend(control._getFieldArray(name), prependValue);
|
484
475
|
control._names.focus = getFocusFieldName(name, 0, options);
|
485
476
|
ids.current = prepend(ids.current, prependValue.map(generateId));
|
486
|
-
setFields(updatedFieldArrayValues);
|
487
477
|
updateValues(updatedFieldArrayValues);
|
488
|
-
|
478
|
+
setFields(updatedFieldArrayValues);
|
479
|
+
control._updateFieldArray(name, updatedFieldArrayValues, prepend, {
|
489
480
|
argA: fillEmptyArray(value),
|
490
|
-
}
|
481
|
+
});
|
491
482
|
};
|
492
483
|
const remove = (index) => {
|
493
484
|
const updatedFieldArrayValues = removeArrayAt(control._getFieldArray(name), index);
|
494
485
|
ids.current = removeArrayAt(ids.current, index);
|
495
|
-
setFields(updatedFieldArrayValues);
|
496
486
|
updateValues(updatedFieldArrayValues);
|
497
|
-
|
487
|
+
setFields(updatedFieldArrayValues);
|
488
|
+
control._updateFieldArray(name, updatedFieldArrayValues, removeArrayAt, {
|
498
489
|
argA: index,
|
499
|
-
}
|
490
|
+
});
|
500
491
|
};
|
501
492
|
const insert$1 = (index, value, options) => {
|
502
493
|
const insertValue = convertToArrayPayload(cloneObject(value));
|
503
494
|
const updatedFieldArrayValues = insert(control._getFieldArray(name), index, insertValue);
|
504
|
-
updateValues(updatedFieldArrayValues);
|
505
495
|
control._names.focus = getFocusFieldName(name, index, options);
|
506
496
|
ids.current = insert(ids.current, index, insertValue.map(generateId));
|
497
|
+
updateValues(updatedFieldArrayValues);
|
507
498
|
setFields(updatedFieldArrayValues);
|
508
|
-
control._updateFieldArray(name, insert, {
|
499
|
+
control._updateFieldArray(name, updatedFieldArrayValues, insert, {
|
509
500
|
argA: index,
|
510
501
|
argB: fillEmptyArray(value),
|
511
|
-
}
|
502
|
+
});
|
512
503
|
};
|
513
504
|
const swap = (indexA, indexB) => {
|
514
505
|
const updatedFieldArrayValues = control._getFieldArray(name);
|
515
506
|
swapArrayAt(updatedFieldArrayValues, indexA, indexB);
|
516
507
|
swapArrayAt(ids.current, indexA, indexB);
|
517
|
-
setFields(updatedFieldArrayValues);
|
518
508
|
updateValues(updatedFieldArrayValues);
|
519
|
-
|
509
|
+
setFields(updatedFieldArrayValues);
|
510
|
+
control._updateFieldArray(name, updatedFieldArrayValues, swapArrayAt, {
|
520
511
|
argA: indexA,
|
521
512
|
argB: indexB,
|
522
|
-
},
|
513
|
+
}, false);
|
523
514
|
};
|
524
515
|
const move = (from, to) => {
|
525
516
|
const updatedFieldArrayValues = control._getFieldArray(name);
|
526
517
|
moveArrayAt(updatedFieldArrayValues, from, to);
|
527
518
|
moveArrayAt(ids.current, from, to);
|
528
|
-
setFields(updatedFieldArrayValues);
|
529
519
|
updateValues(updatedFieldArrayValues);
|
530
|
-
|
520
|
+
setFields(updatedFieldArrayValues);
|
521
|
+
control._updateFieldArray(name, updatedFieldArrayValues, moveArrayAt, {
|
531
522
|
argA: from,
|
532
523
|
argB: to,
|
533
|
-
},
|
524
|
+
}, false);
|
534
525
|
};
|
535
526
|
const update = (index, value) => {
|
536
527
|
const updatedFieldArrayValues = updateAt(control._getFieldArray(name), index, value);
|
537
528
|
ids.current = [...updatedFieldArrayValues].map((item, i) => !item || i === index ? generateId() : ids.current[i]);
|
538
|
-
setFields([...updatedFieldArrayValues]);
|
539
529
|
updateValues(updatedFieldArrayValues);
|
540
|
-
|
530
|
+
setFields([...updatedFieldArrayValues]);
|
531
|
+
control._updateFieldArray(name, updatedFieldArrayValues, updateAt, {
|
541
532
|
argA: index,
|
542
533
|
argB: value,
|
543
|
-
},
|
534
|
+
}, true, false);
|
544
535
|
};
|
545
536
|
const replace = (value) => {
|
546
|
-
const updatedFieldArrayValues = convertToArrayPayload(value);
|
537
|
+
const updatedFieldArrayValues = convertToArrayPayload(cloneObject(value));
|
547
538
|
ids.current = updatedFieldArrayValues.map(generateId);
|
548
539
|
updateValues([...updatedFieldArrayValues]);
|
549
540
|
setFields([...updatedFieldArrayValues]);
|
550
|
-
control._updateFieldArray(name, () =>
|
541
|
+
control._updateFieldArray(name, [...updatedFieldArrayValues], (data) => data, {}, true, false);
|
551
542
|
};
|
552
543
|
React.useEffect(() => {
|
553
544
|
control._stateFlags.action = false;
|
@@ -573,7 +564,7 @@ const useFieldArray = (props) => {
|
|
573
564
|
control._proxyFormState.isValid && control._updateValid();
|
574
565
|
}, [fields, name, control]);
|
575
566
|
React.useEffect(() => {
|
576
|
-
!get(control._formValues, name) &&
|
567
|
+
!get(control._formValues, name) && control._updateFieldArray(name);
|
577
568
|
return () => {
|
578
569
|
(control._options.shouldUnregister || shouldUnregister) &&
|
579
570
|
control.unregister(name);
|
@@ -1143,33 +1134,38 @@ function createFormControl(props = {}) {
|
|
1143
1134
|
}
|
1144
1135
|
return isValid;
|
1145
1136
|
};
|
1146
|
-
const _updateFieldArray = (name,
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1150
|
-
|
1151
|
-
|
1152
|
-
|
1153
|
-
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
1157
|
-
|
1158
|
-
|
1159
|
-
|
1160
|
-
|
1161
|
-
|
1162
|
-
|
1137
|
+
const _updateFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndErrors = true) => {
|
1138
|
+
if (args && method) {
|
1139
|
+
_stateFlags.action = true;
|
1140
|
+
if (shouldUpdateFieldsAndErrors && Array.isArray(get(_fields, name))) {
|
1141
|
+
const fieldValues = method(get(_fields, name), args.argA, args.argB);
|
1142
|
+
shouldSetValues && set(_fields, name, fieldValues);
|
1143
|
+
}
|
1144
|
+
if (_proxyFormState.errors &&
|
1145
|
+
shouldUpdateFieldsAndErrors &&
|
1146
|
+
Array.isArray(get(_formState.errors, name))) {
|
1147
|
+
const errors = method(get(_formState.errors, name), args.argA, args.argB);
|
1148
|
+
shouldSetValues && set(_formState.errors, name, errors);
|
1149
|
+
unsetEmptyArray(_formState.errors, name);
|
1150
|
+
}
|
1151
|
+
if (_proxyFormState.touchedFields &&
|
1152
|
+
Array.isArray(get(_formState.touchedFields, name))) {
|
1153
|
+
const touchedFields = method(get(_formState.touchedFields, name), args.argA, args.argB);
|
1154
|
+
shouldSetValues && set(_formState.touchedFields, name, touchedFields);
|
1155
|
+
}
|
1156
|
+
if (_proxyFormState.dirtyFields) {
|
1157
|
+
_formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
|
1158
|
+
}
|
1159
|
+
_subjects.state.next({
|
1160
|
+
isDirty: _getDirty(name, values),
|
1161
|
+
dirtyFields: _formState.dirtyFields,
|
1162
|
+
errors: _formState.errors,
|
1163
|
+
isValid: _formState.isValid,
|
1164
|
+
});
|
1163
1165
|
}
|
1164
|
-
|
1165
|
-
|
1166
|
+
else {
|
1167
|
+
set(_formValues, name, values);
|
1166
1168
|
}
|
1167
|
-
_subjects.state.next({
|
1168
|
-
isDirty: _getDirty(name, values),
|
1169
|
-
dirtyFields: _formState.dirtyFields,
|
1170
|
-
errors: _formState.errors,
|
1171
|
-
isValid: _formState.isValid,
|
1172
|
-
});
|
1173
1169
|
};
|
1174
1170
|
const updateErrors = (name, error) => (set(_formState.errors, name, error),
|
1175
1171
|
_subjects.state.next({
|
@@ -1348,7 +1344,10 @@ function createFormControl(props = {}) {
|
|
1348
1344
|
fieldReference.refs.forEach((radioRef) => (radioRef.checked = radioRef.value === fieldValue));
|
1349
1345
|
}
|
1350
1346
|
}
|
1351
|
-
else if (
|
1347
|
+
else if (isFileInput(fieldReference.ref)) {
|
1348
|
+
fieldReference.ref.value = '';
|
1349
|
+
}
|
1350
|
+
else {
|
1352
1351
|
fieldReference.ref.value = fieldValue;
|
1353
1352
|
if (!fieldReference.ref.type) {
|
1354
1353
|
_subjects.watch.next({
|
@@ -1415,7 +1414,7 @@ function createFormControl(props = {}) {
|
|
1415
1414
|
const fieldValue = target.type
|
1416
1415
|
? getFieldValue(field._f)
|
1417
1416
|
: getEventValue(event);
|
1418
|
-
const isBlurEvent = event.type === EVENTS.BLUR;
|
1417
|
+
const isBlurEvent = event.type === EVENTS.BLUR || event.type === EVENTS.FOCUS_OUT;
|
1419
1418
|
const shouldSkipValidation = (!hasValidation(field._f) &&
|
1420
1419
|
!_options.resolver &&
|
1421
1420
|
!get(_formState.errors, name) &&
|
@@ -1442,10 +1441,9 @@ function createFormControl(props = {}) {
|
|
1442
1441
|
}
|
1443
1442
|
!isBlurEvent && watched && _subjects.state.next({});
|
1444
1443
|
validateFields[name] = validateFields[name] ? +1 : 1;
|
1445
|
-
|
1446
|
-
|
1447
|
-
|
1448
|
-
});
|
1444
|
+
_subjects.state.next({
|
1445
|
+
isValidating: true,
|
1446
|
+
});
|
1449
1447
|
if (_options.resolver) {
|
1450
1448
|
const { errors } = await _executeSchema([name]);
|
1451
1449
|
const previousErrorLookupResult = schemaErrorLookup(_formState.errors, _fields, name);
|
@@ -1503,7 +1501,7 @@ function createFormControl(props = {}) {
|
|
1503
1501
|
? get(values, fieldNames)
|
1504
1502
|
: fieldNames.map((name) => get(values, name));
|
1505
1503
|
};
|
1506
|
-
const
|
1504
|
+
const getFieldState = (name, formState) => ({
|
1507
1505
|
invalid: !!get((formState || _formState).errors, name),
|
1508
1506
|
isDirty: !!get((formState || _formState).dirtyFields, name),
|
1509
1507
|
isTouched: !!get((formState || _formState).touchedFields, name),
|
@@ -1773,6 +1771,7 @@ function createFormControl(props = {}) {
|
|
1773
1771
|
control: {
|
1774
1772
|
register,
|
1775
1773
|
unregister,
|
1774
|
+
getFieldState,
|
1776
1775
|
_executeSchema,
|
1777
1776
|
_getWatch,
|
1778
1777
|
_getDirty,
|
@@ -1785,15 +1784,9 @@ function createFormControl(props = {}) {
|
|
1785
1784
|
get _fields() {
|
1786
1785
|
return _fields;
|
1787
1786
|
},
|
1788
|
-
set _fields(value) {
|
1789
|
-
_fields = value;
|
1790
|
-
},
|
1791
1787
|
get _formValues() {
|
1792
1788
|
return _formValues;
|
1793
1789
|
},
|
1794
|
-
set _formValues(value) {
|
1795
|
-
_formValues = value;
|
1796
|
-
},
|
1797
1790
|
get _stateFlags() {
|
1798
1791
|
return _stateFlags;
|
1799
1792
|
},
|
@@ -1803,9 +1796,6 @@ function createFormControl(props = {}) {
|
|
1803
1796
|
get _defaultValues() {
|
1804
1797
|
return _defaultValues;
|
1805
1798
|
},
|
1806
|
-
set _defaultValues(value) {
|
1807
|
-
_defaultValues = value;
|
1808
|
-
},
|
1809
1799
|
get _names() {
|
1810
1800
|
return _names;
|
1811
1801
|
},
|
@@ -1837,7 +1827,7 @@ function createFormControl(props = {}) {
|
|
1837
1827
|
unregister,
|
1838
1828
|
setError,
|
1839
1829
|
setFocus,
|
1840
|
-
|
1830
|
+
getFieldState,
|
1841
1831
|
};
|
1842
1832
|
}
|
1843
1833
|
|