Check out our talk at Remix Conf!

onSubmit mode

In this example, client-side validations will happen only when the user submits the form. For performance reasons, that's our default behavior.

const schema = z.object({
  firstName: z.string().nonempty(),
  email: z.string().nonempty().email(),

const mutation = makeDomainFunction(schema)(async (values) => values)

export const action: ActionFunction = async ({ request }) =>
  formAction({ request, schema, mutation })

export default () => <Form schema={schema} mode="onSubmit" />