diff --git a/.changeset/afraid-garlics-destroy.md b/.changeset/afraid-garlics-destroy.md new file mode 100644 index 000000000..153662ffe --- /dev/null +++ b/.changeset/afraid-garlics-destroy.md @@ -0,0 +1,5 @@ +--- +'formik': major +--- + +Feat: Improve onReset to get the new values provided by resetForm diff --git a/docs/api/formik.md b/docs/api/formik.md index 9fa07f3a4..d9b38e58d 100644 --- a/docs/api/formik.md +++ b/docs/api/formik.md @@ -380,10 +380,10 @@ an input from uncontrolled to controlled. Note: `initialValues` not available to the higher-order component, use `mapPropsToValues` instead. -### `onReset?: (values: Values, formikBag: FormikBag) => void` +### `onReset?: (values: Values, formikBag: FormikBag, initialValues: Values) => void` Your optional form reset handler. It is passed your forms `values` and the -"FormikBag". +"FormikBag" and the `initialValues`. ### `onSubmit: (values: Values, formikBag: FormikBag) => void | Promise` diff --git a/packages/formik/src/Formik.tsx b/packages/formik/src/Formik.tsx index ea36e80d3..24ec2ee4a 100755 --- a/packages/formik/src/Formik.tsx +++ b/packages/formik/src/Formik.tsx @@ -406,7 +406,8 @@ export function useFormik({ if (props.onReset) { const maybePromisedOnReset = (props.onReset as any)( state.values, - imperativeMethods + imperativeMethods, + values ); if (isPromise(maybePromisedOnReset)) { diff --git a/packages/formik/src/types.tsx b/packages/formik/src/types.tsx index 71db6792c..6ca58c5a0 100644 --- a/packages/formik/src/types.tsx +++ b/packages/formik/src/types.tsx @@ -214,7 +214,7 @@ export interface FormikConfig extends FormikSharedConfig { /** * Reset handler */ - onReset?: (values: Values, formikHelpers: FormikHelpers) => void; + onReset?: (values: Values, formikHelpers: FormikHelpers, initialValues?: Values) => void; /** * Submission handler diff --git a/packages/formik/test/Formik.test.tsx b/packages/formik/test/Formik.test.tsx index 864589643..f83e301ae 100644 --- a/packages/formik/test/Formik.test.tsx +++ b/packages/formik/test/Formik.test.tsx @@ -1009,7 +1009,39 @@ describe('', () => { setSubmitting: expect.any(Function), setTouched: expect.any(Function), setValues: expect.any(Function), - }) + }), + InitialValues + ); + }); + + it('should call onReset with values and actions and initialValues when form is reset with values', () => { + const onReset = jest.fn(); + const { getProps } = renderFormik({ + initialValues: InitialValues, + onSubmit: noop, + onReset, + }); + + const NewInitialValues = { name: 'jared', age: 31,} + + act(() => { + getProps().resetForm({values: NewInitialValues}); + }); + + expect(onReset).toHaveBeenCalledWith( + InitialValues, + expect.objectContaining({ + resetForm: expect.any(Function), + setErrors: expect.any(Function), + setFieldError: expect.any(Function), + setFieldTouched: expect.any(Function), + setFieldValue: expect.any(Function), + setStatus: expect.any(Function), + setSubmitting: expect.any(Function), + setTouched: expect.any(Function), + setValues: expect.any(Function), + }), + NewInitialValues ); });