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.
- package/README.md +12 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.mjs +155 -140
- 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/types/fieldArray.d.ts +1 -1
- package/dist/types/fieldArray.d.ts.map +1 -1
- package/dist/types/form.d.ts +7 -6
- package/dist/types/form.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/path/common.d.ts +316 -0
- package/dist/types/path/common.d.ts.map +1 -0
- package/dist/types/path/eager.d.ts +82 -0
- package/dist/types/path/eager.d.ts.map +1 -0
- package/dist/types/path/index.d.ts +4 -0
- package/dist/types/path/index.d.ts.map +1 -0
- package/dist/types/utils.d.ts +19 -25
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/types/validator.d.ts +1 -1
- package/dist/types/validator.d.ts.map +1 -1
- package/dist/useFieldArray.d.ts.map +1 -1
- package/dist/useForm.d.ts.map +1 -1
- package/dist/useFormState.d.ts.map +1 -1
- package/dist/utils/compact.d.ts +1 -1
- package/dist/utils/compact.d.ts.map +1 -1
- package/dist/utils/get.d.ts.map +1 -1
- package/dist/utils/isDateObject.d.ts +1 -1
- package/dist/utils/isDateObject.d.ts.map +1 -1
- package/dist/utils/live.d.ts.map +1 -1
- package/dist/utils/move.d.ts.map +1 -1
- package/dist/utils/update.d.ts +1 -1
- package/dist/utils/update.d.ts.map +1 -1
- package/package.json +22 -22
- package/CHANGELOG.md +0 -1311
- package/dist/logic/mapCurrentIds.d.ts +0 -6
- package/dist/logic/mapCurrentIds.d.ts.map +0 -1
- package/dist/logic/mapId.d.ts +0 -4
- package/dist/logic/mapId.d.ts.map +0 -1
package/dist/index.esm.mjs
CHANGED
@@ -2,7 +2,7 @@ import React from 'react';
|
|
2
2
|
|
3
3
|
var isCheckBoxInput = (element) => element.type === 'checkbox';
|
4
4
|
|
5
|
-
var isDateObject = (
|
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) =>
|
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)
|
31
|
-
|
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
|
-
|
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
|
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
|
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 [...
|
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
|
-
|
410
|
-
|
411
|
-
|
412
|
-
data
|
413
|
-
return data;
|
410
|
+
if (!Array.isArray(data)) {
|
411
|
+
return [];
|
412
|
+
}
|
413
|
+
if (isUndefined(data[to])) {
|
414
|
+
data[to] = undefined;
|
414
415
|
}
|
415
|
-
|
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(
|
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
|
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((
|
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
|
-
|
469
|
-
}, [control, name, keyName]);
|
471
|
+
}, [control, name]);
|
470
472
|
const append$1 = (value, options) => {
|
471
473
|
const appendValue = convertToArrayPayload(cloneObject(value));
|
472
|
-
const
|
473
|
-
|
474
|
-
|
475
|
-
setFields(
|
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
|
-
},
|
481
|
+
}, updatedFieldArrayValues);
|
479
482
|
};
|
480
483
|
const prepend$1 = (value, options) => {
|
481
|
-
const
|
482
|
-
const
|
484
|
+
const prependValue = convertToArrayPayload(cloneObject(value));
|
485
|
+
const updatedFieldArrayValues = prepend(control._getFieldArray(name), prependValue);
|
483
486
|
control._names.focus = getFocusFieldName(name, 0, options);
|
484
|
-
|
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
|
-
},
|
492
|
+
}, updatedFieldArrayValues);
|
488
493
|
};
|
489
494
|
const remove = (index) => {
|
490
|
-
const
|
491
|
-
|
492
|
-
setFields(
|
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
|
-
},
|
501
|
+
}, updatedFieldArrayValues);
|
496
502
|
};
|
497
503
|
const insert$1 = (index, value, options) => {
|
498
|
-
const
|
499
|
-
const
|
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
|
-
|
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
|
-
},
|
513
|
+
}, updatedFieldArrayValues);
|
506
514
|
};
|
507
515
|
const swap = (indexA, indexB) => {
|
508
|
-
const
|
509
|
-
swapArrayAt(
|
510
|
-
|
511
|
-
setFields(
|
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
|
-
},
|
524
|
+
}, updatedFieldArrayValues, false);
|
516
525
|
};
|
517
526
|
const move = (from, to) => {
|
518
|
-
const
|
519
|
-
moveArrayAt(
|
520
|
-
|
521
|
-
setFields(
|
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
|
-
},
|
535
|
+
}, updatedFieldArrayValues, false);
|
526
536
|
};
|
527
537
|
const update = (index, value) => {
|
528
|
-
const
|
529
|
-
|
530
|
-
|
531
|
-
|
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
|
-
},
|
545
|
+
}, updatedFieldArrayValues, true, false);
|
537
546
|
};
|
538
547
|
const replace = (value) => {
|
539
|
-
const
|
540
|
-
|
541
|
-
|
542
|
-
|
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
|
576
|
+
}, [fields, name, control]);
|
567
577
|
React.useEffect(() => {
|
568
578
|
!get(control._formValues, name) && set(control._formValues, name, []);
|
569
579
|
return () => {
|
570
|
-
|
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
|
577
|
-
move: React.useCallback(move, [updateValues, name, control
|
578
|
-
prepend: React.useCallback(prepend$1, [updateValues, name, control
|
579
|
-
append: React.useCallback(append$1, [updateValues, name, control
|
580
|
-
remove: React.useCallback(remove, [updateValues, name, control
|
581
|
-
insert: React.useCallback(insert$1, [updateValues, name, control
|
582
|
-
update: React.useCallback(update, [updateValues, name, control
|
583
|
-
replace: React.useCallback(replace, [updateValues, name, control
|
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) &&
|
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
|
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 (
|
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 &&
|
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
|
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
|
-
|
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
|
-
:
|
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
|
-
?
|
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({}, (
|
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
|
-
|
1576
|
-
|
1577
|
-
|
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
|
-
?
|
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
|
-
|
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
|
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) {
|