react-hook-form 7.24.1 → 7.25.2

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.
@@ -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: createGetter(key),
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;
@@ -242,11 +238,11 @@ function useController(props) {
242
238
  updateMounted(name, true);
243
239
  return () => {
244
240
  const _shouldUnregisterField = control._options.shouldUnregister || shouldUnregister;
245
- isArrayField
241
+ (isArrayField
246
242
  ? _shouldUnregisterField && !control._stateFlags.action
247
- : _shouldUnregisterField
248
- ? control.unregister(name)
249
- : updateMounted(name, false);
243
+ : _shouldUnregisterField)
244
+ ? control.unregister(name)
245
+ : updateMounted(name, false);
250
246
  };
251
247
  }, [name, control, isArrayField, shouldUnregister]);
252
248
  return {
@@ -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
- set(control._formValues, name, updatedFieldArrayValues);
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
- control._updateFieldArray(name, append, {
467
+ setFields(updatedFieldArrayValues);
468
+ control._updateFieldArray(name, updatedFieldArrayValues, append, {
478
469
  argA: fillEmptyArray(value),
479
- }, updatedFieldArrayValues);
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
- control._updateFieldArray(name, prepend, {
478
+ setFields(updatedFieldArrayValues);
479
+ control._updateFieldArray(name, updatedFieldArrayValues, prepend, {
489
480
  argA: fillEmptyArray(value),
490
- }, updatedFieldArrayValues);
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
- control._updateFieldArray(name, removeArrayAt, {
487
+ setFields(updatedFieldArrayValues);
488
+ control._updateFieldArray(name, updatedFieldArrayValues, removeArrayAt, {
498
489
  argA: index,
499
- }, updatedFieldArrayValues);
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
- }, updatedFieldArrayValues);
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
- control._updateFieldArray(name, swapArrayAt, {
509
+ setFields(updatedFieldArrayValues);
510
+ control._updateFieldArray(name, updatedFieldArrayValues, swapArrayAt, {
520
511
  argA: indexA,
521
512
  argB: indexB,
522
- }, updatedFieldArrayValues, false);
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
- control._updateFieldArray(name, moveArrayAt, {
520
+ setFields(updatedFieldArrayValues);
521
+ control._updateFieldArray(name, updatedFieldArrayValues, moveArrayAt, {
531
522
  argA: from,
532
523
  argB: to,
533
- }, updatedFieldArrayValues, false);
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
- control._updateFieldArray(name, updateAt, {
530
+ setFields([...updatedFieldArrayValues]);
531
+ control._updateFieldArray(name, updatedFieldArrayValues, updateAt, {
541
532
  argA: index,
542
533
  argB: value,
543
- }, updatedFieldArrayValues, true, false);
534
+ }, true, false);
544
535
  };
545
536
  const replace = (value) => {
546
537
  const updatedFieldArrayValues = convertToArrayPayload(value);
547
538
  ids.current = updatedFieldArrayValues.map(generateId);
548
539
  updateValues([...updatedFieldArrayValues]);
549
540
  setFields([...updatedFieldArrayValues]);
550
- control._updateFieldArray(name, () => updatedFieldArrayValues, {}, [...updatedFieldArrayValues], true, false);
541
+ control._updateFieldArray(name, [...updatedFieldArrayValues], () => updatedFieldArrayValues, {}, 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) && set(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, 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);
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
- if (_proxyFormState.dirtyFields) {
1165
- _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
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 (!isFileInput(fieldReference.ref)) {
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
- _proxyFormState.isValidating &&
1446
- _subjects.state.next({
1447
- isValidating: true,
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,10 +1501,10 @@ function createFormControl(props = {}) {
1503
1501
  ? get(values, fieldNames)
1504
1502
  : fieldNames.map((name) => get(values, name));
1505
1503
  };
1506
- const _getFieldState = (name, formState) => ({
1504
+ const getFieldState = (name, formState) => ({
1507
1505
  invalid: !!get((formState || _formState).errors, name),
1508
- isDirty: get((formState || _formState).dirtyFields, name),
1509
- isTouched: get((formState || _formState).touchedFields, name),
1506
+ isDirty: !!get((formState || _formState).dirtyFields, name),
1507
+ isTouched: !!get((formState || _formState).touchedFields, name),
1510
1508
  error: get((formState || _formState).errors, name),
1511
1509
  });
1512
1510
  const clearErrors = (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
- _getFieldState,
1830
+ getFieldState,
1841
1831
  };
1842
1832
  }
1843
1833