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.
- package/dist/__tests__/controller.server.test.d.ts +2 -0
- package/dist/__tests__/controller.server.test.d.ts.map +1 -0
- package/dist/__tests__/controller.test.d.ts +2 -0
- package/dist/__tests__/controller.test.d.ts.map +1 -0
- package/dist/__tests__/form.test.d.ts +2 -0
- package/dist/__tests__/form.test.d.ts.map +1 -0
- package/dist/__tests__/formStateSubscribe.server.test.d.ts +2 -0
- package/dist/__tests__/formStateSubscribe.server.test.d.ts.map +1 -0
- package/dist/__tests__/formStateSubscribe.test.d.ts +2 -0
- package/dist/__tests__/formStateSubscribe.test.d.ts.map +1 -0
- package/dist/__tests__/isPlainObject.test.d.ts +2 -0
- package/dist/__tests__/isPlainObject.test.d.ts.map +1 -0
- package/dist/__tests__/logic/appendErrors.test.d.ts +2 -0
- package/dist/__tests__/logic/appendErrors.test.d.ts.map +1 -0
- package/dist/__tests__/logic/createFormControl.test.d.ts +2 -0
- package/dist/__tests__/logic/createFormControl.test.d.ts.map +1 -0
- package/dist/__tests__/logic/generateId.test.d.ts +2 -0
- package/dist/__tests__/logic/generateId.test.d.ts.map +1 -0
- package/dist/__tests__/logic/getCheckboxValue.test.d.ts +2 -0
- package/dist/__tests__/logic/getCheckboxValue.test.d.ts.map +1 -0
- package/dist/__tests__/logic/getDirtyFields.test.d.ts +2 -0
- package/dist/__tests__/logic/getDirtyFields.test.d.ts.map +1 -0
- package/dist/__tests__/logic/getEventValue.test.d.ts +2 -0
- package/dist/__tests__/logic/getEventValue.test.d.ts.map +1 -0
- package/dist/__tests__/logic/getFieldValue.test.d.ts +2 -0
- package/dist/__tests__/logic/getFieldValue.test.d.ts.map +1 -0
- package/dist/__tests__/logic/getFieldValueAs.test.d.ts +2 -0
- package/dist/__tests__/logic/getFieldValueAs.test.d.ts.map +1 -0
- package/dist/__tests__/logic/getFocusFieldName.test.d.ts +2 -0
- package/dist/__tests__/logic/getFocusFieldName.test.d.ts.map +1 -0
- package/dist/__tests__/logic/getNodeParentName.test.d.ts +2 -0
- package/dist/__tests__/logic/getNodeParentName.test.d.ts.map +1 -0
- package/dist/__tests__/logic/getRadioValue.test.d.ts +2 -0
- package/dist/__tests__/logic/getRadioValue.test.d.ts.map +1 -0
- package/dist/__tests__/logic/getResolverOptions.test.d.ts +2 -0
- package/dist/__tests__/logic/getResolverOptions.test.d.ts.map +1 -0
- package/dist/__tests__/logic/getRuleValue.test.d.ts +2 -0
- package/dist/__tests__/logic/getRuleValue.test.d.ts.map +1 -0
- package/dist/__tests__/logic/getValidateError.test.d.ts +2 -0
- package/dist/__tests__/logic/getValidateError.test.d.ts.map +1 -0
- package/dist/__tests__/logic/getValidationModes.test.d.ts +2 -0
- package/dist/__tests__/logic/getValidationModes.test.d.ts.map +1 -0
- package/dist/__tests__/logic/getValueAndMessage.test.d.ts +2 -0
- package/dist/__tests__/logic/getValueAndMessage.test.d.ts.map +1 -0
- package/dist/__tests__/logic/hasPromiseValidation.test.d.ts +2 -0
- package/dist/__tests__/logic/hasPromiseValidation.test.d.ts.map +1 -0
- package/dist/__tests__/logic/hasValidation.test.d.ts +2 -0
- package/dist/__tests__/logic/hasValidation.test.d.ts.map +1 -0
- package/dist/__tests__/logic/isNameInFieldArray.test.d.ts +2 -0
- package/dist/__tests__/logic/isNameInFieldArray.test.d.ts.map +1 -0
- package/dist/__tests__/logic/isWatched.test.d.ts +2 -0
- package/dist/__tests__/logic/isWatched.test.d.ts.map +1 -0
- package/dist/__tests__/logic/iterateFieldsByAction.test.d.ts +2 -0
- package/dist/__tests__/logic/iterateFieldsByAction.test.d.ts.map +1 -0
- package/dist/__tests__/logic/schemaErrorLookup.test.d.ts +2 -0
- package/dist/__tests__/logic/schemaErrorLookup.test.d.ts.map +1 -0
- package/dist/__tests__/logic/shouldRenderFormState.test.d.ts +2 -0
- package/dist/__tests__/logic/shouldRenderFormState.test.d.ts.map +1 -0
- package/dist/__tests__/logic/shouldSubscribeByName.test.d.ts +2 -0
- package/dist/__tests__/logic/shouldSubscribeByName.test.d.ts.map +1 -0
- package/dist/__tests__/logic/skipValidation.test.d.ts +2 -0
- package/dist/__tests__/logic/skipValidation.test.d.ts.map +1 -0
- package/dist/__tests__/logic/unsetEmptyArray.test.d.ts +2 -0
- package/dist/__tests__/logic/unsetEmptyArray.test.d.ts.map +1 -0
- package/dist/__tests__/logic/validateField.test.d.ts +2 -0
- package/dist/__tests__/logic/validateField.test.d.ts.map +1 -0
- package/dist/__tests__/type.test.d.ts +2 -0
- package/dist/__tests__/type.test.d.ts.map +1 -0
- package/dist/__tests__/useController.test.d.ts +2 -0
- package/dist/__tests__/useController.test.d.ts.map +1 -0
- package/dist/__tests__/useFieldArray/append.test.d.ts +2 -0
- package/dist/__tests__/useFieldArray/append.test.d.ts.map +1 -0
- package/dist/__tests__/useFieldArray/focus.test.d.ts +2 -0
- package/dist/__tests__/useFieldArray/focus.test.d.ts.map +1 -0
- package/dist/__tests__/useFieldArray/insert.test.d.ts +2 -0
- package/dist/__tests__/useFieldArray/insert.test.d.ts.map +1 -0
- package/dist/__tests__/useFieldArray/move.test.d.ts +2 -0
- package/dist/__tests__/useFieldArray/move.test.d.ts.map +1 -0
- package/dist/__tests__/useFieldArray/prepend.test.d.ts +2 -0
- package/dist/__tests__/useFieldArray/prepend.test.d.ts.map +1 -0
- package/dist/__tests__/useFieldArray/remove.test.d.ts +2 -0
- package/dist/__tests__/useFieldArray/remove.test.d.ts.map +1 -0
- package/dist/__tests__/useFieldArray/replace.test.d.ts +2 -0
- package/dist/__tests__/useFieldArray/replace.test.d.ts.map +1 -0
- package/dist/__tests__/useFieldArray/swap.test.d.ts +2 -0
- package/dist/__tests__/useFieldArray/swap.test.d.ts.map +1 -0
- package/dist/__tests__/useFieldArray/update.test.d.ts +2 -0
- package/dist/__tests__/useFieldArray/update.test.d.ts.map +1 -0
- package/dist/__tests__/useFieldArray.test.d.ts +2 -0
- package/dist/__tests__/useFieldArray.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/clearErrors.test.d.ts +2 -0
- package/dist/__tests__/useForm/clearErrors.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/formState.test.d.ts +2 -0
- package/dist/__tests__/useForm/formState.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/getFieldState.test.d.ts +2 -0
- package/dist/__tests__/useForm/getFieldState.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/getValues.test.d.ts +2 -0
- package/dist/__tests__/useForm/getValues.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/handleSubmit.test.d.ts +2 -0
- package/dist/__tests__/useForm/handleSubmit.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/register.test.d.ts +2 -0
- package/dist/__tests__/useForm/register.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/reset.test.d.ts +2 -0
- package/dist/__tests__/useForm/reset.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/resetField.test.d.ts +2 -0
- package/dist/__tests__/useForm/resetField.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/resolver.test.d.ts +2 -0
- package/dist/__tests__/useForm/resolver.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/setError.test.d.ts +2 -0
- package/dist/__tests__/useForm/setError.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/setFocus.test.d.ts +2 -0
- package/dist/__tests__/useForm/setFocus.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/setValue.test.d.ts +2 -0
- package/dist/__tests__/useForm/setValue.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/subscribe.test.d.ts +2 -0
- package/dist/__tests__/useForm/subscribe.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/trigger.test.d.ts +2 -0
- package/dist/__tests__/useForm/trigger.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/unregister.test.d.ts +2 -0
- package/dist/__tests__/useForm/unregister.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/useFormWithNullValues.test.d.ts +2 -0
- package/dist/__tests__/useForm/useFormWithNullValues.test.d.ts.map +1 -0
- package/dist/__tests__/useForm/watch.test.d.ts +2 -0
- package/dist/__tests__/useForm/watch.test.d.ts.map +1 -0
- package/dist/__tests__/useForm.server.test.d.ts +2 -0
- package/dist/__tests__/useForm.server.test.d.ts.map +1 -0
- package/dist/__tests__/useForm.test.d.ts +2 -0
- package/dist/__tests__/useForm.test.d.ts.map +1 -0
- package/dist/__tests__/useFormContext.server.test.d.ts +2 -0
- package/dist/__tests__/useFormContext.server.test.d.ts.map +1 -0
- package/dist/__tests__/useFormContext.test.d.ts +2 -0
- package/dist/__tests__/useFormContext.test.d.ts.map +1 -0
- package/dist/__tests__/useFormState.test.d.ts +2 -0
- package/dist/__tests__/useFormState.test.d.ts.map +1 -0
- package/dist/__tests__/useWatch.test.d.ts +2 -0
- package/dist/__tests__/useWatch.test.d.ts.map +1 -0
- package/dist/__tests__/utils/append.test.d.ts +2 -0
- package/dist/__tests__/utils/append.test.d.ts.map +1 -0
- package/dist/__tests__/utils/cloneObject.test.d.ts +2 -0
- package/dist/__tests__/utils/cloneObject.test.d.ts.map +1 -0
- package/dist/__tests__/utils/compact.test.d.ts +2 -0
- package/dist/__tests__/utils/compact.test.d.ts.map +1 -0
- package/dist/__tests__/utils/convertToArrayPayload.test.d.ts +2 -0
- package/dist/__tests__/utils/convertToArrayPayload.test.d.ts.map +1 -0
- package/dist/__tests__/utils/createSubject.test.d.ts +2 -0
- package/dist/__tests__/utils/createSubject.test.d.ts.map +1 -0
- package/dist/__tests__/utils/deepEqual.test.d.ts +2 -0
- package/dist/__tests__/utils/deepEqual.test.d.ts.map +1 -0
- package/dist/__tests__/utils/deepMerge.test.d.ts +2 -0
- package/dist/__tests__/utils/deepMerge.test.d.ts.map +1 -0
- package/dist/__tests__/utils/extractFormValues.test.d.ts +2 -0
- package/dist/__tests__/utils/extractFormValues.test.d.ts.map +1 -0
- package/dist/__tests__/utils/fillEmptyArray.test.d.ts +2 -0
- package/dist/__tests__/utils/fillEmptyArray.test.d.ts.map +1 -0
- package/dist/__tests__/utils/flatten.test.d.ts +2 -0
- package/dist/__tests__/utils/flatten.test.d.ts.map +1 -0
- package/dist/__tests__/utils/get.test.d.ts +2 -0
- package/dist/__tests__/utils/get.test.d.ts.map +1 -0
- package/dist/__tests__/utils/insert.test.d.ts +2 -0
- package/dist/__tests__/utils/insert.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isBoolean.test.d.ts +2 -0
- package/dist/__tests__/utils/isBoolean.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isCheckBoxInput.test.d.ts +2 -0
- package/dist/__tests__/utils/isCheckBoxInput.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isEmptyObject.test.d.ts +2 -0
- package/dist/__tests__/utils/isEmptyObject.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isFileInput.test.d.ts +2 -0
- package/dist/__tests__/utils/isFileInput.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isFunction.test.d.ts +2 -0
- package/dist/__tests__/utils/isFunction.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isHTMLElement.test.d.ts +2 -0
- package/dist/__tests__/utils/isHTMLElement.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isKey.test.d.ts +2 -0
- package/dist/__tests__/utils/isKey.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isMultipleSelect.test.d.ts +2 -0
- package/dist/__tests__/utils/isMultipleSelect.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isNullOrUndefined.test.d.ts +2 -0
- package/dist/__tests__/utils/isNullOrUndefined.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isObject.test.d.ts +2 -0
- package/dist/__tests__/utils/isObject.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isPrimitive.test.d.ts +2 -0
- package/dist/__tests__/utils/isPrimitive.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isRadioInput.test.d.ts +2 -0
- package/dist/__tests__/utils/isRadioInput.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isRadioOrCheckbox.test.d.ts +2 -0
- package/dist/__tests__/utils/isRadioOrCheckbox.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isRegex.test.d.ts +2 -0
- package/dist/__tests__/utils/isRegex.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isString.test.d.ts +2 -0
- package/dist/__tests__/utils/isString.test.d.ts.map +1 -0
- package/dist/__tests__/utils/isUndefined.test.d.ts +2 -0
- package/dist/__tests__/utils/isUndefined.test.d.ts.map +1 -0
- package/dist/__tests__/utils/live.test.d.ts +2 -0
- package/dist/__tests__/utils/live.test.d.ts.map +1 -0
- package/dist/__tests__/utils/move.test.d.ts +2 -0
- package/dist/__tests__/utils/move.test.d.ts.map +1 -0
- package/dist/__tests__/utils/noop.test.d.ts +2 -0
- package/dist/__tests__/utils/noop.test.d.ts.map +1 -0
- package/dist/__tests__/utils/objectHasFunction.test.d.ts +2 -0
- package/dist/__tests__/utils/objectHasFunction.test.d.ts.map +1 -0
- package/dist/__tests__/utils/prepend.test.d.ts +2 -0
- package/dist/__tests__/utils/prepend.test.d.ts.map +1 -0
- package/dist/__tests__/utils/remove.test.d.ts +2 -0
- package/dist/__tests__/utils/remove.test.d.ts.map +1 -0
- package/dist/__tests__/utils/set.test.d.ts +2 -0
- package/dist/__tests__/utils/set.test.d.ts.map +1 -0
- package/dist/__tests__/utils/stringToPath.test.d.ts +2 -0
- package/dist/__tests__/utils/stringToPath.test.d.ts.map +1 -0
- package/dist/__tests__/utils/swap.test.d.ts +2 -0
- package/dist/__tests__/utils/swap.test.d.ts.map +1 -0
- package/dist/__tests__/utils/unset.test.d.ts +2 -0
- package/dist/__tests__/utils/unset.test.d.ts.map +1 -0
- package/dist/__tests__/utils/validationModeChecker.test.d.ts +2 -0
- package/dist/__tests__/utils/validationModeChecker.test.d.ts.map +1 -0
- package/dist/__tests__/watch.server.test.d.ts +2 -0
- package/dist/__tests__/watch.server.test.d.ts.map +1 -0
- package/dist/__tests__/watch.test.d.ts +2 -0
- package/dist/__tests__/watch.test.d.ts.map +1 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.mjs +147 -83
- package/dist/index.esm.mjs.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/logic/createFormControl.d.ts.map +1 -1
- package/dist/react-server.esm.mjs +28 -10
- package/dist/react-server.esm.mjs.map +1 -1
- package/dist/types/form.d.ts +0 -8
- package/dist/types/form.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/utils.d.ts +3 -2
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/types/watch.d.ts +32 -0
- package/dist/types/watch.d.ts.map +1 -0
- package/dist/useController.d.ts.map +1 -1
- package/dist/useFieldArray.d.ts.map +1 -1
- package/dist/useForm.d.ts.map +1 -1
- package/dist/useFormContext.d.ts.map +1 -1
- package/dist/useFormControlContext.d.ts +12 -0
- package/dist/useFormControlContext.d.ts.map +1 -0
- package/dist/useFormState.d.ts.map +1 -1
- package/dist/watch.d.ts +2 -21
- package/dist/watch.d.ts.map +1 -1
- package/package.json +32 -33
package/dist/index.esm.mjs
CHANGED
|
@@ -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
|
-
*
|
|
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
|
|
130
|
+
const HookFormControlContext = React.createContext(null);
|
|
131
|
+
HookFormControlContext.displayName = 'HookFormControlContext';
|
|
159
132
|
/**
|
|
160
|
-
*
|
|
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
|
|
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
|
|
247
|
-
const { control =
|
|
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()
|
|
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
|
|
348
|
-
const { control =
|
|
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
|
|
442
|
-
const { name, disabled, control =
|
|
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)
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
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
|
-
|
|
2203
|
-
|
|
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
|
|
2525
|
-
const { control =
|
|
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 = (
|
|
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
|