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.
@@ -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: createGetter(key),
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
- ? control.unregister(name)
249
- : updateMounted(name, false);
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
- set(control._formValues, name, updatedFieldArrayValues);
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
- control._updateFieldArray(name, append, {
466
+ setFields(updatedFieldArrayValues);
467
+ control._updateFieldArray(name, updatedFieldArrayValues, append, {
478
468
  argA: fillEmptyArray(value),
479
- }, updatedFieldArrayValues);
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
- control._updateFieldArray(name, prepend, {
477
+ setFields(updatedFieldArrayValues);
478
+ control._updateFieldArray(name, updatedFieldArrayValues, prepend, {
489
479
  argA: fillEmptyArray(value),
490
- }, updatedFieldArrayValues);
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
- control._updateFieldArray(name, removeArrayAt, {
486
+ setFields(updatedFieldArrayValues);
487
+ control._updateFieldArray(name, updatedFieldArrayValues, removeArrayAt, {
498
488
  argA: index,
499
- }, updatedFieldArrayValues);
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
- }, updatedFieldArrayValues);
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
- control._updateFieldArray(name, swapArrayAt, {
508
+ setFields(updatedFieldArrayValues);
509
+ control._updateFieldArray(name, updatedFieldArrayValues, swapArrayAt, {
520
510
  argA: indexA,
521
511
  argB: indexB,
522
- }, updatedFieldArrayValues, false);
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
- control._updateFieldArray(name, moveArrayAt, {
519
+ setFields(updatedFieldArrayValues);
520
+ control._updateFieldArray(name, updatedFieldArrayValues, moveArrayAt, {
531
521
  argA: from,
532
522
  argB: to,
533
- }, updatedFieldArrayValues, false);
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
- control._updateFieldArray(name, updateAt, {
529
+ setFields([...updatedFieldArrayValues]);
530
+ control._updateFieldArray(name, updatedFieldArrayValues, updateAt, {
541
531
  argA: index,
542
532
  argB: value,
543
- }, updatedFieldArrayValues, true, false);
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, {}, [...updatedFieldArrayValues], true, false);
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) && set(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, method, args, values = [], shouldSetValues = true, shouldSetFields = true) => {
1147
- _stateFlags.action = true;
1148
- if (shouldSetFields && Array.isArray(get(_fields, name))) {
1149
- const fieldValues = method(get(_fields, name), args.argA, args.argB);
1150
- shouldSetValues && set(_fields, name, fieldValues);
1151
- }
1152
- if (_proxyFormState.errors &&
1153
- shouldSetFields &&
1154
- Array.isArray(get(_formState.errors, name))) {
1155
- const errors = method(get(_formState.errors, name), args.argA, args.argB);
1156
- shouldSetValues && set(_formState.errors, name, errors);
1157
- unsetEmptyArray(_formState.errors, name);
1158
- }
1159
- if (_proxyFormState.touchedFields &&
1160
- Array.isArray(get(_formState.touchedFields, name))) {
1161
- const touchedFields = method(get(_formState.touchedFields, name), args.argA, args.argB);
1162
- shouldSetValues && set(_formState.touchedFields, name, touchedFields);
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
- if (_proxyFormState.dirtyFields) {
1165
- _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
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 (!isFileInput(fieldReference.ref)) {
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
- set(_formValues, name, value);
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, value),
1392
+ isDirty: _getDirty(name, cloneValue),
1394
1393
  });
1395
1394
  }
1396
1395
  }
1397
1396
  else {
1398
- field && !field._f && !isNullOrUndefined(value)
1399
- ? setValues(name, value, options)
1400
- : setFieldValue(name, value, options);
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
- _proxyFormState.isValidating &&
1445
- _subjects.state.next({
1446
- isValidating: true,
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