react-hook-form 7.22.4 → 7.23.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.
Files changed (42) hide show
  1. package/README.md +12 -0
  2. package/dist/index.cjs.js +1 -1
  3. package/dist/index.cjs.js.map +1 -1
  4. package/dist/index.esm.mjs +155 -140
  5. package/dist/index.esm.mjs.map +1 -1
  6. package/dist/index.umd.js +1 -1
  7. package/dist/index.umd.js.map +1 -1
  8. package/dist/logic/createFormControl.d.ts.map +1 -1
  9. package/dist/types/fieldArray.d.ts +1 -1
  10. package/dist/types/fieldArray.d.ts.map +1 -1
  11. package/dist/types/form.d.ts +7 -6
  12. package/dist/types/form.d.ts.map +1 -1
  13. package/dist/types/index.d.ts +1 -0
  14. package/dist/types/index.d.ts.map +1 -1
  15. package/dist/types/path/common.d.ts +316 -0
  16. package/dist/types/path/common.d.ts.map +1 -0
  17. package/dist/types/path/eager.d.ts +82 -0
  18. package/dist/types/path/eager.d.ts.map +1 -0
  19. package/dist/types/path/index.d.ts +4 -0
  20. package/dist/types/path/index.d.ts.map +1 -0
  21. package/dist/types/utils.d.ts +19 -25
  22. package/dist/types/utils.d.ts.map +1 -1
  23. package/dist/types/validator.d.ts +1 -1
  24. package/dist/types/validator.d.ts.map +1 -1
  25. package/dist/useFieldArray.d.ts.map +1 -1
  26. package/dist/useForm.d.ts.map +1 -1
  27. package/dist/useFormState.d.ts.map +1 -1
  28. package/dist/utils/compact.d.ts +1 -1
  29. package/dist/utils/compact.d.ts.map +1 -1
  30. package/dist/utils/get.d.ts.map +1 -1
  31. package/dist/utils/isDateObject.d.ts +1 -1
  32. package/dist/utils/isDateObject.d.ts.map +1 -1
  33. package/dist/utils/live.d.ts.map +1 -1
  34. package/dist/utils/move.d.ts.map +1 -1
  35. package/dist/utils/update.d.ts +1 -1
  36. package/dist/utils/update.d.ts.map +1 -1
  37. package/package.json +22 -22
  38. package/CHANGELOG.md +0 -1311
  39. package/dist/logic/mapCurrentIds.d.ts +0 -6
  40. package/dist/logic/mapCurrentIds.d.ts.map +0 -1
  41. package/dist/logic/mapId.d.ts +0 -4
  42. package/dist/logic/mapId.d.ts.map +0 -1
@@ -2,7 +2,7 @@ import React from 'react';
2
2
 
3
3
  var isCheckBoxInput = (element) => element.type === 'checkbox';
4
4
 
5
- var isDateObject = (data) => data instanceof Date;
5
+ var isDateObject = (value) => value instanceof Date;
6
6
 
7
7
  var isNullOrUndefined = (value) => value == null;
8
8
 
@@ -22,20 +22,20 @@ var getNodeParentName = (name) => name.substring(0, name.search(/.\d/)) || name;
22
22
 
23
23
  var isNameInFieldArray = (names, name) => [...names].some((current) => getNodeParentName(name) === current);
24
24
 
25
- var compact = (value) => (value || []).filter(Boolean);
25
+ var compact = (value) => value.filter(Boolean);
26
26
 
27
27
  var isUndefined = (val) => val === undefined;
28
28
 
29
29
  var get = (obj, path, defaultValue) => {
30
- if (isObject(obj) && path) {
31
- const result = compact(path.split(/[,[\].]+?/)).reduce((result, key) => (isNullOrUndefined(result) ? result : result[key]), obj);
32
- return isUndefined(result) || result === obj
33
- ? isUndefined(obj[path])
34
- ? defaultValue
35
- : obj[path]
36
- : result;
30
+ if (!path || !isObject(obj)) {
31
+ return defaultValue;
37
32
  }
38
- return undefined;
33
+ const result = compact(path.split(/[,[\].]+?/)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], obj);
34
+ return isUndefined(result) || result === obj
35
+ ? isUndefined(obj[path])
36
+ ? defaultValue
37
+ : obj[path]
38
+ : result;
39
39
  };
40
40
 
41
41
  const EVENTS = {
@@ -142,14 +142,20 @@ function useFormState(props) {
142
142
  errors: false,
143
143
  });
144
144
  const _name = React.useRef(name);
145
+ const _mounted = React.useRef(true);
145
146
  _name.current = name;
147
+ const callback = React.useCallback((value) => _mounted.current &&
148
+ shouldSubscribeByName(_name.current, value.name, exact) &&
149
+ shouldRenderFormState(value, _localProxyFormState.current) &&
150
+ updateFormState(Object.assign(Object.assign({}, control._formState), value)), [control, exact]);
146
151
  useSubscribe({
147
152
  disabled,
148
- callback: (value) => shouldSubscribeByName(_name.current, value.name, exact) &&
149
- shouldRenderFormState(value, _localProxyFormState.current) &&
150
- updateFormState(Object.assign(Object.assign({}, control._formState), value)),
153
+ callback,
151
154
  subject: control._subjects.state,
152
155
  });
156
+ React.useEffect(() => () => {
157
+ _mounted.current = false;
158
+ }, []);
153
159
  return getProxyFormState(formState, control._proxyFormState, _localProxyFormState.current, false);
154
160
  }
155
161
 
@@ -185,19 +191,22 @@ function useWatch(props) {
185
191
  const { control = methods.control, name, defaultValue, disabled, exact, } = props || {};
186
192
  const _name = React.useRef(name);
187
193
  _name.current = name;
194
+ const callback = React.useCallback((formState) => {
195
+ if (shouldSubscribeByName(_name.current, formState.name, exact)) {
196
+ const fieldValues = generateWatchOutput(_name.current, control._names, formState.values || control._formValues);
197
+ updateValue(isUndefined(_name.current) ||
198
+ (isObject(fieldValues) && !objectHasFunction(fieldValues))
199
+ ? Object.assign({}, fieldValues) : Array.isArray(fieldValues)
200
+ ? [...fieldValues]
201
+ : isUndefined(fieldValues)
202
+ ? defaultValue
203
+ : fieldValues);
204
+ }
205
+ }, [control, exact, defaultValue]);
188
206
  useSubscribe({
189
207
  disabled,
190
208
  subject: control._subjects.watch,
191
- callback: (formState) => {
192
- if (shouldSubscribeByName(_name.current, formState.name, exact)) {
193
- const fieldValues = generateWatchOutput(_name.current, control._names, formState.values || control._formValues);
194
- updateValue(isUndefined(_name.current) ||
195
- (isObject(fieldValues) && !objectHasFunction(fieldValues))
196
- ? Object.assign({}, fieldValues) : Array.isArray(fieldValues)
197
- ? [...fieldValues]
198
- : fieldValues);
199
- }
200
- },
209
+ callback,
201
210
  });
202
211
  const [value, updateValue] = React.useState(isUndefined(defaultValue)
203
212
  ? control._getWatch(name)
@@ -339,6 +348,14 @@ const focusFieldBy = (fields, callback, fieldsNames) => {
339
348
  }
340
349
  };
341
350
 
351
+ var generateId = () => {
352
+ const d = typeof performance === 'undefined' ? Date.now() : performance.now() * 1000;
353
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
354
+ const r = (Math.random() * 16 + d) % 16 | 0;
355
+ return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);
356
+ });
357
+ };
358
+
342
359
  var getFocusFieldName = (name, index, options = {}) => options.shouldFocus || isUndefined(options.shouldFocus)
343
360
  ? options.focusName ||
344
361
  `${name}.${isUndefined(options.focusIndex) ? index : options.focusIndex}.`
@@ -350,23 +367,8 @@ var isWatched = (name, _names, isBlurEvent) => !isBlurEvent &&
350
367
  [..._names.watch].some((watchName) => name.startsWith(watchName) &&
351
368
  /^\.\w+/.test(name.slice(watchName.length))));
352
369
 
353
- var mapCurrentIds = (values, _fieldIds, keyName) => values.map((value, index) => {
354
- const output = _fieldIds.current[index];
355
- return Object.assign(Object.assign({}, value), (output ? { [keyName]: output[keyName] } : {}));
356
- });
357
-
358
- var generateId = () => {
359
- const d = typeof performance === 'undefined' ? Date.now() : performance.now() * 1000;
360
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
361
- const r = (Math.random() * 16 + d) % 16 | 0;
362
- return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);
363
- });
364
- };
365
-
366
- var mapIds = (values = [], keyName) => values.map((value) => (Object.assign(Object.assign({}, (value[keyName] ? {} : { [keyName]: generateId() })), value)));
367
-
368
370
  function append(data, value) {
369
- return [...convertToArrayPayload(data), ...convertToArrayPayload(value)];
371
+ return [...data, ...convertToArrayPayload(value)];
370
372
  }
371
373
 
372
374
  function cloneObject(data) {
@@ -405,18 +407,16 @@ function insert(data, index, value) {
405
407
  }
406
408
 
407
409
  var moveArrayAt = (data, from, to) => {
408
- if (Array.isArray(data)) {
409
- if (isUndefined(data[to])) {
410
- data[to] = undefined;
411
- }
412
- data.splice(to, 0, data.splice(from, 1)[0]);
413
- return data;
410
+ if (!Array.isArray(data)) {
411
+ return [];
412
+ }
413
+ if (isUndefined(data[to])) {
414
+ data[to] = undefined;
414
415
  }
415
- return [];
416
+ data.splice(to, 0, data.splice(from, 1)[0]);
417
+ return data;
416
418
  };
417
419
 
418
- var omitKeys = (fields, keyName) => fields.map((field = {}) => omit(field, keyName));
419
-
420
420
  function prepend(data, value) {
421
421
  return [...convertToArrayPayload(value), ...convertToArrayPayload(data)];
422
422
  }
@@ -446,100 +446,110 @@ var updateAt = (fieldValues, index, value) => {
446
446
  const useFieldArray = (props) => {
447
447
  const methods = useFormContext();
448
448
  const { control = methods.control, name, keyName = 'id', shouldUnregister, } = props;
449
- const [fields, setFields] = React.useState(mapIds(control._getFieldArray(name), keyName));
449
+ const [fields, setFields] = React.useState(control._getFieldArray(name));
450
+ const ids = React.useRef(control._getFieldArray(name).map(generateId));
450
451
  const _fieldIds = React.useRef(fields);
451
452
  const _name = React.useRef(name);
452
453
  const _actioned = React.useRef(false);
453
454
  _name.current = name;
454
455
  _fieldIds.current = fields;
455
456
  control._names.array.add(name);
457
+ const callback = React.useCallback(({ values, name: fieldArrayName }) => {
458
+ if (fieldArrayName === _name.current || !fieldArrayName) {
459
+ const fieldValues = get(values, _name.current, []);
460
+ setFields(fieldValues);
461
+ ids.current = fieldValues.map(generateId);
462
+ }
463
+ }, []);
456
464
  useSubscribe({
457
- callback: ({ values, name: fieldArrayName }) => {
458
- if (fieldArrayName === _name.current || !fieldArrayName) {
459
- setFields(mapIds(get(values, _name.current), keyName));
460
- }
461
- },
465
+ callback,
462
466
  subject: control._subjects.array,
463
467
  });
464
- const updateValues = React.useCallback((updatedFieldArrayValuesWithKey) => {
465
- const updatedFieldArrayValues = omitKeys(updatedFieldArrayValuesWithKey, keyName);
468
+ const updateValues = React.useCallback((updatedFieldArrayValues) => {
466
469
  _actioned.current = true;
467
470
  set(control._formValues, name, updatedFieldArrayValues);
468
- return updatedFieldArrayValues;
469
- }, [control, name, keyName]);
471
+ }, [control, name]);
470
472
  const append$1 = (value, options) => {
471
473
  const appendValue = convertToArrayPayload(cloneObject(value));
472
- const updatedFieldArrayValuesWithKey = append(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), mapIds(appendValue, keyName));
473
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
474
- control._names.focus = getFocusFieldName(name, fieldArrayValues.length - 1, options);
475
- setFields(updatedFieldArrayValuesWithKey);
474
+ const updatedFieldArrayValues = append(control._getFieldArray(name), appendValue);
475
+ control._names.focus = getFocusFieldName(name, updatedFieldArrayValues.length - 1, options);
476
+ ids.current = append(ids.current, appendValue.map(generateId));
477
+ setFields(updatedFieldArrayValues);
478
+ updateValues(updatedFieldArrayValues);
476
479
  control._updateFieldArray(name, append, {
477
480
  argA: fillEmptyArray(value),
478
- }, fieldArrayValues);
481
+ }, updatedFieldArrayValues);
479
482
  };
480
483
  const prepend$1 = (value, options) => {
481
- const updatedFieldArrayValuesWithKey = prepend(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), mapIds(convertToArrayPayload(cloneObject(value)), keyName));
482
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
484
+ const prependValue = convertToArrayPayload(cloneObject(value));
485
+ const updatedFieldArrayValues = prepend(control._getFieldArray(name), prependValue);
483
486
  control._names.focus = getFocusFieldName(name, 0, options);
484
- setFields(updatedFieldArrayValuesWithKey);
487
+ ids.current = prepend(ids.current, prependValue.map(generateId));
488
+ setFields(updatedFieldArrayValues);
489
+ updateValues(updatedFieldArrayValues);
485
490
  control._updateFieldArray(name, prepend, {
486
491
  argA: fillEmptyArray(value),
487
- }, fieldArrayValues);
492
+ }, updatedFieldArrayValues);
488
493
  };
489
494
  const remove = (index) => {
490
- const updatedFieldArrayValuesWithKey = removeArrayAt(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), index);
491
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
492
- setFields(updatedFieldArrayValuesWithKey);
495
+ const updatedFieldArrayValues = removeArrayAt(control._getFieldArray(name), index);
496
+ ids.current = removeArrayAt(ids.current, index);
497
+ setFields(updatedFieldArrayValues);
498
+ updateValues(updatedFieldArrayValues);
493
499
  control._updateFieldArray(name, removeArrayAt, {
494
500
  argA: index,
495
- }, fieldArrayValues);
501
+ }, updatedFieldArrayValues);
496
502
  };
497
503
  const insert$1 = (index, value, options) => {
498
- const updatedFieldArrayValuesWithKey = insert(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), index, mapIds(convertToArrayPayload(cloneObject(value)), keyName));
499
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
504
+ const insertValue = convertToArrayPayload(cloneObject(value));
505
+ const updatedFieldArrayValues = insert(control._getFieldArray(name), index, insertValue);
506
+ updateValues(updatedFieldArrayValues);
500
507
  control._names.focus = getFocusFieldName(name, index, options);
501
- setFields(updatedFieldArrayValuesWithKey);
508
+ ids.current = insert(ids.current, index, insertValue.map(generateId));
509
+ setFields(updatedFieldArrayValues);
502
510
  control._updateFieldArray(name, insert, {
503
511
  argA: index,
504
512
  argB: fillEmptyArray(value),
505
- }, fieldArrayValues);
513
+ }, updatedFieldArrayValues);
506
514
  };
507
515
  const swap = (indexA, indexB) => {
508
- const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName);
509
- swapArrayAt(updatedFieldArrayValuesWithKey, indexA, indexB);
510
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
511
- setFields(updatedFieldArrayValuesWithKey);
516
+ const updatedFieldArrayValues = control._getFieldArray(name);
517
+ swapArrayAt(updatedFieldArrayValues, indexA, indexB);
518
+ swapArrayAt(ids.current, indexA, indexB);
519
+ setFields(updatedFieldArrayValues);
520
+ updateValues(updatedFieldArrayValues);
512
521
  control._updateFieldArray(name, swapArrayAt, {
513
522
  argA: indexA,
514
523
  argB: indexB,
515
- }, fieldArrayValues, false);
524
+ }, updatedFieldArrayValues, false);
516
525
  };
517
526
  const move = (from, to) => {
518
- const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName);
519
- moveArrayAt(updatedFieldArrayValuesWithKey, from, to);
520
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
521
- setFields(updatedFieldArrayValuesWithKey);
527
+ const updatedFieldArrayValues = control._getFieldArray(name);
528
+ moveArrayAt(updatedFieldArrayValues, from, to);
529
+ moveArrayAt(ids.current, from, to);
530
+ setFields(updatedFieldArrayValues);
531
+ updateValues(updatedFieldArrayValues);
522
532
  control._updateFieldArray(name, moveArrayAt, {
523
533
  argA: from,
524
534
  argB: to,
525
- }, fieldArrayValues, false);
535
+ }, updatedFieldArrayValues, false);
526
536
  };
527
537
  const update = (index, value) => {
528
- const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName);
529
- const updatedFieldArrayValues = updateAt(updatedFieldArrayValuesWithKey, index, value);
530
- _fieldIds.current = mapIds(updatedFieldArrayValues, keyName);
531
- const fieldArrayValues = updateValues(_fieldIds.current);
532
- setFields(_fieldIds.current);
538
+ const updatedFieldArrayValues = updateAt(control._getFieldArray(name), index, value);
539
+ ids.current = [...updatedFieldArrayValues].map((item, i) => !item || i === index ? generateId() : ids.current[i]);
540
+ setFields([...updatedFieldArrayValues]);
541
+ updateValues(updatedFieldArrayValues);
533
542
  control._updateFieldArray(name, updateAt, {
534
543
  argA: index,
535
544
  argB: value,
536
- }, fieldArrayValues, true, false, false);
545
+ }, updatedFieldArrayValues, true, false);
537
546
  };
538
547
  const replace = (value) => {
539
- const updatedFieldArrayValuesWithKey = mapIds(convertToArrayPayload(value), keyName);
540
- const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
541
- setFields(updatedFieldArrayValuesWithKey);
542
- control._updateFieldArray(name, () => updatedFieldArrayValuesWithKey, {}, fieldArrayValues, true, false, false);
548
+ const updatedFieldArrayValues = convertToArrayPayload(value);
549
+ ids.current = updatedFieldArrayValues.map(generateId);
550
+ updateValues([...updatedFieldArrayValues]);
551
+ setFields([...updatedFieldArrayValues]);
552
+ control._updateFieldArray(name, () => updatedFieldArrayValues, {}, [...updatedFieldArrayValues], true, false);
543
553
  };
544
554
  React.useEffect(() => {
545
555
  control._stateFlags.action = false;
@@ -563,25 +573,24 @@ const useFieldArray = (props) => {
563
573
  focusFieldBy(control._fields, (key) => key.startsWith(control._names.focus));
564
574
  control._names.focus = '';
565
575
  control._proxyFormState.isValid && control._updateValid();
566
- }, [fields, name, control, keyName]);
576
+ }, [fields, name, control]);
567
577
  React.useEffect(() => {
568
578
  !get(control._formValues, name) && set(control._formValues, name, []);
569
579
  return () => {
570
- if (control._options.shouldUnregister || shouldUnregister) {
580
+ (control._options.shouldUnregister || shouldUnregister) &&
571
581
  control.unregister(name);
572
- }
573
582
  };
574
583
  }, [name, control, keyName, shouldUnregister]);
575
584
  return {
576
- swap: React.useCallback(swap, [updateValues, name, control, keyName]),
577
- move: React.useCallback(move, [updateValues, name, control, keyName]),
578
- prepend: React.useCallback(prepend$1, [updateValues, name, control, keyName]),
579
- append: React.useCallback(append$1, [updateValues, name, control, keyName]),
580
- remove: React.useCallback(remove, [updateValues, name, control, keyName]),
581
- insert: React.useCallback(insert$1, [updateValues, name, control, keyName]),
582
- update: React.useCallback(update, [updateValues, name, control, keyName]),
583
- replace: React.useCallback(replace, [updateValues, name, control, keyName]),
584
- fields: fields,
585
+ swap: React.useCallback(swap, [updateValues, name, control]),
586
+ move: React.useCallback(move, [updateValues, name, control]),
587
+ prepend: React.useCallback(prepend$1, [updateValues, name, control]),
588
+ append: React.useCallback(append$1, [updateValues, name, control]),
589
+ remove: React.useCallback(remove, [updateValues, name, control]),
590
+ insert: React.useCallback(insert$1, [updateValues, name, control]),
591
+ update: React.useCallback(update, [updateValues, name, control]),
592
+ replace: React.useCallback(replace, [updateValues, name, control]),
593
+ fields: React.useMemo(() => fields.map((field, index) => (Object.assign(Object.assign({}, field), { [keyName]: ids.current[index] || generateId() }))), [fields, keyName]),
585
594
  };
586
595
  };
587
596
 
@@ -670,7 +679,7 @@ var isWeb = typeof window !== 'undefined' &&
670
679
  typeof window.HTMLElement !== 'undefined' &&
671
680
  typeof document !== 'undefined';
672
681
 
673
- var live = (ref) => isHTMLElement(ref) && document.contains(ref);
682
+ var live = (ref) => isHTMLElement(ref) && ref.isConnected;
674
683
 
675
684
  function baseGet(object, updatePath) {
676
685
  const length = updatePath.slice(0, -1).length;
@@ -1136,24 +1145,25 @@ function createFormControl(props = {}) {
1136
1145
  }
1137
1146
  return isValid;
1138
1147
  };
1139
- const _updateFieldArray = (name, method, args, values = [], shouldSetValues = true, shouldSetFields = true, shouldSetError = true) => {
1148
+ const _updateFieldArray = (name, method, args, values = [], shouldSetValues = true, shouldSetFields = true) => {
1140
1149
  _stateFlags.action = true;
1141
- if (shouldSetFields && get(_fields, name)) {
1150
+ if (shouldSetFields && Array.isArray(get(_fields, name))) {
1142
1151
  const fieldValues = method(get(_fields, name), args.argA, args.argB);
1143
1152
  shouldSetValues && set(_fields, name, fieldValues);
1144
1153
  }
1145
- if (shouldSetError && Array.isArray(get(_formState.errors, name))) {
1154
+ if (_proxyFormState.errors &&
1155
+ shouldSetFields &&
1156
+ Array.isArray(get(_formState.errors, name))) {
1146
1157
  const errors = method(get(_formState.errors, name), args.argA, args.argB);
1147
1158
  shouldSetValues && set(_formState.errors, name, errors);
1148
1159
  unsetEmptyArray(_formState.errors, name);
1149
1160
  }
1150
- if (_proxyFormState.touchedFields && get(_formState.touchedFields, name)) {
1161
+ if (_proxyFormState.touchedFields &&
1162
+ Array.isArray(get(_formState.touchedFields, name))) {
1151
1163
  const touchedFields = method(get(_formState.touchedFields, name), args.argA, args.argB);
1152
- shouldSetValues &&
1153
- set(_formState.touchedFields, name, touchedFields);
1154
- unsetEmptyArray(_formState.touchedFields, name);
1164
+ shouldSetValues && set(_formState.touchedFields, name, touchedFields);
1155
1165
  }
1156
- if (_proxyFormState.dirtyFields || _proxyFormState.isDirty) {
1166
+ if (_proxyFormState.dirtyFields) {
1157
1167
  _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
1158
1168
  }
1159
1169
  _subjects.state.next({
@@ -1167,17 +1177,17 @@ function createFormControl(props = {}) {
1167
1177
  _subjects.state.next({
1168
1178
  errors: _formState.errors,
1169
1179
  }));
1170
- const updateValidAndValue = (name, shouldSkipSetValueAs, ref) => {
1180
+ const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {
1171
1181
  const field = get(_fields, name);
1172
1182
  if (field) {
1173
- const defaultValue = get(_formValues, name, get(_defaultValues, name));
1183
+ const defaultValue = get(_formValues, name, isUndefined(value) ? get(_defaultValues, name) : value);
1174
1184
  isUndefined(defaultValue) ||
1175
1185
  (ref && ref.defaultChecked) ||
1176
1186
  shouldSkipSetValueAs
1177
1187
  ? set(_formValues, name, shouldSkipSetValueAs ? defaultValue : getFieldValue(field._f))
1178
1188
  : setFieldValue(name, defaultValue);
1189
+ _stateFlags.mount && _updateValid();
1179
1190
  }
1180
- _stateFlags.mount && _updateValid();
1181
1191
  };
1182
1192
  const updateTouchAndDirty = (name, fieldValue, isCurrentTouched, shouldRender = true) => {
1183
1193
  let isFieldDirty = false;
@@ -1318,7 +1328,8 @@ function createFormControl(props = {}) {
1318
1328
  if (field) {
1319
1329
  const fieldReference = field._f;
1320
1330
  if (fieldReference) {
1321
- set(_formValues, name, getFieldValueAs(value, fieldReference));
1331
+ !fieldReference.disabled &&
1332
+ set(_formValues, name, getFieldValueAs(value, fieldReference));
1322
1333
  fieldValue =
1323
1334
  isWeb && isHTMLElement(fieldReference.ref) && isNullOrUndefined(value)
1324
1335
  ? ''
@@ -1332,7 +1343,8 @@ function createFormControl(props = {}) {
1332
1343
  ? fieldReference.refs.forEach((checkboxRef) => (checkboxRef.checked = Array.isArray(fieldValue)
1333
1344
  ? !!fieldValue.find((data) => data === checkboxRef.value)
1334
1345
  : fieldValue === checkboxRef.value))
1335
- : (fieldReference.refs[0].checked = !!fieldValue);
1346
+ : fieldReference.refs[0] &&
1347
+ (fieldReference.refs[0].checked = !!fieldValue);
1336
1348
  }
1337
1349
  else {
1338
1350
  fieldReference.refs.forEach((radioRef) => (radioRef.checked = radioRef.value === fieldValue));
@@ -1498,7 +1510,6 @@ function createFormControl(props = {}) {
1498
1510
  : (_formState.errors = {});
1499
1511
  _subjects.state.next({
1500
1512
  errors: _formState.errors,
1501
- isValid: true,
1502
1513
  });
1503
1514
  };
1504
1515
  const setError = (name, error, options) => {
@@ -1539,20 +1550,18 @@ function createFormControl(props = {}) {
1539
1550
  };
1540
1551
  const register = (name, options = {}) => {
1541
1552
  let field = get(_fields, name);
1553
+ const disabledIsDefined = isBoolean(options.disabled);
1542
1554
  set(_fields, name, {
1543
1555
  _f: Object.assign(Object.assign(Object.assign({}, (field && field._f ? field._f : { ref: { name } })), { name, mount: true }), options),
1544
1556
  });
1545
1557
  _names.mount.add(name);
1546
- !isUndefined(options.value) &&
1547
- !options.disabled &&
1548
- set(_formValues, name, get(_formValues, name, options.value));
1549
1558
  field
1550
- ? isBoolean(options.disabled) &&
1559
+ ? disabledIsDefined &&
1551
1560
  set(_formValues, name, options.disabled
1552
1561
  ? undefined
1553
1562
  : get(_formValues, name, getFieldValue(field._f)))
1554
- : updateValidAndValue(name, true);
1555
- return Object.assign(Object.assign(Object.assign({}, (isBoolean(options.disabled) ? { disabled: options.disabled } : {})), (_options.shouldUseNativeValidation
1563
+ : updateValidAndValue(name, true, options.value);
1564
+ return Object.assign(Object.assign(Object.assign({}, (disabledIsDefined ? { disabled: options.disabled } : {})), (_options.shouldUseNativeValidation
1556
1565
  ? {
1557
1566
  required: !!options.required,
1558
1567
  min: getRuleValue(options.min),
@@ -1572,16 +1581,21 @@ function createFormControl(props = {}) {
1572
1581
  : ref
1573
1582
  : ref;
1574
1583
  const radioOrCheckbox = isRadioOrCheckbox(fieldRef);
1575
- if (fieldRef === field._f.ref ||
1576
- (radioOrCheckbox &&
1577
- compact(field._f.refs).find((option) => option === fieldRef))) {
1584
+ const refs = field._f.refs || [];
1585
+ if (radioOrCheckbox
1586
+ ? refs.find((option) => option === fieldRef)
1587
+ : fieldRef === field._f.ref) {
1578
1588
  return;
1579
1589
  }
1580
1590
  set(_fields, name, {
1581
- _f: radioOrCheckbox
1582
- ? Object.assign(Object.assign({}, field._f), { refs: [...compact(field._f.refs).filter(live), fieldRef], ref: { type: fieldRef.type, name } }) : Object.assign(Object.assign({}, field._f), { ref: fieldRef }),
1591
+ _f: Object.assign(Object.assign({}, field._f), (radioOrCheckbox
1592
+ ? {
1593
+ refs: refs.concat(fieldRef).filter(live),
1594
+ ref: { type: fieldRef.type, name },
1595
+ }
1596
+ : { ref: fieldRef })),
1583
1597
  });
1584
- !options.disabled && updateValidAndValue(name, false, fieldRef);
1598
+ updateValidAndValue(name, false, undefined, fieldRef);
1585
1599
  }
1586
1600
  else {
1587
1601
  field = get(_fields, name, {});
@@ -1840,14 +1854,15 @@ function useForm(props = {}) {
1840
1854
  _formControl.current = Object.assign(Object.assign({}, createFormControl(props)), { formState });
1841
1855
  }
1842
1856
  const control = _formControl.current.control;
1857
+ const callback = React.useCallback((value) => {
1858
+ if (shouldRenderFormState(value, control._proxyFormState, true)) {
1859
+ control._formState = Object.assign(Object.assign({}, control._formState), value);
1860
+ updateFormState(Object.assign({}, control._formState));
1861
+ }
1862
+ }, [control]);
1843
1863
  useSubscribe({
1844
1864
  subject: control._subjects.state,
1845
- callback: (value) => {
1846
- if (shouldRenderFormState(value, control._proxyFormState, true)) {
1847
- control._formState = Object.assign(Object.assign({}, control._formState), value);
1848
- updateFormState(Object.assign({}, control._formState));
1849
- }
1850
- },
1865
+ callback,
1851
1866
  });
1852
1867
  React.useEffect(() => {
1853
1868
  if (!control._stateFlags.mount) {