'ES6, React and Formik Returning SetSubmitting

I have a problem here on setting the setSubmitting function of formik. Basically, I have three conditions on submit depending on the formik.values...

The problem is the setSubmitting is already firing once I click the the submit button so I think I need to return a success response on both onCreateProduct or confirmOverwriteProduct so I can successfully set the setSubmitting to false.

My problem is how can I do it since both onCreateProduct or confirmOverwriteProduct is on a different component.

Index.js

const Index = () => {
  const confirmOverwriteProduct = (overwriteDataToSubmit) => {
    dispatch(
      overwriteProduct({
        data: overwriteDataToSubmit,
        callback: function (result) {
          if (result === "error") {
            setSelectedDetails({
              content: "Error overwriting!",
              status: "error",
            });
            setOpenSnackbar(true);
          }
          if (result === "success") {
            setSelectedDetails({
              content: "Overwritten successfully!",
              status: "success",
            });
            setOpenSnackbar(true);
          }
        },
      })
    );
    setConfirmationDialog(false);
  };

  const onCreateProduct = (createProductDataToSubmit) => {
    dispatch(
      createProduct({
        data: createProductDataToSubmit,
        callback: function (result) {
          if (result === "error") {
            setSelectedDetails({
              content: "Error creating product!",
              status: "error",
            });
            setOpenSnackbar(true);
          }
          if (result === "success") {
            setSelectedDetails({
              content: "Product created successfully!",
              status: "success",
            });
            setOpenSnackbar(true);
          }
        },
      })
    );
    setConfirmationDialog(false);
  };

  return <Product />;
};

export default Index;

Product.js

const Product = () => {


  const formik = useFormik({
    initialValues: {
      productCode: product?.productCode || "",
      productImages: product?.productImages || [],
    },
    enableReinitialize: true,
    validationSchema: productSchema,
    onSubmit: (values, { setSubmitting }) => {
      const overwriteDataToSubmit = {
        productIndex,
        imageSlotMap: values.productImages?.map(
          ({ pk = "", newContentSlot = "" }) => ({
            pk,
            slotNumber: newContentSlot,
          })
        ),
      };

      const createProductDataToSubmit = {
        productIndex,
        imageSlotMap: values.productImages?.map(
          ({ pk = "", newContentSlot = "" }) => ({
            pk,
            slotNumber: newContentSlot,
          })
        ),
        ean: values?.productCode
      };


      if (formik.values.productStatusAfterAction)
        return confirmOverwriteProduct(overwriteDataToSubmit);

      if (formik.values.productExisting)
        return confirmOverwriteProduct(overwriteDataToSubmit);

      if (!formik.values.productExisting)
        return onCreateProduct(createProductDataToSubmit);

      setSubmitting(false);
    },
  });

  return ...else.

}

export default Product


Solution 1:[1]

When you return a Promise you don't have to explicitly reset isSubmitting()

const Parent = () => {
  const simpleTimeoutPromise = () =>
    new Promise((res) => {
      setTimeout(() => res("result"), 1000);
    });

  return (
    <Child simpleTimeoutPromise={simpleTimeoutPromise} />
  );
};

const Child = ({ simpleTimeoutPromise }) => (
  <Formik
    initialValues={{ input: "" }}
    onSubmit={(values) => simpleTimeoutPromise()}
  >
    {({ handleChange, values, isSubmitting, handleSubmit }) => (
       <form onSubmit={handleSubmit}>
          <label htmlFor="input">input</label>
          <input
            type="text"
            value={values.input}
            onChange={handleChange}
          />
          <button type="submit" disabled={isSubmitting}>
            Submit
          </button>
        </form>
     )}
  </Formik>
);

More details and test methods in this codesandbox

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 jolo