react-hook-form 7.56.1 → 7.57.0-next.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.
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import React__default from 'react';
2
+ import React__default, { useEffect } from 'react';
3
3
 
4
4
  var isCheckBoxInput = (element) => element.type === 'checkbox';
5
5
 
@@ -353,17 +353,34 @@ var generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) =>
353
353
  */
354
354
  function useWatch(props) {
355
355
  const methods = useFormContext();
356
- const { control = methods.control, name, defaultValue, disabled, exact, } = props || {};
357
- const [value, updateValue] = React__default.useState(control._getWatch(name, defaultValue));
356
+ const { control = methods.control, name, defaultValue, disabled, exact, compute, } = props || {};
357
+ const _compute = React__default.useRef(compute);
358
+ const _computeFormValues = React__default.useRef(undefined);
359
+ _compute.current = compute;
360
+ const defaultValueMemo = React__default.useMemo(() => control._getWatch(name, defaultValue), [control, name, defaultValue]);
361
+ const [value, updateValue] = React__default.useState(_compute.current ? _compute.current(defaultValueMemo) : defaultValueMemo);
358
362
  useDeepEqualEffect(() => control._subscribe({
359
363
  name: name,
360
364
  formState: {
361
365
  values: true,
362
366
  },
363
367
  exact,
364
- callback: (formState) => !disabled &&
365
- updateValue(generateWatchOutput(name, control._names, formState.values || control._formValues, false, defaultValue)),
366
- }), [name, defaultValue, disabled, exact]);
368
+ callback: (formState) => {
369
+ if (!disabled) {
370
+ const formValues = generateWatchOutput(name, control._names, formState.values || control._formValues, false, defaultValue);
371
+ if (_compute.current) {
372
+ const computedFormValues = _compute.current(formValues);
373
+ if (!deepEqual(computedFormValues, _computeFormValues.current)) {
374
+ updateValue(computedFormValues);
375
+ _computeFormValues.current = computedFormValues;
376
+ }
377
+ }
378
+ else {
379
+ updateValue(formValues);
380
+ }
381
+ }
382
+ },
383
+ }), [defaultValue, disabled, name, exact]);
367
384
  React__default.useEffect(() => control._removeUnmounted());
368
385
  return value;
369
386
  }
@@ -394,12 +411,13 @@ function useWatch(props) {
394
411
  */
395
412
  function useController(props) {
396
413
  const methods = useFormContext();
397
- const { name, disabled, control = methods.control, shouldUnregister } = props;
414
+ const { name, disabled, control = methods.control, shouldUnregister, defaultValue, } = props;
398
415
  const isArrayField = isNameInFieldArray(control._names.array, name);
416
+ const defaultValueMemo = React__default.useMemo(() => get(control._formValues, name, get(control._defaultValues, name, defaultValue)), [control, name, defaultValue]);
399
417
  const value = useWatch({
400
418
  control,
401
419
  name,
402
- defaultValue: get(control._formValues, name, get(control._defaultValues, name, props.defaultValue)),
420
+ defaultValue: defaultValueMemo,
403
421
  exact: true,
404
422
  });
405
423
  const formState = useFormState({
@@ -413,6 +431,7 @@ function useController(props) {
413
431
  value,
414
432
  ...(isBoolean(props.disabled) ? { disabled: props.disabled } : {}),
415
433
  }));
434
+ _props.current = props;
416
435
  const fieldState = React__default.useMemo(() => Object.defineProperties({}, {
417
436
  invalid: {
418
437
  enumerable: true,
@@ -452,12 +471,7 @@ function useController(props) {
452
471
  const ref = React__default.useCallback((elm) => {
453
472
  const field = get(control._fields, name);
454
473
  if (field && elm) {
455
- field._f.ref = {
456
- focus: () => elm.focus(),
457
- select: () => elm.select(),
458
- setCustomValidity: (message) => elm.setCustomValidity(message),
459
- reportValidity: () => elm.reportValidity(),
460
- };
474
+ field._f.ref = elm;
461
475
  }
462
476
  }, [control._fields, name]);
463
477
  const field = React__default.useMemo(() => ({
@@ -2390,24 +2404,22 @@ function useFieldArray(props) {
2390
2404
  const [fields, setFields] = React__default.useState(control._getFieldArray(name));
2391
2405
  const ids = React__default.useRef(control._getFieldArray(name).map(generateId));
2392
2406
  const _fieldIds = React__default.useRef(fields);
2393
- const _name = React__default.useRef(name);
2394
2407
  const _actioned = React__default.useRef(false);
2395
- _name.current = name;
2396
2408
  _fieldIds.current = fields;
2397
2409
  control._names.array.add(name);
2398
- rules &&
2399
- control.register(name, rules);
2400
- React__default.useEffect(() => control._subjects.array.subscribe({
2410
+ React__default.useMemo(() => rules &&
2411
+ control.register(name, rules), [control, rules, name]);
2412
+ useEffect(() => control._subjects.array.subscribe({
2401
2413
  next: ({ values, name: fieldArrayName, }) => {
2402
- if (fieldArrayName === _name.current || !fieldArrayName) {
2403
- const fieldValues = get(values, _name.current);
2414
+ if (fieldArrayName === name || !fieldArrayName) {
2415
+ const fieldValues = get(values, name);
2404
2416
  if (Array.isArray(fieldValues)) {
2405
2417
  setFields(fieldValues);
2406
2418
  ids.current = fieldValues.map(generateId);
2407
2419
  }
2408
2420
  }
2409
2421
  },
2410
- }).unsubscribe, [control]);
2422
+ }).unsubscribe, [control, name]);
2411
2423
  const updateValues = React__default.useCallback((updatedFieldArrayValues) => {
2412
2424
  _actioned.current = true;
2413
2425
  control._setFieldArray(name, updatedFieldArrayValues);