npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@uplift-ltd/formik

v5.0.0

Published

Helpers for dealing with formik.

Downloads

72

Readme

@uplift-ltd/formik

Installation

npm i --save @uplift-ltd/formik

API

EnhancedFormik / useEnhancedFormik

These wrappers do a few things:

  • handle reporting errors
  • adds initialStatus for form errors
  • adds setFormSuccess and setFormError helpers
  • adds applyErrorsToFields helper

EnhancedFormik

import { EnhancedFormik } from "@uplift-ltd/formik";

<EnhancedFormik<FormValues>
  resetStatusOnSubmit
  captureException={captureException}
  onSubmit={() => {
    throw new Error("I get reported through captureException and set to status.formError");
  }}
/>;

useEnhancedFormik

import { useEnhancedFormik } from "@uplift-ltd/formik";

const formik = useEnhancedFormik<FormValues>({
  initialValues: {
    message: "",
  },
  validationSchema: yup.object().shape({
    message: yup.string().required("You must supply a message."),
  }),
  resetStatusOnSubmit: true,
  onSubmit: async (values) => {
    await someMutation({
      variables: {
        message: values.message,
      },
    });
  },
});

setFormSuccess / setFormError

Note that setFormError accepts a captureExceptionResult as the second property, which will be available on form status.

You can use Sentry.showReportDialog(status.captureExceptionResult) to show a report error dialog to the user.

import { EnhancedFormik } from "@uplift-ltd/formik";
import { captureException } from "@sentry/remix";

<EnhancedFormik<FormValues>
  captureException={captureException}
  onSubmit={async (values, { setFormSuccess, setFormError }) => {
    try {
      const { data } = await someMutation();
      if (!data?.someMutation?.success) {
        throw new Error(
          data?.someMutation?.message || "Failed to do _blank_. Please try again later."
        );
      }
      setFormSuccesss("You did it!");
    } catch (err) {
      const sentryEventId = Sentry.captureExpection(err);
      setFormError(err.message, sentryEventId);
    }
  }}
>
  {({ status }) => (
    <>
      {status.formError && (
        <div>
          {status.formError}
          {status.captureExceptionResult && (
            <button
              type="button"
              onClick={() => Sentry.showReportDialog(status.captureExceptionResult)}
            >
              Report Error
            </button>
          )}
        </div>
      )}
    </>
  )}
</EnhancedFormik>;

applyErrorsToFields

import { EnhancedFormik } from "@uplift-ltd/formik";

<EnhancedFormik<FormValues>
  onSubmit={async (values, { applyErrorsToFields }) => {
    const { data } = await someMutation();
    if (!data?.someMutation?.success) {
      if (data?.someMutation?.errors?.length) {
        // data.someMutation.errors should be of shape { field: string; messages: string[] }
        // this is the common shape returned by uplift_core via graphene for field-level errors
        applyErrorsToFields(data.someMutation.errors);
        // Now formik fields will show the errors for the correct fields (assuming FE and BE field names match)
      }
    }
  }}
/>;

applyErrorsToFields also accept a second optional argument of form { mapFieldName }. It is a function used when the FE and BE field names don't match.

applyErrorsToFields(errors || [], {
  mapFieldName: (field) => (field in FieldMap ? FieldMap[field] : field),
});

EnhancedField / useEnhancedField

Enhancement that allows you to hide field errors when the input gains focus. It does this by setting meta.touched to false.

EnhancedField

import { EnhancedField } from "@uplift-ltd/formik";

const MyField = ({ label, ...props }) => {
  console.log(Object.keys(field));
  // ['onBlur', 'onChange', 'onFocus', 'value', ...]
  //                        ^ our enhancement to track focus and clear touched status

  return (
    <EnhancedField hideErrorsOnFocus>
      {({ field, meta }) => {
        console.log(Object.keys(field));
        // ['onBlur', 'onChange', 'onFocus', 'value', ...]
        //                        ^ our enhancement to track focus and clear touched status

        return (
          <label>
            {label}
            <input {...field} />
            {meta.touched && meta.error && <p>{meta.error}</p>}
          </label>
        );
      }}
    </EnhancedField>
  );
};

useEnhancedField

import { useEnhancedField } from "@uplift-ltd/formik";

const MyField = ({ label, ...props }) => {
  const [field, meta] = useEnhancedField<string>({
    hideErrorsOnFocus: true,
    ...props,
  });

  console.log(Object.keys(field));
  // ['onBlur', 'onChange', 'onFocus', 'value', ...]
  //                        ^ our enhancement to track focus and clear touched status

  return (
    <label>
      {label}
      <input {...field} {...props} />
      {meta.touched && meta.error && <p>{meta.error}</p>}
    </label>
  );
};

useEnhancedFormikContext

import { useEnhancedFormikContext } from "@uplift-ltd/formik";

const MyField = ({ label, ...props }) => {
  const { setFormStatus, setFormError, applyErrorsToFields } =
    useEnhancedFormikContext<FormValues>();
  return <button onClick={() => setFormError("NEIN!")}>No</button>;
};