react-hook-form 7.69.0 → 7.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/dist/__tests__/controller.server.test.d.ts +2 -0
  2. package/dist/__tests__/controller.server.test.d.ts.map +1 -0
  3. package/dist/__tests__/controller.test.d.ts +2 -0
  4. package/dist/__tests__/controller.test.d.ts.map +1 -0
  5. package/dist/__tests__/form.test.d.ts +2 -0
  6. package/dist/__tests__/form.test.d.ts.map +1 -0
  7. package/dist/__tests__/formStateSubscribe.server.test.d.ts +2 -0
  8. package/dist/__tests__/formStateSubscribe.server.test.d.ts.map +1 -0
  9. package/dist/__tests__/formStateSubscribe.test.d.ts +2 -0
  10. package/dist/__tests__/formStateSubscribe.test.d.ts.map +1 -0
  11. package/dist/__tests__/isPlainObject.test.d.ts +2 -0
  12. package/dist/__tests__/isPlainObject.test.d.ts.map +1 -0
  13. package/dist/__tests__/logic/appendErrors.test.d.ts +2 -0
  14. package/dist/__tests__/logic/appendErrors.test.d.ts.map +1 -0
  15. package/dist/__tests__/logic/createFormControl.test.d.ts +2 -0
  16. package/dist/__tests__/logic/createFormControl.test.d.ts.map +1 -0
  17. package/dist/__tests__/logic/generateId.test.d.ts +2 -0
  18. package/dist/__tests__/logic/generateId.test.d.ts.map +1 -0
  19. package/dist/__tests__/logic/getCheckboxValue.test.d.ts +2 -0
  20. package/dist/__tests__/logic/getCheckboxValue.test.d.ts.map +1 -0
  21. package/dist/__tests__/logic/getDirtyFields.test.d.ts +2 -0
  22. package/dist/__tests__/logic/getDirtyFields.test.d.ts.map +1 -0
  23. package/dist/__tests__/logic/getEventValue.test.d.ts +2 -0
  24. package/dist/__tests__/logic/getEventValue.test.d.ts.map +1 -0
  25. package/dist/__tests__/logic/getFieldValue.test.d.ts +2 -0
  26. package/dist/__tests__/logic/getFieldValue.test.d.ts.map +1 -0
  27. package/dist/__tests__/logic/getFieldValueAs.test.d.ts +2 -0
  28. package/dist/__tests__/logic/getFieldValueAs.test.d.ts.map +1 -0
  29. package/dist/__tests__/logic/getFocusFieldName.test.d.ts +2 -0
  30. package/dist/__tests__/logic/getFocusFieldName.test.d.ts.map +1 -0
  31. package/dist/__tests__/logic/getNodeParentName.test.d.ts +2 -0
  32. package/dist/__tests__/logic/getNodeParentName.test.d.ts.map +1 -0
  33. package/dist/__tests__/logic/getRadioValue.test.d.ts +2 -0
  34. package/dist/__tests__/logic/getRadioValue.test.d.ts.map +1 -0
  35. package/dist/__tests__/logic/getResolverOptions.test.d.ts +2 -0
  36. package/dist/__tests__/logic/getResolverOptions.test.d.ts.map +1 -0
  37. package/dist/__tests__/logic/getRuleValue.test.d.ts +2 -0
  38. package/dist/__tests__/logic/getRuleValue.test.d.ts.map +1 -0
  39. package/dist/__tests__/logic/getValidateError.test.d.ts +2 -0
  40. package/dist/__tests__/logic/getValidateError.test.d.ts.map +1 -0
  41. package/dist/__tests__/logic/getValidationModes.test.d.ts +2 -0
  42. package/dist/__tests__/logic/getValidationModes.test.d.ts.map +1 -0
  43. package/dist/__tests__/logic/getValueAndMessage.test.d.ts +2 -0
  44. package/dist/__tests__/logic/getValueAndMessage.test.d.ts.map +1 -0
  45. package/dist/__tests__/logic/hasPromiseValidation.test.d.ts +2 -0
  46. package/dist/__tests__/logic/hasPromiseValidation.test.d.ts.map +1 -0
  47. package/dist/__tests__/logic/hasValidation.test.d.ts +2 -0
  48. package/dist/__tests__/logic/hasValidation.test.d.ts.map +1 -0
  49. package/dist/__tests__/logic/isNameInFieldArray.test.d.ts +2 -0
  50. package/dist/__tests__/logic/isNameInFieldArray.test.d.ts.map +1 -0
  51. package/dist/__tests__/logic/isWatched.test.d.ts +2 -0
  52. package/dist/__tests__/logic/isWatched.test.d.ts.map +1 -0
  53. package/dist/__tests__/logic/iterateFieldsByAction.test.d.ts +2 -0
  54. package/dist/__tests__/logic/iterateFieldsByAction.test.d.ts.map +1 -0
  55. package/dist/__tests__/logic/schemaErrorLookup.test.d.ts +2 -0
  56. package/dist/__tests__/logic/schemaErrorLookup.test.d.ts.map +1 -0
  57. package/dist/__tests__/logic/shouldRenderFormState.test.d.ts +2 -0
  58. package/dist/__tests__/logic/shouldRenderFormState.test.d.ts.map +1 -0
  59. package/dist/__tests__/logic/shouldSubscribeByName.test.d.ts +2 -0
  60. package/dist/__tests__/logic/shouldSubscribeByName.test.d.ts.map +1 -0
  61. package/dist/__tests__/logic/skipValidation.test.d.ts +2 -0
  62. package/dist/__tests__/logic/skipValidation.test.d.ts.map +1 -0
  63. package/dist/__tests__/logic/unsetEmptyArray.test.d.ts +2 -0
  64. package/dist/__tests__/logic/unsetEmptyArray.test.d.ts.map +1 -0
  65. package/dist/__tests__/logic/validateField.test.d.ts +2 -0
  66. package/dist/__tests__/logic/validateField.test.d.ts.map +1 -0
  67. package/dist/__tests__/type.test.d.ts +2 -0
  68. package/dist/__tests__/type.test.d.ts.map +1 -0
  69. package/dist/__tests__/useController.test.d.ts +2 -0
  70. package/dist/__tests__/useController.test.d.ts.map +1 -0
  71. package/dist/__tests__/useFieldArray/append.test.d.ts +2 -0
  72. package/dist/__tests__/useFieldArray/append.test.d.ts.map +1 -0
  73. package/dist/__tests__/useFieldArray/focus.test.d.ts +2 -0
  74. package/dist/__tests__/useFieldArray/focus.test.d.ts.map +1 -0
  75. package/dist/__tests__/useFieldArray/insert.test.d.ts +2 -0
  76. package/dist/__tests__/useFieldArray/insert.test.d.ts.map +1 -0
  77. package/dist/__tests__/useFieldArray/move.test.d.ts +2 -0
  78. package/dist/__tests__/useFieldArray/move.test.d.ts.map +1 -0
  79. package/dist/__tests__/useFieldArray/prepend.test.d.ts +2 -0
  80. package/dist/__tests__/useFieldArray/prepend.test.d.ts.map +1 -0
  81. package/dist/__tests__/useFieldArray/remove.test.d.ts +2 -0
  82. package/dist/__tests__/useFieldArray/remove.test.d.ts.map +1 -0
  83. package/dist/__tests__/useFieldArray/replace.test.d.ts +2 -0
  84. package/dist/__tests__/useFieldArray/replace.test.d.ts.map +1 -0
  85. package/dist/__tests__/useFieldArray/swap.test.d.ts +2 -0
  86. package/dist/__tests__/useFieldArray/swap.test.d.ts.map +1 -0
  87. package/dist/__tests__/useFieldArray/update.test.d.ts +2 -0
  88. package/dist/__tests__/useFieldArray/update.test.d.ts.map +1 -0
  89. package/dist/__tests__/useFieldArray.test.d.ts +2 -0
  90. package/dist/__tests__/useFieldArray.test.d.ts.map +1 -0
  91. package/dist/__tests__/useForm/clearErrors.test.d.ts +2 -0
  92. package/dist/__tests__/useForm/clearErrors.test.d.ts.map +1 -0
  93. package/dist/__tests__/useForm/formState.test.d.ts +2 -0
  94. package/dist/__tests__/useForm/formState.test.d.ts.map +1 -0
  95. package/dist/__tests__/useForm/getFieldState.test.d.ts +2 -0
  96. package/dist/__tests__/useForm/getFieldState.test.d.ts.map +1 -0
  97. package/dist/__tests__/useForm/getValues.test.d.ts +2 -0
  98. package/dist/__tests__/useForm/getValues.test.d.ts.map +1 -0
  99. package/dist/__tests__/useForm/handleSubmit.test.d.ts +2 -0
  100. package/dist/__tests__/useForm/handleSubmit.test.d.ts.map +1 -0
  101. package/dist/__tests__/useForm/register.test.d.ts +2 -0
  102. package/dist/__tests__/useForm/register.test.d.ts.map +1 -0
  103. package/dist/__tests__/useForm/reset.test.d.ts +2 -0
  104. package/dist/__tests__/useForm/reset.test.d.ts.map +1 -0
  105. package/dist/__tests__/useForm/resetField.test.d.ts +2 -0
  106. package/dist/__tests__/useForm/resetField.test.d.ts.map +1 -0
  107. package/dist/__tests__/useForm/resolver.test.d.ts +2 -0
  108. package/dist/__tests__/useForm/resolver.test.d.ts.map +1 -0
  109. package/dist/__tests__/useForm/setError.test.d.ts +2 -0
  110. package/dist/__tests__/useForm/setError.test.d.ts.map +1 -0
  111. package/dist/__tests__/useForm/setFocus.test.d.ts +2 -0
  112. package/dist/__tests__/useForm/setFocus.test.d.ts.map +1 -0
  113. package/dist/__tests__/useForm/setValue.test.d.ts +2 -0
  114. package/dist/__tests__/useForm/setValue.test.d.ts.map +1 -0
  115. package/dist/__tests__/useForm/subscribe.test.d.ts +2 -0
  116. package/dist/__tests__/useForm/subscribe.test.d.ts.map +1 -0
  117. package/dist/__tests__/useForm/trigger.test.d.ts +2 -0
  118. package/dist/__tests__/useForm/trigger.test.d.ts.map +1 -0
  119. package/dist/__tests__/useForm/unregister.test.d.ts +2 -0
  120. package/dist/__tests__/useForm/unregister.test.d.ts.map +1 -0
  121. package/dist/__tests__/useForm/useFormWithNullValues.test.d.ts +2 -0
  122. package/dist/__tests__/useForm/useFormWithNullValues.test.d.ts.map +1 -0
  123. package/dist/__tests__/useForm/watch.test.d.ts +2 -0
  124. package/dist/__tests__/useForm/watch.test.d.ts.map +1 -0
  125. package/dist/__tests__/useForm.server.test.d.ts +2 -0
  126. package/dist/__tests__/useForm.server.test.d.ts.map +1 -0
  127. package/dist/__tests__/useForm.test.d.ts +2 -0
  128. package/dist/__tests__/useForm.test.d.ts.map +1 -0
  129. package/dist/__tests__/useFormContext.server.test.d.ts +2 -0
  130. package/dist/__tests__/useFormContext.server.test.d.ts.map +1 -0
  131. package/dist/__tests__/useFormContext.test.d.ts +2 -0
  132. package/dist/__tests__/useFormContext.test.d.ts.map +1 -0
  133. package/dist/__tests__/useFormState.test.d.ts +2 -0
  134. package/dist/__tests__/useFormState.test.d.ts.map +1 -0
  135. package/dist/__tests__/useWatch.test.d.ts +2 -0
  136. package/dist/__tests__/useWatch.test.d.ts.map +1 -0
  137. package/dist/__tests__/utils/append.test.d.ts +2 -0
  138. package/dist/__tests__/utils/append.test.d.ts.map +1 -0
  139. package/dist/__tests__/utils/cloneObject.test.d.ts +2 -0
  140. package/dist/__tests__/utils/cloneObject.test.d.ts.map +1 -0
  141. package/dist/__tests__/utils/compact.test.d.ts +2 -0
  142. package/dist/__tests__/utils/compact.test.d.ts.map +1 -0
  143. package/dist/__tests__/utils/convertToArrayPayload.test.d.ts +2 -0
  144. package/dist/__tests__/utils/convertToArrayPayload.test.d.ts.map +1 -0
  145. package/dist/__tests__/utils/createSubject.test.d.ts +2 -0
  146. package/dist/__tests__/utils/createSubject.test.d.ts.map +1 -0
  147. package/dist/__tests__/utils/deepEqual.test.d.ts +2 -0
  148. package/dist/__tests__/utils/deepEqual.test.d.ts.map +1 -0
  149. package/dist/__tests__/utils/deepMerge.test.d.ts +2 -0
  150. package/dist/__tests__/utils/deepMerge.test.d.ts.map +1 -0
  151. package/dist/__tests__/utils/extractFormValues.test.d.ts +2 -0
  152. package/dist/__tests__/utils/extractFormValues.test.d.ts.map +1 -0
  153. package/dist/__tests__/utils/fillEmptyArray.test.d.ts +2 -0
  154. package/dist/__tests__/utils/fillEmptyArray.test.d.ts.map +1 -0
  155. package/dist/__tests__/utils/flatten.test.d.ts +2 -0
  156. package/dist/__tests__/utils/flatten.test.d.ts.map +1 -0
  157. package/dist/__tests__/utils/get.test.d.ts +2 -0
  158. package/dist/__tests__/utils/get.test.d.ts.map +1 -0
  159. package/dist/__tests__/utils/insert.test.d.ts +2 -0
  160. package/dist/__tests__/utils/insert.test.d.ts.map +1 -0
  161. package/dist/__tests__/utils/isBoolean.test.d.ts +2 -0
  162. package/dist/__tests__/utils/isBoolean.test.d.ts.map +1 -0
  163. package/dist/__tests__/utils/isCheckBoxInput.test.d.ts +2 -0
  164. package/dist/__tests__/utils/isCheckBoxInput.test.d.ts.map +1 -0
  165. package/dist/__tests__/utils/isEmptyObject.test.d.ts +2 -0
  166. package/dist/__tests__/utils/isEmptyObject.test.d.ts.map +1 -0
  167. package/dist/__tests__/utils/isFileInput.test.d.ts +2 -0
  168. package/dist/__tests__/utils/isFileInput.test.d.ts.map +1 -0
  169. package/dist/__tests__/utils/isFunction.test.d.ts +2 -0
  170. package/dist/__tests__/utils/isFunction.test.d.ts.map +1 -0
  171. package/dist/__tests__/utils/isHTMLElement.test.d.ts +2 -0
  172. package/dist/__tests__/utils/isHTMLElement.test.d.ts.map +1 -0
  173. package/dist/__tests__/utils/isKey.test.d.ts +2 -0
  174. package/dist/__tests__/utils/isKey.test.d.ts.map +1 -0
  175. package/dist/__tests__/utils/isMultipleSelect.test.d.ts +2 -0
  176. package/dist/__tests__/utils/isMultipleSelect.test.d.ts.map +1 -0
  177. package/dist/__tests__/utils/isNullOrUndefined.test.d.ts +2 -0
  178. package/dist/__tests__/utils/isNullOrUndefined.test.d.ts.map +1 -0
  179. package/dist/__tests__/utils/isObject.test.d.ts +2 -0
  180. package/dist/__tests__/utils/isObject.test.d.ts.map +1 -0
  181. package/dist/__tests__/utils/isPrimitive.test.d.ts +2 -0
  182. package/dist/__tests__/utils/isPrimitive.test.d.ts.map +1 -0
  183. package/dist/__tests__/utils/isRadioInput.test.d.ts +2 -0
  184. package/dist/__tests__/utils/isRadioInput.test.d.ts.map +1 -0
  185. package/dist/__tests__/utils/isRadioOrCheckbox.test.d.ts +2 -0
  186. package/dist/__tests__/utils/isRadioOrCheckbox.test.d.ts.map +1 -0
  187. package/dist/__tests__/utils/isRegex.test.d.ts +2 -0
  188. package/dist/__tests__/utils/isRegex.test.d.ts.map +1 -0
  189. package/dist/__tests__/utils/isString.test.d.ts +2 -0
  190. package/dist/__tests__/utils/isString.test.d.ts.map +1 -0
  191. package/dist/__tests__/utils/isUndefined.test.d.ts +2 -0
  192. package/dist/__tests__/utils/isUndefined.test.d.ts.map +1 -0
  193. package/dist/__tests__/utils/live.test.d.ts +2 -0
  194. package/dist/__tests__/utils/live.test.d.ts.map +1 -0
  195. package/dist/__tests__/utils/move.test.d.ts +2 -0
  196. package/dist/__tests__/utils/move.test.d.ts.map +1 -0
  197. package/dist/__tests__/utils/noop.test.d.ts +2 -0
  198. package/dist/__tests__/utils/noop.test.d.ts.map +1 -0
  199. package/dist/__tests__/utils/objectHasFunction.test.d.ts +2 -0
  200. package/dist/__tests__/utils/objectHasFunction.test.d.ts.map +1 -0
  201. package/dist/__tests__/utils/prepend.test.d.ts +2 -0
  202. package/dist/__tests__/utils/prepend.test.d.ts.map +1 -0
  203. package/dist/__tests__/utils/remove.test.d.ts +2 -0
  204. package/dist/__tests__/utils/remove.test.d.ts.map +1 -0
  205. package/dist/__tests__/utils/set.test.d.ts +2 -0
  206. package/dist/__tests__/utils/set.test.d.ts.map +1 -0
  207. package/dist/__tests__/utils/stringToPath.test.d.ts +2 -0
  208. package/dist/__tests__/utils/stringToPath.test.d.ts.map +1 -0
  209. package/dist/__tests__/utils/swap.test.d.ts +2 -0
  210. package/dist/__tests__/utils/swap.test.d.ts.map +1 -0
  211. package/dist/__tests__/utils/unset.test.d.ts +2 -0
  212. package/dist/__tests__/utils/unset.test.d.ts.map +1 -0
  213. package/dist/__tests__/utils/validationModeChecker.test.d.ts +2 -0
  214. package/dist/__tests__/utils/validationModeChecker.test.d.ts.map +1 -0
  215. package/dist/__tests__/watch.server.test.d.ts +2 -0
  216. package/dist/__tests__/watch.server.test.d.ts.map +1 -0
  217. package/dist/__tests__/watch.test.d.ts +2 -0
  218. package/dist/__tests__/watch.test.d.ts.map +1 -0
  219. package/dist/index.cjs.js +1 -1
  220. package/dist/index.cjs.js.map +1 -1
  221. package/dist/index.esm.mjs +147 -83
  222. package/dist/index.esm.mjs.map +1 -1
  223. package/dist/index.umd.js +1 -1
  224. package/dist/index.umd.js.map +1 -1
  225. package/dist/logic/createFormControl.d.ts.map +1 -1
  226. package/dist/react-server.esm.mjs +28 -10
  227. package/dist/react-server.esm.mjs.map +1 -1
  228. package/dist/types/form.d.ts +0 -8
  229. package/dist/types/form.d.ts.map +1 -1
  230. package/dist/types/index.d.ts +1 -0
  231. package/dist/types/index.d.ts.map +1 -1
  232. package/dist/types/utils.d.ts +3 -2
  233. package/dist/types/utils.d.ts.map +1 -1
  234. package/dist/types/watch.d.ts +32 -0
  235. package/dist/types/watch.d.ts.map +1 -0
  236. package/dist/useController.d.ts.map +1 -1
  237. package/dist/useFieldArray.d.ts.map +1 -1
  238. package/dist/useForm.d.ts.map +1 -1
  239. package/dist/useFormContext.d.ts.map +1 -1
  240. package/dist/useFormControlContext.d.ts +12 -0
  241. package/dist/useFormControlContext.d.ts.map +1 -0
  242. package/dist/useFormState.d.ts.map +1 -1
  243. package/dist/watch.d.ts +2 -21
  244. package/dist/watch.d.ts.map +1 -1
  245. package/package.json +32 -33
@@ -123,73 +123,16 @@ const INPUT_VALIDATION_RULES = {
123
123
  validate: 'validate',
124
124
  };
125
125
 
126
- const HookFormContext = React.createContext(null);
127
- HookFormContext.displayName = 'HookFormContext';
128
126
  /**
129
- * This custom hook allows you to access the form context. useFormContext is intended to be used in deeply nested structures, where it would become inconvenient to pass the context as a prop. To be used with {@link FormProvider}.
130
- *
131
- * @remarks
132
- * [API](https://react-hook-form.com/docs/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)
133
- *
134
- * @returns return all useForm methods
135
- *
136
- * @example
137
- * ```tsx
138
- * function App() {
139
- * const methods = useForm();
140
- * const onSubmit = data => console.log(data);
141
- *
142
- * return (
143
- * <FormProvider {...methods} >
144
- * <form onSubmit={methods.handleSubmit(onSubmit)}>
145
- * <NestedInput />
146
- * <input type="submit" />
147
- * </form>
148
- * </FormProvider>
149
- * );
150
- * }
151
- *
152
- * function NestedInput() {
153
- * const { register } = useFormContext(); // retrieve all hook methods
154
- * return <input {...register("test")} />;
155
- * }
156
- * ```
127
+ * Separate context for `control` to prevent unnecessary rerenders.
128
+ * Internal hooks that only need control use this instead of full form context.
157
129
  */
158
- const useFormContext = () => React.useContext(HookFormContext);
130
+ const HookFormControlContext = React.createContext(null);
131
+ HookFormControlContext.displayName = 'HookFormControlContext';
159
132
  /**
160
- * A provider component that propagates the `useForm` methods to all children components via [React Context](https://react.dev/reference/react/useContext) API. To be used with {@link useFormContext}.
161
- *
162
- * @remarks
163
- * [API](https://react-hook-form.com/docs/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)
164
- *
165
- * @param props - all useForm methods
166
- *
167
- * @example
168
- * ```tsx
169
- * function App() {
170
- * const methods = useForm();
171
- * const onSubmit = data => console.log(data);
172
- *
173
- * return (
174
- * <FormProvider {...methods} >
175
- * <form onSubmit={methods.handleSubmit(onSubmit)}>
176
- * <NestedInput />
177
- * <input type="submit" />
178
- * </form>
179
- * </FormProvider>
180
- * );
181
- * }
182
- *
183
- * function NestedInput() {
184
- * const { register } = useFormContext(); // retrieve all hook methods
185
- * return <input {...register("test")} />;
186
- * }
187
- * ```
133
+ * @internal Internal hook to access only control from context.
188
134
  */
189
- const FormProvider = (props) => {
190
- const { children, ...data } = props;
191
- return (React.createElement(HookFormContext.Provider, { value: data }, children));
192
- };
135
+ const useFormControlContext = () => React.useContext(HookFormControlContext);
193
136
 
194
137
  var getProxyFormState = (formState, control, localProxyFormState, isRoot = true) => {
195
138
  const result = {
@@ -243,8 +186,8 @@ const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayou
243
186
  * ```
244
187
  */
245
188
  function useFormState(props) {
246
- const methods = useFormContext();
247
- const { control = methods.control, disabled, name, exact } = props || {};
189
+ const formControl = useFormControlContext();
190
+ const { control = formControl, disabled, name, exact } = props || {};
248
191
  const [formState, updateFormState] = React.useState(control._formState);
249
192
  const _localProxyFormState = React.useRef({
250
193
  isDirty: false,
@@ -296,7 +239,7 @@ function deepEqual(object1, object2, _internal_visited = new WeakSet()) {
296
239
  return Object.is(object1, object2);
297
240
  }
298
241
  if (isDateObject(object1) && isDateObject(object2)) {
299
- return object1.getTime() === object2.getTime();
242
+ return Object.is(object1.getTime(), object2.getTime());
300
243
  }
301
244
  const keys1 = Object.keys(object1);
302
245
  const keys2 = Object.keys(object2);
@@ -344,8 +287,8 @@ function deepEqual(object1, object2, _internal_visited = new WeakSet()) {
344
287
  * ```
345
288
  */
346
289
  function useWatch(props) {
347
- const methods = useFormContext();
348
- const { control = methods.control, name, defaultValue, disabled, exact, compute, } = props || {};
290
+ const formControl = useFormControlContext();
291
+ const { control = formControl, name, defaultValue, disabled, exact, compute, } = props || {};
349
292
  const _defaultValue = React.useRef(defaultValue);
350
293
  const _compute = React.useRef(compute);
351
294
  const _computeFormValues = React.useRef(undefined);
@@ -438,8 +381,8 @@ function useWatch(props) {
438
381
  * ```
439
382
  */
440
383
  function useController(props) {
441
- const methods = useFormContext();
442
- const { name, disabled, control = methods.control, shouldUnregister, defaultValue, exact = true, } = props;
384
+ const formControl = useFormControlContext();
385
+ const { name, disabled, control = formControl, shouldUnregister, defaultValue, exact = true, } = props;
443
386
  const isArrayField = isNameInFieldArray(control._names.array, name);
444
387
  const defaultValueMemo = React.useMemo(() => get(control._formValues, name, get(control._defaultValues, name, defaultValue)), [control, name, defaultValue]);
445
388
  const value = useWatch({
@@ -627,6 +570,109 @@ const flatten = (obj) => {
627
570
  return output;
628
571
  };
629
572
 
573
+ const HookFormContext = React.createContext(null);
574
+ HookFormContext.displayName = 'HookFormContext';
575
+ /**
576
+ * This custom hook allows you to access the form context. useFormContext is intended to be used in deeply nested structures, where it would become inconvenient to pass the context as a prop. To be used with {@link FormProvider}.
577
+ *
578
+ * @remarks
579
+ * [API](https://react-hook-form.com/docs/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)
580
+ *
581
+ * @returns return all useForm methods
582
+ *
583
+ * @example
584
+ * ```tsx
585
+ * function App() {
586
+ * const methods = useForm();
587
+ * const onSubmit = data => console.log(data);
588
+ *
589
+ * return (
590
+ * <FormProvider {...methods} >
591
+ * <form onSubmit={methods.handleSubmit(onSubmit)}>
592
+ * <NestedInput />
593
+ * <input type="submit" />
594
+ * </form>
595
+ * </FormProvider>
596
+ * );
597
+ * }
598
+ *
599
+ * function NestedInput() {
600
+ * const { register } = useFormContext(); // retrieve all hook methods
601
+ * return <input {...register("test")} />;
602
+ * }
603
+ * ```
604
+ */
605
+ const useFormContext = () => React.useContext(HookFormContext);
606
+ /**
607
+ * A provider component that propagates the `useForm` methods to all children components via [React Context](https://react.dev/reference/react/useContext) API. To be used with {@link useFormContext}.
608
+ *
609
+ * @remarks
610
+ * [API](https://react-hook-form.com/docs/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)
611
+ *
612
+ * @param props - all useForm methods
613
+ *
614
+ * @example
615
+ * ```tsx
616
+ * function App() {
617
+ * const methods = useForm();
618
+ * const onSubmit = data => console.log(data);
619
+ *
620
+ * return (
621
+ * <FormProvider {...methods} >
622
+ * <form onSubmit={methods.handleSubmit(onSubmit)}>
623
+ * <NestedInput />
624
+ * <input type="submit" />
625
+ * </form>
626
+ * </FormProvider>
627
+ * );
628
+ * }
629
+ *
630
+ * function NestedInput() {
631
+ * const { register } = useFormContext(); // retrieve all hook methods
632
+ * return <input {...register("test")} />;
633
+ * }
634
+ * ```
635
+ */
636
+ const FormProvider = (props) => {
637
+ const { children, watch, getValues, getFieldState, setError, clearErrors, setValue, trigger, formState, resetField, reset, handleSubmit, unregister, control, register, setFocus, subscribe, } = props;
638
+ return (React.createElement(HookFormContext.Provider, { value: React.useMemo(() => ({
639
+ watch,
640
+ getValues,
641
+ getFieldState,
642
+ setError,
643
+ clearErrors,
644
+ setValue,
645
+ trigger,
646
+ formState,
647
+ resetField,
648
+ reset,
649
+ handleSubmit,
650
+ unregister,
651
+ control,
652
+ register,
653
+ setFocus,
654
+ subscribe,
655
+ }), [
656
+ clearErrors,
657
+ control,
658
+ formState,
659
+ getFieldState,
660
+ getValues,
661
+ handleSubmit,
662
+ register,
663
+ reset,
664
+ resetField,
665
+ setError,
666
+ setFocus,
667
+ setValue,
668
+ subscribe,
669
+ trigger,
670
+ unregister,
671
+ watch,
672
+ ]) },
673
+ React.createElement(HookFormControlContext.Provider, { value: control }, children)));
674
+ };
675
+
630
676
  const POST_REQUEST = 'post';
631
677
  /**
632
678
  * Form component to manage submission.
@@ -1611,7 +1657,7 @@ function createFormControl(props = {}) {
1611
1657
  }
1612
1658
  if (fieldError[_f.name]) {
1613
1659
  context.valid = false;
1614
- if (shouldOnlyCheckValid) {
1660
+ if (shouldOnlyCheckValid || props.shouldUseNativeValidation) {
1615
1661
  break;
1616
1662
  }
1617
1663
  }
@@ -1746,11 +1792,19 @@ function createFormControl(props = {}) {
1746
1792
  ? setValues(name, cloneValue, options)
1747
1793
  : setFieldValue(name, cloneValue, options);
1748
1794
  }
1749
- isWatched(name, _names) && _subjects.state.next({ ..._formState, name });
1750
- _subjects.state.next({
1751
- name: _state.mount ? name : undefined,
1752
- values: cloneObject(_formValues),
1753
- });
1795
+ if (isWatched(name, _names)) {
1796
+ _subjects.state.next({
1797
+ ..._formState,
1798
+ name,
1799
+ values: cloneObject(_formValues),
1800
+ });
1801
+ }
1802
+ else {
1803
+ _subjects.state.next({
1804
+ name: _state.mount ? name : undefined,
1805
+ values: cloneObject(_formValues),
1806
+ });
1807
+ }
1754
1808
  };
1755
1809
  const onChange = async (event) => {
1756
1810
  _state.mount = true;
@@ -1996,7 +2050,11 @@ function createFormControl(props = {}) {
1996
2050
  if ((isBoolean(disabled) && _state.mount) ||
1997
2051
  !!disabled ||
1998
2052
  _names.disabled.has(name)) {
2053
+ const wasDisabled = _names.disabled.has(name);
2054
+ const isDisabled = !!disabled;
2055
+ const disabledStateChanged = wasDisabled !== isDisabled;
1999
2056
  disabled ? _names.disabled.add(name) : _names.disabled.delete(name);
2057
+ disabledStateChanged && _state.mount && !_state.action && _setValid();
2000
2058
  }
2001
2059
  };
2002
2060
  const register = (name, options = {}) => {
@@ -2198,9 +2256,15 @@ function createFormControl(props = {}) {
2198
2256
  ...Object.keys(getDirtyFields(_defaultValues, _formValues)),
2199
2257
  ]);
2200
2258
  for (const fieldName of Array.from(fieldsToCheck)) {
2201
- get(_formState.dirtyFields, fieldName)
2202
- ? set(values, fieldName, get(_formValues, fieldName))
2203
- : setValue(fieldName, get(values, fieldName));
2259
+ const isDirty = get(_formState.dirtyFields, fieldName);
2260
+ const existingValue = get(_formValues, fieldName);
2261
+ const newValue = get(values, fieldName);
2262
+ if (isDirty && !isUndefined(existingValue)) {
2263
+ set(values, fieldName, existingValue);
2264
+ }
2265
+ else if (!isDirty && !isUndefined(newValue)) {
2266
+ setValue(fieldName, newValue);
2267
+ }
2204
2268
  }
2205
2269
  }
2206
2270
  else {
@@ -2521,8 +2585,8 @@ var updateAt = (fieldValues, index, value) => {
2521
2585
  * ```
2522
2586
  */
2523
2587
  function useFieldArray(props) {
2524
- const methods = useFormContext();
2525
- const { control = methods.control, name, keyName = 'id', shouldUnregister, rules, } = props;
2588
+ const formControl = useFormControlContext();
2589
+ const { control = formControl, name, keyName = 'id', shouldUnregister, rules, } = props;
2526
2590
  const [fields, setFields] = React.useState(control._getFieldArray(name));
2527
2591
  const ids = React.useRef(control._getFieldArray(name).map(generateId));
2528
2592
  const _actioned = React.useRef(false);
@@ -2864,7 +2928,7 @@ function useForm(props = {}) {
2864
2928
  }
2865
2929
  control._removeUnmounted();
2866
2930
  });
2867
- _formControl.current.formState = getProxyFormState(formState, control);
2931
+ _formControl.current.formState = React.useMemo(() => getProxyFormState(formState, control), [control, formState]);
2868
2932
  return _formControl.current;
2869
2933
  }
2870
2934
 
@@ -2894,7 +2958,7 @@ function useForm(props = {}) {
2894
2958
  * />
2895
2959
  * ```
2896
2960
  */
2897
- const Watch = ({ render, names, ...props }) => render(useWatch({ ...props, name: names }));
2961
+ const Watch = (props) => props.render(useWatch({ name: props.names, ...props }));
2898
2962
 
2899
2963
  export { Controller, Form, FormProvider, FormStateSubscribe, Watch, appendErrors, createFormControl, get, set, useController, useFieldArray, useForm, useFormContext, useFormState, useWatch };
2900
2964
  //# sourceMappingURL=index.esm.mjs.map