TanStack / form

🤖 Powerful and type-safe form state management for the web. TS/JS, React Form, Solid Form, Lit Form and Vue Form.
https://tanstack.com/form
MIT License
3.62k stars 325 forks source link

Unable to display Validation Messages with Zod in Next.js #861

Open mariusraupach opened 1 month ago

mariusraupach commented 1 month ago

Describe the bug

I am encountering an issue in my Next.js project where I am unable to display validation messages. Although the field.form.state.errors property correctly contains the errors, the field.state.meta.errors property is empty. For validation, I am using Zod.

Your minimal, reproducible example

https://codesandbox.io/p/github/mariusraupach/curly-fiesta/main?import=true&embed=1

Steps to reproduce

  1. Enter a value that is not an email address into the input field.

Expected behavior

As a user, I expected to see a validation message indicating that the value must be an email address.

How often does this bug happen?

None

Screenshots or Videos

No response

Platform

TanStack Form adapter

None

TanStack Form version

0.26.4

TypeScript version

5.5.3

Additional context

No response

stijnvanderlaan commented 1 month ago

Same issue here

mariusraupach commented 1 month ago

@stijnvanderlaan

I resolved the issue by adding the following code to the form.Field:

validators={{
  onChange: userSchema.shape.email,
}}

The updated field now looks like this:

<form.Field
  name="email"
  children={(field) => {
    console.log(field.state.meta.errors);
    console.log(field.form.state.errors);

    return (
      <>
        <label htmlFor={field.name}>{field.name}</label>
        <input
          onChange={(event) => field.handleChange(event.target.value)}
          type="email"
        />
        <>
          {field.state.meta.isTouched && field.state.meta.errors.length ? (
            <em>{field.state.meta.errors.join(",")}</em>
          ) : null}
          {field.state.meta.isValidating ? "Validating..." : null}
        </>
      </>
    );
  }}
  validators={{
    onChange: userSchema.shape.email,
  }}
/>;

However, if I understand the maintainer correctly, this is a bug and the mapping should occur automatically. Nevertheless, it would be very helpful to include a “how-to” in the documentation for using a Zod schema.

Balastrong commented 1 month ago

Validation can be defined at field or form level as mentioned in the docs so each field needs its validator as of today.

However, we're planning to expand the feature with #656 soon

stijnvanderlaan commented 1 month ago

@mariusraupach tnx! that works! @Balastrong great!