I created a customer registration form, but all my "messages" from my "errors" are coming as required. Does anyone know what it could be? Something I set up wrong in zod or react-hook-form. Below I will leave the prints of the code.
This is my generic input component:
import { DetailedHTMLProps, InputHTMLAttributes } from 'react'
interface InputProps
extends DetailedHTMLProps<
InputHTMLAttributes<HTMLInputElement>,
HTMLInputElement
> {
label: string
error?: string
}
export const Input = ({ error, label, ...rest }: InputProps) => {
return (
<div className="flex flex-col">
<label
className="mb-2 block text-sm font-bold text-zinc-700"
htmlFor={rest.id}
>
{label}
</label>
<input
type="text"
className={`appearance-none rounded-md border border-zinc-300 px-3 py-2 leading-tight shadow-sm focus:border-zinc-500 focus:outline-none
${error ? 'border-red-500' : 'border-zinc-300'}`}
{...rest}
/>
{error && <span className="text-xs text-red-500">{error}</span>}
</div>
)
}
And here is where I created my schema and where I am using this generic input component inside the form:
import { Input } from '../Input'
import { Modal } from '../Modal'
import { z } from 'zod'
import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
interface ClientRegistrationModalProps {
isOpen: boolean
onClose: () => void
}
const createUserFormSchema = z.object({
name: z
.string()
.min(2, 'Password must be at least 2 characters long')
.transform((name) =>
name
.trim()
.split(' ')
.map((word) => {
return word[0].toLocaleUpperCase().concat(word.substring(1))
})
.join(' '),
),
email: z
.string()
.email('Invalid e-mail format')
.nonempty('E-mail is required'),
birthdate: z.string().nonempty('Date of birth is mandatory'),
cpf: z.string().length(11, 'CPF mus have 11 digits'),
})
type CreateUserFormData = z.infer<typeof createUserFormSchema>
export const ClientRegistrationModal = ({
isOpen,
onClose,
}: ClientRegistrationModalProps) => {
const {
register,
handleSubmit,
formState: { errors, isSubmitting },
reset,
} = useForm<CreateUserFormData>({
mode: 'all',
resolver: zodResolver(createUserFormSchema),
})
// High-order function
function createUser(data: CreateUserFormData) {
console.log(data)
}
function resetForm() {
onClose()
reset()
}
console.log(errors)
return (
<Modal title="Cadastro de Cliente" isOpen={isOpen} onClose={resetForm}>
<form onSubmit={handleSubmit(createUser)}>
<div className="flex flex-col space-y-6">
<Input
label="Nome"
type="text"
id="name"
placeholder="Enter your name"
{...register('name')}
error={errors.name?.message}
/>
<Input
label="Email"
type="email"
id="email"
placeholder="Enter your e-mail"
{...register('email')}
error={errors.email?.message}
/>
<Input
label="Data de Nascimento"
type="date"
id="birthdate"
{...register('birthdate')}
error={errors.birthdate?.message}
/>
<Input
label="CPF"
type="text"
id="cpf"
placeholder="Enter your CPF"
{...register('cpf')}
error={errors.cpf?.message}
/>
</div>
<div className="mt-4 flex items-center justify-between">
<button
className="mt-4 rounded bg-green-500 px-4 py-2 font-bold text-white transition-all ease-in hover:bg-green-700"
type="submit"
>
Cadastrar
</button>
<button
type="reset"
className="mt-4 rounded bg-zinc-500 px-4 py-2 font-bold text-white transition-all ease-in hover:bg-zinc-700"
onClick={resetForm}
disabled={isSubmitting}
>
Cancelar
</button>
</div>
</form>
</Modal>
)
}
The problem here is, when I give console.log(errors), my errors are all as "Required", that is, they are not showing the error messages that I set inside my schema.
I don't know what could be wrong and would like some help. Maybe it's some typing issue or something I configured wrong. I appreciate any help.
Instead of using that:
name: z.string().min(2, 'The name needs at least 2 characters')
I used this:
name: z.string().min(2,{ message: 'The name needs at least 2 characters' })
But it didn't work.
