react-hook-form 7.0.4 → 7.0.7

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 (90) hide show
  1. package/CHANGELOG.md +8 -3
  2. package/dist/index.cjs.js +2 -0
  3. package/dist/index.cjs.js.map +1 -0
  4. package/dist/index.esm.js +47 -49
  5. package/dist/index.esm.js.map +1 -1
  6. package/dist/index.umd.js +2 -0
  7. package/dist/index.umd.js.map +1 -0
  8. package/dist/types/form.d.ts +80 -2
  9. package/package.json +10 -11
  10. package/dist/__tests__/logic/appendErrors.test.d.ts +0 -1
  11. package/dist/__tests__/logic/focusFieldBy.test.d.ts +0 -1
  12. package/dist/__tests__/logic/generateId.test.d.ts +0 -1
  13. package/dist/__tests__/logic/getCheckboxValue.test.d.ts +0 -1
  14. package/dist/__tests__/logic/getControllerValue.test.d.ts +0 -1
  15. package/dist/__tests__/logic/getFieldValue.test.d.ts +0 -1
  16. package/dist/__tests__/logic/getFields.test.d.ts +0 -1
  17. package/dist/__tests__/logic/getFieldsValues.test.d.ts +0 -1
  18. package/dist/__tests__/logic/getMultipleSelectValue.test.d.ts +0 -1
  19. package/dist/__tests__/logic/getNodeParentName.test.d.ts +0 -1
  20. package/dist/__tests__/logic/getRadioValue.test.d.ts +0 -1
  21. package/dist/__tests__/logic/getValidateError.test.d.ts +0 -1
  22. package/dist/__tests__/logic/getValueAndMessage.test.d.ts +0 -1
  23. package/dist/__tests__/logic/isErrorStateChanged.test.d.ts +0 -1
  24. package/dist/__tests__/logic/isNameInFieldArray.test.d.ts +0 -1
  25. package/dist/__tests__/logic/setFieldArrayDirtyFields.test.d.ts +0 -1
  26. package/dist/__tests__/logic/skipValidation.test.d.ts +0 -1
  27. package/dist/__tests__/logic/validateField.test.d.ts +0 -1
  28. package/dist/__tests__/useFieldArray/append.test.d.ts +0 -1
  29. package/dist/__tests__/useFieldArray/focus.test.d.ts +0 -1
  30. package/dist/__tests__/useFieldArray/insert.test.d.ts +0 -1
  31. package/dist/__tests__/useFieldArray/move.test.d.ts +0 -1
  32. package/dist/__tests__/useFieldArray/prepend.test.d.ts +0 -1
  33. package/dist/__tests__/useFieldArray/remove.test.d.ts +0 -1
  34. package/dist/__tests__/useFieldArray/swap.test.d.ts +0 -1
  35. package/dist/__tests__/useForm/clearErrors.test.d.ts +0 -1
  36. package/dist/__tests__/useForm/formState.test.d.ts +0 -1
  37. package/dist/__tests__/useForm/getValues.test.d.ts +0 -1
  38. package/dist/__tests__/useForm/handleSubmit.test.d.ts +0 -1
  39. package/dist/__tests__/useForm/register.test.d.ts +0 -1
  40. package/dist/__tests__/useForm/reset.test.d.ts +0 -1
  41. package/dist/__tests__/useForm/setError.test.d.ts +0 -1
  42. package/dist/__tests__/useForm/setValue.test.d.ts +0 -1
  43. package/dist/__tests__/useForm/trigger.test.d.ts +0 -1
  44. package/dist/__tests__/useForm/unregister.test.d.ts +0 -1
  45. package/dist/__tests__/useForm/watch.test.d.ts +0 -1
  46. package/dist/__tests__/utils/Subject.test.d.ts +0 -1
  47. package/dist/__tests__/utils/compact.test.d.ts +0 -1
  48. package/dist/__tests__/utils/deepEqual.test.d.ts +0 -1
  49. package/dist/__tests__/utils/deepMerge.test.d.ts +0 -1
  50. package/dist/__tests__/utils/fillBooleanArray.test.d.ts +0 -1
  51. package/dist/__tests__/utils/fillEmptyArray.test.d.ts +0 -1
  52. package/dist/__tests__/utils/get.test.d.ts +0 -1
  53. package/dist/__tests__/utils/insert.test.d.ts +0 -1
  54. package/dist/__tests__/utils/isBoolean.test.d.ts +0 -1
  55. package/dist/__tests__/utils/isCheckBoxInput.test.d.ts +0 -1
  56. package/dist/__tests__/utils/isEmptyObject.test.d.ts +0 -1
  57. package/dist/__tests__/utils/isFileInput.test.d.ts +0 -1
  58. package/dist/__tests__/utils/isFunction.test.d.ts +0 -1
  59. package/dist/__tests__/utils/isHTMLElement.test.d.ts +0 -1
  60. package/dist/__tests__/utils/isKey.test.d.ts +0 -1
  61. package/dist/__tests__/utils/isMessage.test.d.ts +0 -1
  62. package/dist/__tests__/utils/isMultipleSelect.test.d.ts +0 -1
  63. package/dist/__tests__/utils/isNullOrUndefined.test.d.ts +0 -1
  64. package/dist/__tests__/utils/isObject.test.d.ts +0 -1
  65. package/dist/__tests__/utils/isPrimitive.test.d.ts +0 -1
  66. package/dist/__tests__/utils/isRadioInput.test.d.ts +0 -1
  67. package/dist/__tests__/utils/isRadioOrCheckbox.test.d.ts +0 -1
  68. package/dist/__tests__/utils/isRegex.test.d.ts +0 -1
  69. package/dist/__tests__/utils/isSelectInput.test.d.ts +0 -1
  70. package/dist/__tests__/utils/isString.test.d.ts +0 -1
  71. package/dist/__tests__/utils/isUndefined.test.d.ts +0 -1
  72. package/dist/__tests__/utils/move.test.d.ts +0 -1
  73. package/dist/__tests__/utils/omit.test.d.ts +0 -1
  74. package/dist/__tests__/utils/prepend.test.d.ts +0 -1
  75. package/dist/__tests__/utils/remove.test.d.ts +0 -1
  76. package/dist/__tests__/utils/set.test.d.ts +0 -1
  77. package/dist/__tests__/utils/stringToPath.test.d.ts +0 -1
  78. package/dist/__tests__/utils/swap.test.d.ts +0 -1
  79. package/dist/__tests__/utils/unset.test.d.ts +0 -1
  80. package/dist/__tests__/utils/validationModeChecker.test.d.ts +0 -1
  81. package/dist/index.cjs.development.js +0 -1676
  82. package/dist/index.cjs.development.js.map +0 -1
  83. package/dist/index.cjs.production.min.js +0 -2
  84. package/dist/index.cjs.production.min.js.map +0 -1
  85. package/dist/index.js +0 -8
  86. package/dist/index.umd.development.js +0 -1680
  87. package/dist/index.umd.development.js.map +0 -1
  88. package/dist/index.umd.production.min.js +0 -2
  89. package/dist/index.umd.production.min.js.map +0 -1
  90. package/dist/logic/isErrorStateChanged.d.ts +0 -9
@@ -1,1680 +0,0 @@
1
- (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.ReactHookForm = {}, global.React));
5
- }(this, (function (exports, React) { 'use strict';
6
-
7
- function _interopNamespace(e) {
8
- if (e && e.__esModule) return e;
9
- var n = Object.create(null);
10
- if (e) {
11
- Object.keys(e).forEach(function (k) {
12
- if (k !== 'default') {
13
- var d = Object.getOwnPropertyDescriptor(e, k);
14
- Object.defineProperty(n, k, d.get ? d : {
15
- enumerable: true,
16
- get: function () {
17
- return e[k];
18
- }
19
- });
20
- }
21
- });
22
- }
23
- n['default'] = e;
24
- return Object.freeze(n);
25
- }
26
-
27
- var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
-
29
- var isCheckBoxInput = (element) => element.type === 'checkbox';
30
-
31
- var isNullOrUndefined = (value) => value == null;
32
-
33
- const isObjectType = (value) => typeof value === 'object';
34
- var isObject = (value) => !isNullOrUndefined(value) &&
35
- !Array.isArray(value) &&
36
- isObjectType(value) &&
37
- !(value instanceof Date);
38
-
39
- var getControllerValue = (event) => isObject(event) && event.target
40
- ? isCheckBoxInput(event.target)
41
- ? event.target.checked
42
- : event.target.value
43
- : event;
44
-
45
- var getNodeParentName = (name) => name.substring(0, name.search(/.\d/)) || name;
46
-
47
- var isNameInFieldArray = (names, name) => [...names].some((current) => getNodeParentName(name) === current);
48
-
49
- var compact = (value) => value.filter(Boolean);
50
-
51
- var isUndefined = (val) => val === undefined;
52
-
53
- var get = (obj = {}, path, defaultValue) => {
54
- const result = compact(path.split(/[,[\].]+?/)).reduce((result, key) => (isNullOrUndefined(result) ? result : result[key]), obj);
55
- return isUndefined(result) || result === obj
56
- ? isUndefined(obj[path])
57
- ? defaultValue
58
- : obj[path]
59
- : result;
60
- };
61
-
62
- const EVENTS = {
63
- BLUR: 'blur',
64
- CHANGE: 'change',
65
- };
66
- const VALIDATION_MODE = {
67
- onBlur: 'onBlur',
68
- onChange: 'onChange',
69
- onSubmit: 'onSubmit',
70
- onTouched: 'onTouched',
71
- all: 'all',
72
- };
73
- const SELECT = 'select';
74
- const UNDEFINED = 'undefined';
75
- const INPUT_VALIDATION_RULES = {
76
- max: 'max',
77
- min: 'min',
78
- maxLength: 'maxLength',
79
- minLength: 'minLength',
80
- pattern: 'pattern',
81
- required: 'required',
82
- validate: 'validate',
83
- };
84
-
85
- var omit = (source, key) => {
86
- const copy = Object.assign({}, source);
87
- delete copy[key];
88
- return copy;
89
- };
90
-
91
- const FormContext = React__namespace.createContext(null);
92
- FormContext.displayName = 'RHFContext';
93
- const useFormContext = () => React__namespace.useContext(FormContext);
94
- const FormProvider = (props) => (React__namespace.createElement(FormContext.Provider, { value: omit(props, 'children') }, props.children));
95
-
96
- var getProxyFormState = (isProxyEnabled, formState, readFormStateRef, localReadFormStateRef, isRoot = true) => isProxyEnabled
97
- ? new Proxy(formState, {
98
- get: (obj, prop) => {
99
- if (prop in obj) {
100
- if (readFormStateRef.current[prop] !== VALIDATION_MODE.all) {
101
- readFormStateRef.current[prop] = isRoot
102
- ? VALIDATION_MODE.all
103
- : true;
104
- }
105
- localReadFormStateRef &&
106
- (localReadFormStateRef.current[prop] = true);
107
- return obj[prop];
108
- }
109
- return undefined;
110
- },
111
- })
112
- : formState;
113
-
114
- var isEmptyObject = (value) => isObject(value) && !Object.keys(value).length;
115
-
116
- var shouldRenderFormState = (formState, readFormStateRef, isRoot) => isEmptyObject(formState) ||
117
- Object.keys(formState).length >= Object.keys(readFormStateRef).length ||
118
- Object.keys(formState).find((key) => readFormStateRef[key] ===
119
- (isRoot ? VALIDATION_MODE.all : true));
120
-
121
- var isWeb = typeof window !== UNDEFINED &&
122
- typeof window.HTMLElement !== UNDEFINED &&
123
- typeof document !== UNDEFINED;
124
-
125
- const isProxyEnabled = isWeb ? 'Proxy' in window : typeof Proxy !== UNDEFINED;
126
-
127
- function useFormState(props) {
128
- const methods = useFormContext();
129
- const { formStateRef, formStateSubjectRef, readFormStateRef } = (props && props.control) || methods.control;
130
- const [formState, updateFormState] = React__namespace.useState(formStateRef.current);
131
- const readFormState = React__namespace.useRef({
132
- isDirty: false,
133
- dirtyFields: false,
134
- touchedFields: false,
135
- isValidating: false,
136
- isValid: false,
137
- errors: false,
138
- });
139
- React__namespace.useEffect(() => {
140
- const formStateSubscription = formStateSubjectRef.current.subscribe({
141
- next: (formState) => {
142
- shouldRenderFormState(formState, readFormState.current) &&
143
- updateFormState(Object.assign(Object.assign({}, formStateRef.current), formState));
144
- },
145
- });
146
- return () => formStateSubscription.unsubscribe();
147
- }, []);
148
- return getProxyFormState(isProxyEnabled, formState, readFormStateRef, readFormState, false);
149
- }
150
-
151
- function useController({ name, rules, defaultValue, control, }) {
152
- const methods = useFormContext();
153
- const { defaultValuesRef, register, fieldsRef, fieldArrayNamesRef, controllerSubjectRef, } = control || methods.control;
154
- const { onChange, onBlur, ref } = register(name, rules);
155
- const [value, setInputStateValue] = React__namespace.useState(isUndefined(get(fieldsRef.current, name)._f.value) ||
156
- isNameInFieldArray(fieldArrayNamesRef.current, name)
157
- ? isUndefined(defaultValue)
158
- ? get(defaultValuesRef.current, name)
159
- : defaultValue
160
- : get(fieldsRef.current, name)._f.value);
161
- const formState = useFormState({
162
- control: control || methods.control,
163
- });
164
- get(fieldsRef.current, name)._f.value = value;
165
- React__namespace.useEffect(() => {
166
- const controllerSubscription = controllerSubjectRef.current.subscribe({
167
- next: (data) => (!data.name || name === data.name) &&
168
- setInputStateValue(get(data.values, name)),
169
- });
170
- ref({
171
- target: value,
172
- });
173
- return () => controllerSubscription.unsubscribe();
174
- }, [name]);
175
- return {
176
- field: {
177
- onChange: (event) => {
178
- const value = getControllerValue(event);
179
- setInputStateValue(value);
180
- onChange({
181
- target: {
182
- value,
183
- name: name,
184
- },
185
- type: EVENTS.CHANGE,
186
- });
187
- },
188
- onBlur: () => {
189
- onBlur({
190
- target: {
191
- name: name,
192
- },
193
- type: EVENTS.BLUR,
194
- });
195
- },
196
- name,
197
- value,
198
- ref,
199
- },
200
- formState,
201
- fieldState: Object.defineProperties({}, {
202
- invalid: {
203
- get() {
204
- return !!get(formState.errors, name);
205
- },
206
- },
207
- isDirty: {
208
- get() {
209
- return !!get(formState.dirtyFields, name);
210
- },
211
- },
212
- isTouched: {
213
- get() {
214
- return !!get(formState.touchedFields, name);
215
- },
216
- },
217
- error: {
218
- get() {
219
- return get(formState.errors, name);
220
- },
221
- },
222
- }),
223
- };
224
- }
225
-
226
- const Controller = (props) => props.render(useController(props));
227
-
228
- var appendErrors = (name, validateAllFieldCriteria, errors, type, message) => validateAllFieldCriteria
229
- ? Object.assign(Object.assign({}, errors[name]), { types: Object.assign(Object.assign({}, (errors[name] && errors[name].types ? errors[name].types : {})), { [type]: message || true }) }) : {};
230
-
231
- var isKey = (value) => /^\w*$/.test(value);
232
-
233
- var stringToPath = (input) => compact(input.replace(/["|']|\]/g, '').split(/\.|\[/));
234
-
235
- function set(object, path, value) {
236
- let index = -1;
237
- const tempPath = isKey(path) ? [path] : stringToPath(path);
238
- const length = tempPath.length;
239
- const lastIndex = length - 1;
240
- while (++index < length) {
241
- const key = tempPath[index];
242
- let newValue = value;
243
- if (index !== lastIndex) {
244
- const objValue = object[key];
245
- newValue =
246
- isObject(objValue) || Array.isArray(objValue)
247
- ? objValue
248
- : !isNaN(+tempPath[index + 1])
249
- ? []
250
- : {};
251
- }
252
- object[key] = newValue;
253
- object = object[key];
254
- }
255
- return object;
256
- }
257
-
258
- const focusFieldBy = (fields, callback, fieldsNames) => {
259
- for (const key of fieldsNames || Object.keys(fields)) {
260
- const field = get(fields, key);
261
- if (field) {
262
- const _f = field._f;
263
- const current = omit(field, '_f');
264
- if (_f && callback(_f.name)) {
265
- if (_f.ref.focus && isUndefined(_f.ref.focus())) {
266
- break;
267
- }
268
- else if (_f.refs) {
269
- _f.refs[0].focus();
270
- break;
271
- }
272
- }
273
- else if (isObject(current)) {
274
- focusFieldBy(current, callback);
275
- }
276
- }
277
- }
278
- };
279
-
280
- const getFieldsValues = (fieldsRef, defaultValuesRef = { current: {} }, output = {}) => {
281
- for (const name in fieldsRef.current) {
282
- const field = fieldsRef.current[name];
283
- if (field) {
284
- const _f = field._f;
285
- const current = omit(field, '_f');
286
- set(output, name, _f
287
- ? _f.ref.disabled || (_f.refs && _f.refs.every((ref) => ref.disabled))
288
- ? undefined
289
- : _f.value
290
- : Array.isArray(field)
291
- ? []
292
- : {});
293
- if (current) {
294
- getFieldsValues({
295
- current,
296
- }, defaultValuesRef, output[name]);
297
- }
298
- }
299
- }
300
- return Object.assign(Object.assign({}, defaultValuesRef.current), output);
301
- };
302
-
303
- var generateId = () => {
304
- const d = typeof performance === UNDEFINED ? Date.now() : performance.now() * 1000;
305
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
306
- const r = (Math.random() * 16 + d) % 16 | 0;
307
- return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);
308
- });
309
- };
310
-
311
- var mapIds = (values = [], keyName) => values.map((value) => (Object.assign({ [keyName]: (value && value[keyName]) || generateId() }, value)));
312
-
313
- var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
314
-
315
- function deepEqual(object1, object2, isErrorObject) {
316
- if (isPrimitive(object1) ||
317
- isPrimitive(object2) ||
318
- object1 instanceof Date ||
319
- object2 instanceof Date) {
320
- return object1 === object2;
321
- }
322
- if (!React__namespace.isValidElement(object1)) {
323
- const keys1 = Object.keys(object1);
324
- const keys2 = Object.keys(object2);
325
- if (keys1.length !== keys2.length) {
326
- return false;
327
- }
328
- for (const key of keys1) {
329
- const val1 = object1[key];
330
- if (!(isErrorObject && key === 'ref')) {
331
- const val2 = object2[key];
332
- if ((isObject(val1) || Array.isArray(val1)) &&
333
- (isObject(val2) || Array.isArray(val2))
334
- ? !deepEqual(val1, val2, isErrorObject)
335
- : val1 !== val2) {
336
- return false;
337
- }
338
- }
339
- }
340
- }
341
- return true;
342
- }
343
-
344
- function deepMerge(target, source) {
345
- if (isPrimitive(target) || isPrimitive(source)) {
346
- return source;
347
- }
348
- for (const key in source) {
349
- const targetValue = target[key];
350
- const sourceValue = source[key];
351
- try {
352
- target[key] =
353
- (isObject(targetValue) && isObject(sourceValue)) ||
354
- (Array.isArray(targetValue) && Array.isArray(sourceValue))
355
- ? deepMerge(targetValue, sourceValue)
356
- : sourceValue;
357
- }
358
- catch (_a) { }
359
- }
360
- return target;
361
- }
362
-
363
- function setDirtyFields(values, defaultValues, dirtyFields, parentNode, parentName) {
364
- let index = -1;
365
- while (++index < values.length) {
366
- for (const key in values[index]) {
367
- if (Array.isArray(values[index][key])) {
368
- !dirtyFields[index] && (dirtyFields[index] = {});
369
- dirtyFields[index][key] = [];
370
- setDirtyFields(values[index][key], get(defaultValues[index] || {}, key, []), dirtyFields[index][key], dirtyFields[index], key);
371
- }
372
- else {
373
- deepEqual(get(defaultValues[index] || {}, key), values[index][key])
374
- ? set(dirtyFields[index] || {}, key)
375
- : (dirtyFields[index] = Object.assign(Object.assign({}, dirtyFields[index]), { [key]: true }));
376
- }
377
- }
378
- parentNode &&
379
- !dirtyFields.length &&
380
- delete parentNode[parentName];
381
- }
382
- return dirtyFields;
383
- }
384
- var setFieldArrayDirtyFields = (values, defaultValues, dirtyFields) => deepMerge(setDirtyFields(values, defaultValues, dirtyFields.slice(0, values.length)), setDirtyFields(defaultValues, values, dirtyFields.slice(0, values.length)));
385
-
386
- function append(data, value) {
387
- return [...data, ...(Array.isArray(value) ? value : [value])];
388
- }
389
-
390
- var fillEmptyArray = (value) => Array.isArray(value) ? Array(value.length).fill(undefined) : undefined;
391
-
392
- function insert(data, index, value) {
393
- return [
394
- ...data.slice(0, index),
395
- ...(Array.isArray(value) ? value : [value]),
396
- ...data.slice(index),
397
- ];
398
- }
399
-
400
- var moveArrayAt = (data, from, to) => {
401
- if (Array.isArray(data)) {
402
- if (isUndefined(data[to])) {
403
- data[to] = undefined;
404
- }
405
- data.splice(to, 0, data.splice(from, 1)[0]);
406
- return data;
407
- }
408
- return [];
409
- };
410
-
411
- function prepend(data, value) {
412
- return [...(Array.isArray(value) ? value : [value]), ...data];
413
- }
414
-
415
- function removeAtIndexes(data, indexes) {
416
- let i = 0;
417
- const temp = [...data];
418
- for (const index of indexes) {
419
- temp.splice(index - i, 1);
420
- i++;
421
- }
422
- return compact(temp).length ? temp : [];
423
- }
424
- var removeArrayAt = (data, index) => isUndefined(index)
425
- ? []
426
- : removeAtIndexes(data, (Array.isArray(index) ? index : [index]).sort((a, b) => a - b));
427
-
428
- var swapArrayAt = (data, indexA, indexB) => {
429
- data[indexA] = [data[indexB], (data[indexB] = data[indexA])][0];
430
- };
431
-
432
- var isBoolean = (value) => typeof value === 'boolean';
433
-
434
- function baseGet(object, updatePath) {
435
- const length = updatePath.slice(0, -1).length;
436
- let index = 0;
437
- while (index < length) {
438
- object = isUndefined(object) ? index++ : object[updatePath[index++]];
439
- }
440
- return object;
441
- }
442
- function unset(object, path) {
443
- const updatePath = isKey(path) ? [path] : stringToPath(path);
444
- const childObject = updatePath.length == 1 ? object : baseGet(object, updatePath);
445
- const key = updatePath[updatePath.length - 1];
446
- let previousObjRef;
447
- if (childObject) {
448
- delete childObject[key];
449
- }
450
- for (let k = 0; k < updatePath.slice(0, -1).length; k++) {
451
- let index = -1;
452
- let objectRef;
453
- const currentPaths = updatePath.slice(0, -(k + 1));
454
- const currentPathsLength = currentPaths.length - 1;
455
- if (k > 0) {
456
- previousObjRef = object;
457
- }
458
- while (++index < currentPaths.length) {
459
- const item = currentPaths[index];
460
- objectRef = objectRef ? objectRef[item] : object[item];
461
- if (currentPathsLength === index &&
462
- ((isObject(objectRef) && isEmptyObject(objectRef)) ||
463
- (Array.isArray(objectRef) &&
464
- !objectRef.filter((data) => (isObject(data) && !isEmptyObject(data)) || isBoolean(data)).length))) {
465
- previousObjRef ? delete previousObjRef[item] : delete object[item];
466
- }
467
- previousObjRef = objectRef;
468
- }
469
- }
470
- return object;
471
- }
472
-
473
- const useFieldArray = ({ control, name, keyName = 'id', }) => {
474
- const methods = useFormContext();
475
- const focusNameRef = React__namespace.useRef('');
476
- const { isWatchAllRef, watchFieldsRef, getFormIsDirty, watchSubjectRef, fieldArraySubjectRef, fieldArrayNamesRef, fieldsRef, defaultValuesRef, formStateRef, formStateSubjectRef, readFormStateRef, validFieldsRef, fieldsWithValidationRef, fieldArrayDefaultValuesRef, } = control || methods.control;
477
- const [fields, setFields] = React__namespace.useState(mapIds(get(fieldArrayDefaultValuesRef.current, getNodeParentName(name))
478
- ? get(fieldArrayDefaultValuesRef.current, name, [])
479
- : get(defaultValuesRef.current, name, []), keyName));
480
- set(fieldArrayDefaultValuesRef.current, name, [...fields]);
481
- fieldArrayNamesRef.current.add(name);
482
- const omitKey = (fields) => fields.map((field) => omit((field || {}), keyName));
483
- const getCurrentFieldsValues = () => {
484
- const values = get(getFieldsValues(fieldsRef, defaultValuesRef), name, []);
485
- return mapIds(get(fieldArrayDefaultValuesRef.current, name, []).map((item, index) => (Object.assign(Object.assign({}, item), values[index]))), keyName);
486
- };
487
- const getFocusDetail = (index, options) => options
488
- ? !isUndefined(options.focusIndex)
489
- ? `${name}.${options.focusIndex}`
490
- : options.focusName
491
- ? options.focusName
492
- : !options.shouldFocus
493
- ? ''
494
- : `${name}.${index}`
495
- : `${name}.${index}`;
496
- const resetFields = (index) => (Array.isArray(index) ? index : [index]).forEach((currentIndex) => set(fieldsRef.current, `${name}${isUndefined(currentIndex) ? '' : `.${currentIndex}`}`, isUndefined(currentIndex) ? [] : undefined));
497
- const setFieldsAndNotify = (fieldsValues = []) => setFields(mapIds(fieldsValues, keyName));
498
- const cleanup = (ref) => !compact(get(ref, name, [])).length && unset(ref, name);
499
- const updateDirtyFieldsWithDefaultValues = (updatedFieldArrayValues) => updatedFieldArrayValues &&
500
- set(formStateRef.current.dirtyFields, name, setFieldArrayDirtyFields(omitKey(updatedFieldArrayValues), get(defaultValuesRef.current, name, []), get(formStateRef.current.dirtyFields, name, [])));
501
- const batchStateUpdate = (method, args, updatedFieldArrayValues = [], shouldSet = true) => {
502
- if (get(fieldsRef.current, name)) {
503
- const output = method(get(fieldsRef.current, name), args.argA, args.argB);
504
- shouldSet && set(fieldsRef.current, name, output);
505
- }
506
- if (Array.isArray(get(formStateRef.current.errors, name))) {
507
- const output = method(get(formStateRef.current.errors, name), args.argA, args.argB);
508
- shouldSet && set(formStateRef.current.errors, name, output);
509
- cleanup(formStateRef.current.errors);
510
- }
511
- if (readFormStateRef.current.touchedFields &&
512
- get(formStateRef.current.touchedFields, name)) {
513
- const output = method(get(formStateRef.current.touchedFields, name), args.argA, args.argB);
514
- shouldSet && set(formStateRef.current.touchedFields, name, output);
515
- cleanup(formStateRef.current.touchedFields);
516
- }
517
- if (readFormStateRef.current.dirtyFields ||
518
- readFormStateRef.current.isDirty) {
519
- set(formStateRef.current.dirtyFields, name, setFieldArrayDirtyFields(omitKey(updatedFieldArrayValues), get(defaultValuesRef.current, name, []), get(formStateRef.current.dirtyFields, name, [])));
520
- updateDirtyFieldsWithDefaultValues(updatedFieldArrayValues);
521
- cleanup(formStateRef.current.dirtyFields);
522
- }
523
- if (readFormStateRef.current.isValid) {
524
- set(validFieldsRef.current, name, method(get(validFieldsRef.current, name, []), args.argA));
525
- cleanup(validFieldsRef.current);
526
- set(fieldsWithValidationRef.current, name, method(get(fieldsWithValidationRef.current, name, []), args.argA));
527
- cleanup(fieldsWithValidationRef.current);
528
- }
529
- formStateSubjectRef.current.next({
530
- isDirty: getFormIsDirty(name, omitKey(updatedFieldArrayValues)),
531
- errors: formStateRef.current.errors,
532
- isValid: formStateRef.current.isValid,
533
- });
534
- };
535
- const registerFieldArray = (values, index = 0, parentName = '') => values.forEach((appendValueItem, valueIndex) => !isPrimitive(appendValueItem) &&
536
- Object.entries(appendValueItem).forEach(([key, value]) => {
537
- const inputName = `${parentName || name}.${parentName ? valueIndex : index + valueIndex}.${key}`;
538
- Array.isArray(value)
539
- ? registerFieldArray(value, valueIndex, inputName)
540
- : set(fieldsRef.current, inputName, {
541
- _f: {
542
- ref: {
543
- name: inputName,
544
- },
545
- name: inputName,
546
- value,
547
- },
548
- });
549
- }));
550
- const append$1 = (value, options) => {
551
- const appendValue = Array.isArray(value) ? value : [value];
552
- const updatedFieldArrayValues = append(getCurrentFieldsValues(), appendValue);
553
- const currentIndex = updatedFieldArrayValues.length - appendValue.length;
554
- setFieldsAndNotify(updatedFieldArrayValues);
555
- batchStateUpdate(append, {
556
- argA: fillEmptyArray(value),
557
- }, updatedFieldArrayValues, false);
558
- registerFieldArray(appendValue, currentIndex);
559
- focusNameRef.current = getFocusDetail(currentIndex, options);
560
- };
561
- const prepend$1 = (value, options) => {
562
- const prependValue = Array.isArray(value) ? value : [value];
563
- const updatedFieldArrayValues = prepend(getCurrentFieldsValues(), prependValue);
564
- setFieldsAndNotify(updatedFieldArrayValues);
565
- batchStateUpdate(prepend, {
566
- argA: fillEmptyArray(value),
567
- }, updatedFieldArrayValues);
568
- registerFieldArray(prependValue);
569
- focusNameRef.current = getFocusDetail(0, options);
570
- };
571
- const remove = (index) => {
572
- const updatedFieldArrayValues = removeArrayAt(getCurrentFieldsValues(), index);
573
- resetFields(index);
574
- setFieldsAndNotify(updatedFieldArrayValues);
575
- batchStateUpdate(removeArrayAt, {
576
- argA: index,
577
- }, updatedFieldArrayValues);
578
- };
579
- const insert$1 = (index, value, options) => {
580
- const insertValue = Array.isArray(value) ? value : [value];
581
- const updatedFieldArrayValues = insert(getCurrentFieldsValues(), index, insertValue);
582
- setFieldsAndNotify(updatedFieldArrayValues);
583
- batchStateUpdate(insert, {
584
- argA: index,
585
- argB: fillEmptyArray(value),
586
- }, updatedFieldArrayValues);
587
- registerFieldArray(insertValue, index);
588
- focusNameRef.current = getFocusDetail(index, options);
589
- };
590
- const swap = (indexA, indexB) => {
591
- const fieldValues = getCurrentFieldsValues();
592
- swapArrayAt(fieldValues, indexA, indexB);
593
- batchStateUpdate(swapArrayAt, {
594
- argA: indexA,
595
- argB: indexB,
596
- }, fieldValues, false);
597
- setFieldsAndNotify(fieldValues);
598
- };
599
- const move = (from, to) => {
600
- const fieldValues = getCurrentFieldsValues();
601
- moveArrayAt(fieldValues, from, to);
602
- setFieldsAndNotify(fieldValues);
603
- batchStateUpdate(moveArrayAt, {
604
- argA: from,
605
- argB: to,
606
- }, fieldValues, false);
607
- };
608
- React__namespace.useEffect(() => {
609
- if (isWatchAllRef.current) {
610
- formStateSubjectRef.current.next({});
611
- }
612
- else {
613
- for (const watchField of watchFieldsRef.current) {
614
- if (name.startsWith(watchField)) {
615
- formStateSubjectRef.current.next({});
616
- break;
617
- }
618
- }
619
- }
620
- watchSubjectRef.current.next({
621
- name,
622
- value: get(getFieldsValues(fieldsRef, defaultValuesRef), name, []),
623
- });
624
- focusNameRef.current &&
625
- focusFieldBy(fieldsRef.current, (key) => key.startsWith(focusNameRef.current));
626
- focusNameRef.current = '';
627
- fieldArraySubjectRef.current.next({
628
- name,
629
- fields: omitKey([...fields]),
630
- });
631
- }, [fields, name]);
632
- React__namespace.useEffect(() => {
633
- const fieldArraySubscription = fieldArraySubjectRef.current.subscribe({
634
- next({ name: inputFieldArrayName, fields, isReset }) {
635
- if (isReset) {
636
- unset(fieldsRef.current, inputFieldArrayName || name);
637
- inputFieldArrayName
638
- ? set(fieldArrayDefaultValuesRef.current, inputFieldArrayName, fields)
639
- : (fieldArrayDefaultValuesRef.current = fields);
640
- setFieldsAndNotify(get(fieldArrayDefaultValuesRef.current, name));
641
- }
642
- },
643
- });
644
- !get(fieldsRef.current, name) && set(fieldsRef.current, name, []);
645
- return () => {
646
- fieldArrayDefaultValuesRef.current = getFieldsValues(fieldsRef);
647
- fieldArraySubscription.unsubscribe();
648
- };
649
- }, []);
650
- return {
651
- swap: React__namespace.useCallback(swap, [name]),
652
- move: React__namespace.useCallback(move, [name]),
653
- prepend: React__namespace.useCallback(prepend$1, [name]),
654
- append: React__namespace.useCallback(append$1, [name]),
655
- remove: React__namespace.useCallback(remove, [name]),
656
- insert: React__namespace.useCallback(insert$1, [name]),
657
- fields: fields,
658
- };
659
- };
660
-
661
- function getFields(fieldsNames, fieldsRefs) {
662
- const currentFields = {};
663
- for (const name of fieldsNames) {
664
- const field = get(fieldsRefs, name);
665
- if (field) {
666
- !isKey(name)
667
- ? set(currentFields, name, field._f)
668
- : (currentFields[name] = field._f);
669
- }
670
- }
671
- return currentFields;
672
- }
673
-
674
- var isFileInput = (element) => element.type === 'file';
675
-
676
- var isMultipleSelect = (element) => element.type === `${SELECT}-multiple`;
677
-
678
- var isRadioInput = (element) => element.type === 'radio';
679
-
680
- const defaultResult = {
681
- value: false,
682
- isValid: false,
683
- };
684
- const validResult = { value: true, isValid: true };
685
- var getCheckboxValue = (options) => {
686
- if (Array.isArray(options)) {
687
- if (options.length > 1) {
688
- const values = options
689
- .filter((option) => option && option.checked && !option.disabled)
690
- .map((option) => option.value);
691
- return { value: values, isValid: !!values.length };
692
- }
693
- return options[0].checked && !options[0].disabled
694
- ? // @ts-expect-error expected to work in the browser
695
- options[0].attributes && !isUndefined(options[0].attributes.value)
696
- ? isUndefined(options[0].value) || options[0].value === ''
697
- ? validResult
698
- : { value: options[0].value, isValid: true }
699
- : validResult
700
- : defaultResult;
701
- }
702
- return defaultResult;
703
- };
704
-
705
- var getFieldValueAs = (value, { valueAsNumber, valueAsDate, setValueAs }) => valueAsNumber
706
- ? value === ''
707
- ? NaN
708
- : +value
709
- : valueAsDate
710
- ? new Date(value)
711
- : setValueAs
712
- ? setValueAs(value)
713
- : value;
714
-
715
- var getMultipleSelectValue = (options) => [...options]
716
- .filter(({ selected }) => selected)
717
- .map(({ value }) => value);
718
-
719
- const defaultReturn = {
720
- isValid: false,
721
- value: null,
722
- };
723
- var getRadioValue = (options) => Array.isArray(options)
724
- ? options.reduce((previous, option) => option && option.checked && !option.disabled
725
- ? {
726
- isValid: true,
727
- value: option.value,
728
- }
729
- : previous, defaultReturn)
730
- : defaultReturn;
731
-
732
- function getFieldValue(field) {
733
- if (field && field._f) {
734
- const ref = field._f.ref;
735
- if (ref.disabled) {
736
- return;
737
- }
738
- if (isFileInput(ref)) {
739
- return ref.files;
740
- }
741
- if (isRadioInput(ref)) {
742
- return getRadioValue(field._f.refs).value;
743
- }
744
- if (isMultipleSelect(ref)) {
745
- return getMultipleSelectValue(ref.options);
746
- }
747
- if (isCheckBoxInput(ref)) {
748
- return getCheckboxValue(field._f.refs).value;
749
- }
750
- return getFieldValueAs(isUndefined(ref.value) ? field._f.ref.value : ref.value, field._f);
751
- }
752
- }
753
-
754
- var isErrorStateChanged = ({ errors, name, error, validFields, fieldsWithValidation, }) => {
755
- const isValid = isUndefined(error);
756
- const previousError = get(errors, name);
757
- return ((isValid && !!previousError) ||
758
- (!isValid && !deepEqual(previousError, error, true)) ||
759
- (isValid && get(fieldsWithValidation, name) && !get(validFields, name)));
760
- };
761
-
762
- var skipValidation = ({ isOnBlur, isOnChange, isOnTouch, isTouched, isReValidateOnBlur, isReValidateOnChange, isBlurEvent, isSubmitted, isOnAll, }) => {
763
- if (isOnAll) {
764
- return false;
765
- }
766
- else if (!isSubmitted && isOnTouch) {
767
- return !(isTouched || isBlurEvent);
768
- }
769
- else if (isSubmitted ? isReValidateOnBlur : isOnBlur) {
770
- return !isBlurEvent;
771
- }
772
- else if (isSubmitted ? isReValidateOnChange : isOnChange) {
773
- return isBlurEvent;
774
- }
775
- return true;
776
- };
777
-
778
- var isFunction = (value) => typeof value === 'function';
779
-
780
- var isString = (value) => typeof value === 'string';
781
-
782
- var isMessage = (value) => isString(value) || React__namespace.isValidElement(value);
783
-
784
- var isRegex = (value) => value instanceof RegExp;
785
-
786
- function getValidateError(result, ref, type = 'validate') {
787
- if (isMessage(result) || (isBoolean(result) && !result)) {
788
- return {
789
- type,
790
- message: isMessage(result) ? result : '',
791
- ref,
792
- };
793
- }
794
- }
795
-
796
- var getValueAndMessage = (validationData) => isObject(validationData) && !isRegex(validationData)
797
- ? validationData
798
- : {
799
- value: validationData,
800
- message: '',
801
- };
802
-
803
- var validateField = async ({ _f: { ref, refs, required, maxLength, minLength, min, max, pattern, validate, name, value: inputValue, valueAsNumber, }, }, validateAllFieldCriteria) => {
804
- const error = {};
805
- const isRadio = isRadioInput(ref);
806
- const isCheckBox = isCheckBoxInput(ref);
807
- const isRadioOrCheckbox = isRadio || isCheckBox;
808
- const isEmpty = (valueAsNumber && ref.value === '') ||
809
- inputValue === '' ||
810
- (Array.isArray(inputValue) && !inputValue.length);
811
- const appendErrorsCurry = appendErrors.bind(null, name, validateAllFieldCriteria, error);
812
- const getMinMaxMessage = (exceedMax, maxLengthMessage, minLengthMessage, maxType = INPUT_VALIDATION_RULES.maxLength, minType = INPUT_VALIDATION_RULES.minLength) => {
813
- const message = exceedMax ? maxLengthMessage : minLengthMessage;
814
- error[name] = Object.assign({ type: exceedMax ? maxType : minType, message,
815
- ref }, appendErrorsCurry(exceedMax ? maxType : minType, message));
816
- };
817
- if (required &&
818
- ((!isRadio && !isCheckBox && (isEmpty || isNullOrUndefined(inputValue))) ||
819
- (isBoolean(inputValue) && !inputValue) ||
820
- (isCheckBox && !getCheckboxValue(refs).isValid) ||
821
- (isRadio && !getRadioValue(refs).isValid))) {
822
- const { value, message } = isMessage(required)
823
- ? { value: !!required, message: required }
824
- : getValueAndMessage(required);
825
- if (value) {
826
- error[name] = Object.assign({ type: INPUT_VALIDATION_RULES.required, message, ref: isRadioOrCheckbox ? (refs || [])[0] || {} : ref }, appendErrorsCurry(INPUT_VALIDATION_RULES.required, message));
827
- if (!validateAllFieldCriteria) {
828
- return error;
829
- }
830
- }
831
- }
832
- if ((!isNullOrUndefined(min) || !isNullOrUndefined(max)) &&
833
- inputValue !== '') {
834
- let exceedMax;
835
- let exceedMin;
836
- const maxOutput = getValueAndMessage(max);
837
- const minOutput = getValueAndMessage(min);
838
- if (!isNaN(inputValue)) {
839
- const valueNumber = ref.valueAsNumber || parseFloat(inputValue);
840
- if (!isNullOrUndefined(maxOutput.value)) {
841
- exceedMax = valueNumber > maxOutput.value;
842
- }
843
- if (!isNullOrUndefined(minOutput.value)) {
844
- exceedMin = valueNumber < minOutput.value;
845
- }
846
- }
847
- else {
848
- const valueDate = ref.valueAsDate || new Date(inputValue);
849
- if (isString(maxOutput.value)) {
850
- exceedMax = valueDate > new Date(maxOutput.value);
851
- }
852
- if (isString(minOutput.value)) {
853
- exceedMin = valueDate < new Date(minOutput.value);
854
- }
855
- }
856
- if (exceedMax || exceedMin) {
857
- getMinMaxMessage(!!exceedMax, maxOutput.message, minOutput.message, INPUT_VALIDATION_RULES.max, INPUT_VALIDATION_RULES.min);
858
- if (!validateAllFieldCriteria) {
859
- return error;
860
- }
861
- }
862
- }
863
- if (isString(inputValue) && !isEmpty && (maxLength || minLength)) {
864
- const maxLengthOutput = getValueAndMessage(maxLength);
865
- const minLengthOutput = getValueAndMessage(minLength);
866
- const exceedMax = !isNullOrUndefined(maxLengthOutput.value) &&
867
- inputValue.length > maxLengthOutput.value;
868
- const exceedMin = !isNullOrUndefined(minLengthOutput.value) &&
869
- inputValue.length < minLengthOutput.value;
870
- if (exceedMax || exceedMin) {
871
- getMinMaxMessage(exceedMax, maxLengthOutput.message, minLengthOutput.message);
872
- if (!validateAllFieldCriteria) {
873
- return error;
874
- }
875
- }
876
- }
877
- if (isString(inputValue) && pattern && !isEmpty) {
878
- const { value: patternValue, message } = getValueAndMessage(pattern);
879
- if (isRegex(patternValue) && !patternValue.test(inputValue)) {
880
- error[name] = Object.assign({ type: INPUT_VALIDATION_RULES.pattern, message,
881
- ref }, appendErrorsCurry(INPUT_VALIDATION_RULES.pattern, message));
882
- if (!validateAllFieldCriteria) {
883
- return error;
884
- }
885
- }
886
- }
887
- if (validate) {
888
- const validateRef = isRadioOrCheckbox && refs ? refs[0] : ref;
889
- if (isFunction(validate)) {
890
- const result = await validate(inputValue);
891
- const validateError = getValidateError(result, validateRef);
892
- if (validateError) {
893
- error[name] = Object.assign(Object.assign({}, validateError), appendErrorsCurry(INPUT_VALIDATION_RULES.validate, validateError.message));
894
- if (!validateAllFieldCriteria) {
895
- return error;
896
- }
897
- }
898
- }
899
- else if (isObject(validate)) {
900
- let validationResult = {};
901
- for (const [key, validateFunction] of Object.entries(validate)) {
902
- if (!isEmptyObject(validationResult) && !validateAllFieldCriteria) {
903
- break;
904
- }
905
- const validateResult = await validateFunction(inputValue);
906
- const validateError = getValidateError(validateResult, validateRef, key);
907
- if (validateError) {
908
- validationResult = Object.assign(Object.assign({}, validateError), appendErrorsCurry(key, validateError.message));
909
- if (validateAllFieldCriteria) {
910
- error[name] = validationResult;
911
- }
912
- }
913
- }
914
- if (!isEmptyObject(validationResult)) {
915
- error[name] = Object.assign({ ref: validateRef }, validationResult);
916
- if (!validateAllFieldCriteria) {
917
- return error;
918
- }
919
- }
920
- }
921
- }
922
- return error;
923
- };
924
-
925
- var getValidationModes = (mode) => ({
926
- isOnSubmit: !mode || mode === VALIDATION_MODE.onSubmit,
927
- isOnBlur: mode === VALIDATION_MODE.onBlur,
928
- isOnChange: mode === VALIDATION_MODE.onChange,
929
- isOnAll: mode === VALIDATION_MODE.all,
930
- isOnTouch: mode === VALIDATION_MODE.onTouched,
931
- });
932
-
933
- var isHTMLElement = (value) => value instanceof HTMLElement;
934
-
935
- var isRadioOrCheckboxFunction = (ref) => isRadioInput(ref) || isCheckBoxInput(ref);
936
-
937
- class Subscription {
938
- constructor() {
939
- this.tearDowns = [];
940
- }
941
- add(tearDown) {
942
- this.tearDowns.push(tearDown);
943
- }
944
- unsubscribe() {
945
- for (const teardown of this.tearDowns) {
946
- teardown();
947
- }
948
- this.tearDowns = [];
949
- }
950
- }
951
- class Subscriber {
952
- constructor(observer, subscription) {
953
- this.observer = observer;
954
- this.closed = false;
955
- subscription.add(() => (this.closed = true));
956
- }
957
- next(value) {
958
- if (!this.closed) {
959
- this.observer.next(value);
960
- }
961
- }
962
- }
963
- class Subject {
964
- constructor() {
965
- this.observers = [];
966
- }
967
- next(value) {
968
- for (const observer of this.observers) {
969
- observer.next(value);
970
- }
971
- }
972
- subscribe(observer) {
973
- const subscription = new Subscription();
974
- const subscriber = new Subscriber(observer, subscription);
975
- this.observers.push(subscriber);
976
- return subscription;
977
- }
978
- unsubscribe() {
979
- this.observers = [];
980
- }
981
- }
982
-
983
- const isWindowUndefined = typeof window === UNDEFINED;
984
- function useForm({ mode = VALIDATION_MODE.onSubmit, reValidateMode = VALIDATION_MODE.onChange, resolver, context, defaultValues = {}, shouldFocusError = true, criteriaMode, } = {}) {
985
- const fieldsRef = React__namespace.useRef({});
986
- const fieldsNamesRef = React__namespace.useRef(new Set());
987
- const formStateSubjectRef = React__namespace.useRef(new Subject());
988
- const watchSubjectRef = React__namespace.useRef(new Subject());
989
- const controllerSubjectRef = React__namespace.useRef(new Subject());
990
- const fieldArraySubjectRef = React__namespace.useRef(new Subject());
991
- const fieldArrayDefaultValuesRef = React__namespace.useRef({});
992
- const watchFieldsRef = React__namespace.useRef(new Set());
993
- const isMountedRef = React__namespace.useRef(false);
994
- const fieldsWithValidationRef = React__namespace.useRef({});
995
- const validFieldsRef = React__namespace.useRef({});
996
- const defaultValuesRef = React__namespace.useRef(defaultValues);
997
- const isWatchAllRef = React__namespace.useRef(false);
998
- const contextRef = React__namespace.useRef(context);
999
- const resolverRef = React__namespace.useRef(resolver);
1000
- const fieldArrayNamesRef = React__namespace.useRef(new Set());
1001
- const validationMode = getValidationModes(mode);
1002
- const isValidateAllFieldCriteria = criteriaMode === VALIDATION_MODE.all;
1003
- const [formState, setFormState] = React__namespace.useState({
1004
- isDirty: false,
1005
- isValidating: false,
1006
- dirtyFields: {},
1007
- isSubmitted: false,
1008
- submitCount: 0,
1009
- touchedFields: {},
1010
- isSubmitting: false,
1011
- isSubmitSuccessful: false,
1012
- isValid: !validationMode.isOnSubmit,
1013
- errors: {},
1014
- });
1015
- const readFormStateRef = React__namespace.useRef({
1016
- isDirty: !isProxyEnabled,
1017
- dirtyFields: !isProxyEnabled,
1018
- touchedFields: !isProxyEnabled,
1019
- isValidating: !isProxyEnabled,
1020
- isValid: !isProxyEnabled,
1021
- errors: !isProxyEnabled,
1022
- });
1023
- const formStateRef = React__namespace.useRef(formState);
1024
- contextRef.current = context;
1025
- resolverRef.current = resolver;
1026
- const getIsValid = () => (formStateRef.current.isValid =
1027
- deepEqual(validFieldsRef.current, fieldsWithValidationRef.current) &&
1028
- isEmptyObject(formStateRef.current.errors));
1029
- const shouldRenderBaseOnError = React__namespace.useCallback((name, error, shouldRender = false, state = {}, isValid, isWatched) => {
1030
- let shouldReRender = shouldRender ||
1031
- isErrorStateChanged({
1032
- errors: formStateRef.current.errors,
1033
- error,
1034
- name,
1035
- validFields: validFieldsRef.current,
1036
- fieldsWithValidation: fieldsWithValidationRef.current,
1037
- });
1038
- const previousError = get(formStateRef.current.errors, name);
1039
- if (error) {
1040
- unset(validFieldsRef.current, name);
1041
- shouldReRender =
1042
- shouldReRender ||
1043
- !previousError ||
1044
- !deepEqual(previousError, error, true);
1045
- set(formStateRef.current.errors, name, error);
1046
- }
1047
- else {
1048
- if (get(fieldsWithValidationRef.current, name) || resolverRef.current) {
1049
- set(validFieldsRef.current, name, true);
1050
- shouldReRender = shouldReRender || previousError;
1051
- }
1052
- unset(formStateRef.current.errors, name);
1053
- }
1054
- if ((shouldReRender && !isNullOrUndefined(shouldRender)) ||
1055
- !isEmptyObject(state) ||
1056
- isWatched) {
1057
- const updatedFormState = Object.assign(Object.assign({}, state), { isValid: resolverRef.current ? !!isValid : getIsValid(), errors: formStateRef.current.errors });
1058
- formStateRef.current = Object.assign(Object.assign({}, formStateRef.current), updatedFormState);
1059
- formStateSubjectRef.current.next(isWatched ? {} : updatedFormState);
1060
- }
1061
- formStateSubjectRef.current.next({
1062
- isValidating: false,
1063
- });
1064
- }, []);
1065
- const setFieldValue = React__namespace.useCallback((name, rawValue, options = {}, shouldRender, shouldRegister) => {
1066
- shouldRegister && register(name);
1067
- const _f = get(fieldsRef.current, name, {})._f;
1068
- if (_f) {
1069
- const value = isWeb && isHTMLElement(_f.ref) && isNullOrUndefined(rawValue)
1070
- ? ''
1071
- : rawValue;
1072
- _f.value = rawValue;
1073
- if (isRadioInput(_f.ref)) {
1074
- (_f.refs || []).forEach((radioRef) => (radioRef.checked = radioRef.value === value));
1075
- }
1076
- else if (isFileInput(_f.ref) && !isString(value)) {
1077
- _f.ref.files = value;
1078
- }
1079
- else if (isMultipleSelect(_f.ref)) {
1080
- [..._f.ref.options].forEach((selectRef) => (selectRef.selected = value.includes(selectRef.value)));
1081
- }
1082
- else if (isCheckBoxInput(_f.ref) && _f.refs) {
1083
- _f.refs.length > 1
1084
- ? _f.refs.forEach((checkboxRef) => (checkboxRef.checked = Array.isArray(value)
1085
- ? !!value.find((data) => data === checkboxRef.value)
1086
- : value === checkboxRef.value))
1087
- : (_f.refs[0].checked = !!value);
1088
- }
1089
- else {
1090
- _f.ref.value = value;
1091
- }
1092
- if (shouldRender) {
1093
- const values = getFieldsValues(fieldsRef);
1094
- set(values, name, rawValue);
1095
- controllerSubjectRef.current.next({
1096
- values: Object.assign(Object.assign({}, defaultValuesRef.current), values),
1097
- name,
1098
- });
1099
- }
1100
- options.shouldDirty && updateAndGetDirtyState(name, value);
1101
- options.shouldValidate && trigger(name);
1102
- }
1103
- }, []);
1104
- const getFormIsDirty = React__namespace.useCallback((name, data) => {
1105
- if (readFormStateRef.current.isDirty) {
1106
- const formValues = getFieldsValues(fieldsRef);
1107
- name && data && set(formValues, name, data);
1108
- return !deepEqual(formValues, defaultValuesRef.current);
1109
- }
1110
- return false;
1111
- }, []);
1112
- const updateAndGetDirtyState = React__namespace.useCallback((name, inputValue, shouldRender = true) => {
1113
- if (readFormStateRef.current.isDirty ||
1114
- readFormStateRef.current.dirtyFields) {
1115
- const isFieldDirty = !deepEqual(get(defaultValuesRef.current, name), inputValue);
1116
- const isDirtyFieldExist = get(formStateRef.current.dirtyFields, name);
1117
- const previousIsDirty = formStateRef.current.isDirty;
1118
- isFieldDirty
1119
- ? set(formStateRef.current.dirtyFields, name, true)
1120
- : unset(formStateRef.current.dirtyFields, name);
1121
- formStateRef.current.isDirty = getFormIsDirty();
1122
- const state = {
1123
- isDirty: formStateRef.current.isDirty,
1124
- dirtyFields: formStateRef.current.dirtyFields,
1125
- };
1126
- const isChanged = (readFormStateRef.current.isDirty &&
1127
- previousIsDirty !== state.isDirty) ||
1128
- (readFormStateRef.current.dirtyFields &&
1129
- isDirtyFieldExist !== get(formStateRef.current.dirtyFields, name));
1130
- isChanged && shouldRender && formStateSubjectRef.current.next(state);
1131
- return isChanged ? state : {};
1132
- }
1133
- return {};
1134
- }, []);
1135
- const executeValidation = React__namespace.useCallback(async (name, skipReRender) => {
1136
- const error = (await validateField(get(fieldsRef.current, name), isValidateAllFieldCriteria))[name];
1137
- shouldRenderBaseOnError(name, error, skipReRender);
1138
- return isUndefined(error);
1139
- }, [isValidateAllFieldCriteria]);
1140
- const executeSchemaOrResolverValidation = React__namespace.useCallback(async (names, currentNames = []) => {
1141
- const { errors } = await resolverRef.current(getFieldsValues(fieldsRef, defaultValuesRef), contextRef.current, {
1142
- criteriaMode,
1143
- names: currentNames,
1144
- fields: getFields(fieldsNamesRef.current, fieldsRef.current),
1145
- });
1146
- for (const name of names) {
1147
- const error = get(errors, name);
1148
- error
1149
- ? set(formStateRef.current.errors, name, error)
1150
- : unset(formStateRef.current.errors, name);
1151
- }
1152
- return errors;
1153
- }, [criteriaMode]);
1154
- const validateForm = async (fieldsRef) => {
1155
- for (const name in fieldsRef) {
1156
- const field = fieldsRef[name];
1157
- if (field) {
1158
- const _f = field._f;
1159
- const current = omit(field, '_f');
1160
- if (_f) {
1161
- const fieldError = await validateField(field, isValidateAllFieldCriteria);
1162
- if (fieldError[_f.name]) {
1163
- set(formStateRef.current.errors, _f.name, fieldError[_f.name]);
1164
- unset(validFieldsRef.current, _f.name);
1165
- }
1166
- else if (get(fieldsWithValidationRef.current, _f.name)) {
1167
- set(validFieldsRef.current, _f.name, true);
1168
- unset(formStateRef.current.errors, _f.name);
1169
- }
1170
- }
1171
- current && (await validateForm(current));
1172
- }
1173
- }
1174
- };
1175
- const trigger = React__namespace.useCallback(async (name) => {
1176
- const fields = isUndefined(name)
1177
- ? Object.keys(fieldsRef.current)
1178
- : Array.isArray(name)
1179
- ? name
1180
- : [name];
1181
- let isValid;
1182
- formStateSubjectRef.current.next({
1183
- isValidating: true,
1184
- });
1185
- if (resolverRef.current) {
1186
- isValid = isEmptyObject(await executeSchemaOrResolverValidation(fields, isUndefined(name)
1187
- ? undefined
1188
- : fields));
1189
- }
1190
- else {
1191
- isUndefined(name)
1192
- ? await validateForm(fieldsRef.current)
1193
- : await Promise.all(fields.map(async (data) => await executeValidation(data, null)));
1194
- }
1195
- formStateSubjectRef.current.next({
1196
- errors: formStateRef.current.errors,
1197
- isValidating: false,
1198
- isValid: resolverRef.current ? isValid : getIsValid(),
1199
- });
1200
- }, [executeSchemaOrResolverValidation, executeValidation]);
1201
- const setInternalValues = React__namespace.useCallback((name, value, options) => Object.entries(value).forEach(([inputKey, inputValue]) => {
1202
- const fieldName = `${name}.${inputKey}`;
1203
- const field = get(fieldsRef.current, fieldName);
1204
- field && !field._f
1205
- ? setInternalValues(fieldName, inputValue, options)
1206
- : setFieldValue(fieldName, inputValue, options, true, !field);
1207
- }), [trigger]);
1208
- const isFieldWatched = (name) => isWatchAllRef.current ||
1209
- watchFieldsRef.current.has(name) ||
1210
- watchFieldsRef.current.has((name.match(/\w+/) || [])[0]);
1211
- const updateValueAndGetDefault = (name) => {
1212
- let defaultValue;
1213
- const field = get(fieldsRef.current, name);
1214
- if (field &&
1215
- (!isEmptyObject(defaultValuesRef.current) || !isUndefined(field._f.value))) {
1216
- defaultValue = isUndefined(field._f.value)
1217
- ? get(defaultValuesRef.current, name)
1218
- : field._f.value;
1219
- if (!isUndefined(defaultValue)) {
1220
- setFieldValue(name, defaultValue);
1221
- }
1222
- }
1223
- return defaultValue;
1224
- };
1225
- const setValue = (name, value, options = {}) => {
1226
- isMountedRef.current = true;
1227
- const field = get(fieldsRef.current, name);
1228
- const isFieldArray = fieldArrayNamesRef.current.has(name);
1229
- if (isFieldArray) {
1230
- fieldArraySubjectRef.current.next({
1231
- fields: value,
1232
- name,
1233
- isReset: true,
1234
- });
1235
- if ((readFormStateRef.current.isDirty ||
1236
- readFormStateRef.current.dirtyFields) &&
1237
- options.shouldDirty) {
1238
- set(formStateRef.current.dirtyFields, name, setFieldArrayDirtyFields(value, get(defaultValuesRef.current, name, []), get(formStateRef.current.dirtyFields, name, [])));
1239
- formStateSubjectRef.current.next({
1240
- dirtyFields: formStateRef.current.dirtyFields,
1241
- isDirty: getFormIsDirty(name, value),
1242
- });
1243
- }
1244
- !value.length &&
1245
- set(fieldsRef.current, name, []) &&
1246
- set(fieldArrayDefaultValuesRef.current, name, []);
1247
- }
1248
- (field && !field._f) || isFieldArray
1249
- ? setInternalValues(name, value, isFieldArray ? {} : options)
1250
- : setFieldValue(name, value, options, true, !field);
1251
- isFieldWatched(name) && formStateSubjectRef.current.next({});
1252
- watchSubjectRef.current.next({ name, value });
1253
- };
1254
- const handleChange = React__namespace.useCallback(async ({ type, target, target: { value, type: inputType } }) => {
1255
- let name = target.name;
1256
- let error;
1257
- let isValid;
1258
- const field = get(fieldsRef.current, name);
1259
- if (field) {
1260
- const inputValue = inputType ? getFieldValue(field) : value;
1261
- const isBlurEvent = type === EVENTS.BLUR;
1262
- const { isOnBlur: isReValidateOnBlur, isOnChange: isReValidateOnChange, } = getValidationModes(reValidateMode);
1263
- const shouldSkipValidation = skipValidation(Object.assign({ isBlurEvent, isTouched: !!get(formStateRef.current.touchedFields, name), isSubmitted: formStateRef.current.isSubmitted, isReValidateOnBlur,
1264
- isReValidateOnChange }, validationMode));
1265
- const isWatched = !isBlurEvent && isFieldWatched(name);
1266
- if (!isUndefined(inputValue)) {
1267
- field._f.value = inputValue;
1268
- }
1269
- const state = updateAndGetDirtyState(name, field._f.value, false);
1270
- if (isBlurEvent && !get(formStateRef.current.touchedFields, name)) {
1271
- set(formStateRef.current.touchedFields, name, true);
1272
- state.touchedFields = formStateRef.current.touchedFields;
1273
- }
1274
- let shouldRender = !isEmptyObject(state) || isWatched;
1275
- if (shouldSkipValidation) {
1276
- !isBlurEvent &&
1277
- watchSubjectRef.current.next({
1278
- name,
1279
- type,
1280
- value: inputValue,
1281
- });
1282
- return (shouldRender &&
1283
- formStateSubjectRef.current.next(isWatched ? {} : state));
1284
- }
1285
- formStateSubjectRef.current.next({
1286
- isValidating: true,
1287
- });
1288
- if (resolverRef.current) {
1289
- const { errors } = await resolverRef.current(getFieldsValues(fieldsRef, defaultValuesRef), contextRef.current, {
1290
- criteriaMode,
1291
- fields: getFields([name], fieldsRef.current),
1292
- names: [name],
1293
- });
1294
- const previousFormIsValid = formStateRef.current.isValid;
1295
- error = get(errors, name);
1296
- if (isCheckBoxInput(target) && !error) {
1297
- const parentNodeName = getNodeParentName(name);
1298
- const currentError = get(errors, parentNodeName, {});
1299
- currentError.type && currentError.message && (error = currentError);
1300
- if (currentError ||
1301
- get(formStateRef.current.errors, parentNodeName)) {
1302
- name = parentNodeName;
1303
- }
1304
- }
1305
- isValid = isEmptyObject(errors);
1306
- previousFormIsValid !== isValid && (shouldRender = true);
1307
- }
1308
- else {
1309
- error = (await validateField(field, isValidateAllFieldCriteria))[name];
1310
- }
1311
- !isBlurEvent &&
1312
- watchSubjectRef.current.next({
1313
- name,
1314
- type,
1315
- value: inputValue,
1316
- });
1317
- shouldRenderBaseOnError(name, error, shouldRender, state, isValid, isWatched);
1318
- }
1319
- }, []);
1320
- const getValues = (fieldNames) => {
1321
- const values = isMountedRef.current
1322
- ? getFieldsValues(fieldsRef, defaultValuesRef)
1323
- : defaultValuesRef.current;
1324
- return isUndefined(fieldNames)
1325
- ? values
1326
- : isString(fieldNames)
1327
- ? get(values, fieldNames)
1328
- : fieldNames.map((name) => get(values, name));
1329
- };
1330
- const updateIsValid = React__namespace.useCallback(async (values = {}) => {
1331
- const previousIsValid = formStateRef.current.isValid;
1332
- if (resolver) {
1333
- const { errors } = await resolverRef.current(Object.assign(Object.assign({}, getFieldsValues(fieldsRef, defaultValuesRef)), values), contextRef.current, {
1334
- criteriaMode,
1335
- fields: getFields(fieldsNamesRef.current, fieldsRef.current),
1336
- });
1337
- formStateRef.current.isValid = isEmptyObject(errors);
1338
- }
1339
- else {
1340
- getIsValid();
1341
- }
1342
- previousIsValid !== formStateRef.current.isValid &&
1343
- formStateSubjectRef.current.next({
1344
- isValid: formStateRef.current.isValid,
1345
- });
1346
- }, [criteriaMode]);
1347
- const clearErrors = (name) => {
1348
- name &&
1349
- (Array.isArray(name) ? name : [name]).forEach((inputName) => unset(formStateRef.current.errors, inputName));
1350
- formStateSubjectRef.current.next({
1351
- errors: name ? formStateRef.current.errors : {},
1352
- });
1353
- };
1354
- const setError = (name, error, options) => {
1355
- const ref = ((get(fieldsRef.current, name) || { _f: {} })._f || {}).ref;
1356
- set(formStateRef.current.errors, name, Object.assign(Object.assign({}, error), { ref }));
1357
- formStateSubjectRef.current.next({
1358
- errors: formStateRef.current.errors,
1359
- isValid: false,
1360
- });
1361
- options && options.shouldFocus && ref && ref.focus && ref.focus();
1362
- };
1363
- const watchInternal = React__namespace.useCallback((fieldNames, defaultValue, isGlobal) => {
1364
- const isArrayNames = Array.isArray(fieldNames);
1365
- const fieldValues = isMountedRef.current
1366
- ? getValues()
1367
- : isUndefined(defaultValue)
1368
- ? defaultValuesRef.current
1369
- : isArrayNames
1370
- ? defaultValue || {}
1371
- : { [fieldNames]: defaultValue };
1372
- if (isUndefined(fieldNames)) {
1373
- isGlobal && (isWatchAllRef.current = true);
1374
- return fieldValues;
1375
- }
1376
- const result = [];
1377
- for (const fieldName of isArrayNames ? fieldNames : [fieldNames]) {
1378
- isGlobal && watchFieldsRef.current.add(fieldName);
1379
- result.push(get(fieldValues, fieldName));
1380
- }
1381
- return isArrayNames ? result : result[0];
1382
- }, []);
1383
- const watch = (fieldName, defaultValue) => isFunction(fieldName)
1384
- ? watchSubjectRef.current.subscribe({
1385
- next: (info) => fieldName(watchInternal(undefined, defaultValue), info),
1386
- })
1387
- : watchInternal(fieldName, defaultValue, true);
1388
- const unregister = (name, options = {}) => {
1389
- for (const inputName of name
1390
- ? Array.isArray(name)
1391
- ? name
1392
- : [name]
1393
- : Object.keys(fieldsNamesRef.current)) {
1394
- fieldsNamesRef.current.delete(inputName);
1395
- fieldArrayNamesRef.current.delete(inputName);
1396
- if (get(fieldsRef.current, inputName)) {
1397
- if (!options.keepIsValid) {
1398
- unset(fieldsWithValidationRef.current, inputName);
1399
- unset(validFieldsRef.current, inputName);
1400
- }
1401
- !options.keepError && unset(formStateRef.current.errors, inputName);
1402
- !options.keepValue && unset(fieldsRef.current, inputName);
1403
- !options.keepDirty &&
1404
- unset(formStateRef.current.dirtyFields, inputName);
1405
- !options.keepTouched &&
1406
- unset(formStateRef.current.touchedFields, inputName);
1407
- !options.keepDefaultValue && unset(defaultValuesRef.current, inputName);
1408
- watchSubjectRef.current.next({
1409
- name: inputName,
1410
- });
1411
- }
1412
- }
1413
- formStateSubjectRef.current.next(Object.assign(Object.assign(Object.assign({}, formStateRef.current), (!options.keepDirty ? {} : { isDirty: getFormIsDirty() })), (resolverRef.current ? {} : { isValid: getIsValid() })));
1414
- if (!options.keepIsValid) {
1415
- updateIsValid();
1416
- }
1417
- };
1418
- const registerFieldRef = (name, ref, options) => {
1419
- let field = get(fieldsRef.current, name);
1420
- if (field) {
1421
- const isRadioOrCheckbox = isRadioOrCheckboxFunction(ref);
1422
- if ((isRadioOrCheckbox
1423
- ? Array.isArray(field._f.refs) &&
1424
- compact(field._f.refs).find((option) => ref.value === option.value && option === ref)
1425
- : ref === field._f.ref) ||
1426
- !field ||
1427
- (isWeb && isHTMLElement(field._f.ref) && !isHTMLElement(ref))) {
1428
- return;
1429
- }
1430
- field = {
1431
- _f: isRadioOrCheckbox
1432
- ? Object.assign(Object.assign({}, field._f), { refs: [
1433
- ...compact(field._f.refs || []).filter((ref) => isHTMLElement(ref) && document.contains(ref)),
1434
- ref,
1435
- ], ref: { type: ref.type, name } }) : Object.assign(Object.assign({}, field._f), { ref }),
1436
- };
1437
- set(fieldsRef.current, name, field);
1438
- const defaultValue = updateValueAndGetDefault(name);
1439
- if (isRadioOrCheckbox && Array.isArray(defaultValue)
1440
- ? !deepEqual(get(fieldsRef.current, name)._f.value, defaultValue)
1441
- : isUndefined(get(fieldsRef.current, name)._f.value)) {
1442
- get(fieldsRef.current, name)._f.value = getFieldValue(get(fieldsRef.current, name));
1443
- }
1444
- if (options) {
1445
- if (!validationMode.isOnSubmit &&
1446
- field &&
1447
- readFormStateRef.current.isValid) {
1448
- validateField(field, isValidateAllFieldCriteria).then((error) => {
1449
- isEmptyObject(error)
1450
- ? set(validFieldsRef.current, name, true)
1451
- : unset(validFieldsRef.current, name);
1452
- formStateRef.current.isValid &&
1453
- !isEmptyObject(error) &&
1454
- setFormState(Object.assign(Object.assign({}, formStateRef.current), { isValid: getIsValid() }));
1455
- });
1456
- }
1457
- }
1458
- }
1459
- };
1460
- const register = React__namespace.useCallback((name, options) => {
1461
- const isInitialRegister = !get(fieldsRef.current, name);
1462
- set(fieldsRef.current, name, {
1463
- _f: Object.assign(Object.assign(Object.assign({}, (isInitialRegister
1464
- ? { ref: { name } }
1465
- : Object.assign({ ref: (get(fieldsRef.current, name)._f || {}).ref }, get(fieldsRef.current, name)._f))), { name }), options),
1466
- });
1467
- options && set(fieldsWithValidationRef.current, name, true);
1468
- fieldsNamesRef.current.add(name);
1469
- isInitialRegister && updateValueAndGetDefault(name);
1470
- return isWindowUndefined
1471
- ? { name: name }
1472
- : {
1473
- name,
1474
- onChange: handleChange,
1475
- onBlur: handleChange,
1476
- ref: (ref) => ref && registerFieldRef(name, ref, options),
1477
- };
1478
- }, [defaultValuesRef.current]);
1479
- const handleSubmit = React__namespace.useCallback((onValid, onInvalid) => async (e) => {
1480
- if (e && e.preventDefault) {
1481
- e.preventDefault();
1482
- e.persist();
1483
- }
1484
- let fieldValues = Object.assign(Object.assign({}, defaultValuesRef.current), getFieldsValues(fieldsRef, defaultValuesRef));
1485
- formStateSubjectRef.current.next({
1486
- isSubmitting: true,
1487
- });
1488
- try {
1489
- if (resolverRef.current) {
1490
- const { errors, values } = await resolverRef.current(fieldValues, contextRef.current, {
1491
- criteriaMode,
1492
- fields: getFields(fieldsNamesRef.current, fieldsRef.current),
1493
- });
1494
- formStateRef.current.errors = errors;
1495
- fieldValues = values;
1496
- }
1497
- else {
1498
- await validateForm(fieldsRef.current);
1499
- }
1500
- if (isEmptyObject(formStateRef.current.errors) &&
1501
- Object.keys(formStateRef.current.errors).every((name) => get(fieldValues, name))) {
1502
- formStateSubjectRef.current.next({
1503
- errors: {},
1504
- isSubmitting: true,
1505
- });
1506
- await onValid(fieldValues, e);
1507
- }
1508
- else {
1509
- onInvalid && (await onInvalid(formStateRef.current.errors, e));
1510
- shouldFocusError &&
1511
- focusFieldBy(fieldsRef.current, (key) => get(formStateRef.current.errors, key), fieldsNamesRef.current);
1512
- }
1513
- }
1514
- finally {
1515
- formStateRef.current.isSubmitted = true;
1516
- formStateSubjectRef.current.next({
1517
- isSubmitted: true,
1518
- isSubmitting: false,
1519
- isSubmitSuccessful: isEmptyObject(formStateRef.current.errors),
1520
- submitCount: formStateRef.current.submitCount + 1,
1521
- errors: formStateRef.current.errors,
1522
- });
1523
- }
1524
- }, [shouldFocusError, isValidateAllFieldCriteria, criteriaMode]);
1525
- const resetFromState = React__namespace.useCallback(({ keepErrors, keepDirty, keepIsSubmitted, keepTouched, keepIsValid, keepSubmitCount, }) => {
1526
- if (!keepIsValid) {
1527
- validFieldsRef.current = {};
1528
- fieldsWithValidationRef.current = {};
1529
- }
1530
- watchFieldsRef.current = new Set();
1531
- isWatchAllRef.current = false;
1532
- formStateSubjectRef.current.next({
1533
- submitCount: keepSubmitCount ? formStateRef.current.submitCount : 0,
1534
- isDirty: keepDirty ? formStateRef.current.isDirty : false,
1535
- isSubmitted: keepIsSubmitted ? formStateRef.current.isSubmitted : false,
1536
- isValid: keepIsValid
1537
- ? formStateRef.current.isValid
1538
- : !validationMode.isOnSubmit,
1539
- dirtyFields: keepDirty ? formStateRef.current.dirtyFields : {},
1540
- touchedFields: keepTouched ? formStateRef.current.touchedFields : {},
1541
- errors: keepErrors ? formStateRef.current.errors : {},
1542
- isSubmitting: false,
1543
- isSubmitSuccessful: false,
1544
- });
1545
- }, []);
1546
- const reset = (values, keepStateOptions = {}) => {
1547
- const updatedValues = values || defaultValuesRef.current;
1548
- if (isWeb && !keepStateOptions.keepValues) {
1549
- for (const field of Object.values(fieldsRef.current)) {
1550
- if (field && field._f) {
1551
- const inputRef = Array.isArray(field._f.refs)
1552
- ? field._f.refs[0]
1553
- : field._f.ref;
1554
- if (isHTMLElement(inputRef)) {
1555
- try {
1556
- inputRef.closest('form').reset();
1557
- break;
1558
- }
1559
- catch (_a) { }
1560
- }
1561
- }
1562
- }
1563
- }
1564
- !keepStateOptions.keepDefaultValues &&
1565
- (defaultValuesRef.current = Object.assign({}, updatedValues));
1566
- if (!keepStateOptions.keepValues) {
1567
- fieldsRef.current = {};
1568
- controllerSubjectRef.current.next({
1569
- values: Object.assign({}, updatedValues),
1570
- });
1571
- watchSubjectRef.current.next({
1572
- value: Object.assign({}, updatedValues),
1573
- });
1574
- fieldArraySubjectRef.current.next({
1575
- fields: Object.assign({}, updatedValues),
1576
- isReset: true,
1577
- });
1578
- }
1579
- resetFromState(keepStateOptions);
1580
- };
1581
- React__namespace.useEffect(() => {
1582
- isMountedRef.current = true;
1583
- const formStateSubscription = formStateSubjectRef.current.subscribe({
1584
- next(formState = {}) {
1585
- if (shouldRenderFormState(formState, readFormStateRef.current, true)) {
1586
- formStateRef.current = Object.assign(Object.assign({}, formStateRef.current), formState);
1587
- setFormState(formStateRef.current);
1588
- }
1589
- },
1590
- });
1591
- const useFieldArraySubscription = fieldArraySubjectRef.current.subscribe({
1592
- next(state) {
1593
- if (state.fields && state.name && readFormStateRef.current.isValid) {
1594
- const values = getFieldsValues(fieldsRef);
1595
- set(values, state.name, state.fields);
1596
- updateIsValid(values);
1597
- }
1598
- },
1599
- });
1600
- resolverRef.current && readFormStateRef.current.isValid && updateIsValid();
1601
- return () => {
1602
- watchSubjectRef.current.unsubscribe();
1603
- formStateSubscription.unsubscribe();
1604
- useFieldArraySubscription.unsubscribe();
1605
- };
1606
- }, []);
1607
- return {
1608
- control: React__namespace.useMemo(() => ({
1609
- register,
1610
- isWatchAllRef,
1611
- watchFieldsRef,
1612
- getFormIsDirty,
1613
- formStateSubjectRef,
1614
- fieldArraySubjectRef,
1615
- controllerSubjectRef,
1616
- watchSubjectRef,
1617
- watchInternal,
1618
- fieldsRef,
1619
- validFieldsRef,
1620
- fieldsWithValidationRef,
1621
- fieldArrayNamesRef,
1622
- readFormStateRef,
1623
- formStateRef,
1624
- defaultValuesRef,
1625
- fieldArrayDefaultValuesRef,
1626
- }), []),
1627
- formState: getProxyFormState(isProxyEnabled, formState, readFormStateRef),
1628
- trigger,
1629
- register,
1630
- handleSubmit,
1631
- watch: React__namespace.useCallback(watch, []),
1632
- setValue: React__namespace.useCallback(setValue, [setInternalValues]),
1633
- getValues: React__namespace.useCallback(getValues, []),
1634
- reset: React__namespace.useCallback(reset, []),
1635
- clearErrors: React__namespace.useCallback(clearErrors, []),
1636
- unregister: React__namespace.useCallback(unregister, []),
1637
- setError: React__namespace.useCallback(setError, []),
1638
- };
1639
- }
1640
-
1641
- function useWatch(props) {
1642
- const { control, name, defaultValue } = props || {};
1643
- const methods = useFormContext();
1644
- const { watchInternal, watchSubjectRef } = control || methods.control;
1645
- const [value, updateValue] = React__namespace.useState(isUndefined(defaultValue)
1646
- ? watchInternal(name)
1647
- : defaultValue);
1648
- React__namespace.useEffect(() => {
1649
- watchInternal(name);
1650
- const watchSubscription = watchSubjectRef.current.subscribe({
1651
- next: ({ name: inputName, value }) => (!name ||
1652
- !inputName ||
1653
- (Array.isArray(name) ? name : [name]).some((fieldName) => inputName &&
1654
- fieldName &&
1655
- inputName.startsWith(fieldName))) &&
1656
- updateValue(isString(inputName) && name === inputName && !isUndefined(value)
1657
- ? value
1658
- : watchInternal(name, defaultValue)),
1659
- });
1660
- return () => watchSubscription.unsubscribe();
1661
- }, []);
1662
- return value;
1663
- }
1664
-
1665
- exports.Controller = Controller;
1666
- exports.FormProvider = FormProvider;
1667
- exports.appendErrors = appendErrors;
1668
- exports.get = get;
1669
- exports.set = set;
1670
- exports.useController = useController;
1671
- exports.useFieldArray = useFieldArray;
1672
- exports.useForm = useForm;
1673
- exports.useFormContext = useFormContext;
1674
- exports.useFormState = useFormState;
1675
- exports.useWatch = useWatch;
1676
-
1677
- Object.defineProperty(exports, '__esModule', { value: true });
1678
-
1679
- })));
1680
- //# sourceMappingURL=index.umd.development.js.map