0

My form submits to backend, but does not validate on the server-side.

Here is the schema and the object it is based on:

const createEmployeeSchema = yup.object().shape({
    name: yup.string().max(100).required(),
    social: yup.object().shape({
        facebook: yup.string().required(),
        instagram: yup.string().required(),
    })
})

type CreateEmployeeDTO = {
    name: string
    social: {
        facebook: string
        instagram: string
    }
}

Here is the CreateEmployee form:

export const CreateEmployee = () => {
    const createEmployeeQuery = useCreateEmployeeQuery()

    return (
        <Form<CreateEmployeeDTO, typeof createEmployeeSchema>
            id="create-employee"
            onSubmit={async (values) => {

                createEmployeeQuery.mutateAsync(values)
            }}
            schema={createEmployeeSchema}
        >
            {(methods) => (
                <>
                    <Typography fontWeight={600}>Employee Information</Typography>
                    <TextFieldMUI standard small name={'name'} label={'Name'} />
                    <TextFieldMUI standard small name={'social.facebook'} label={'Facebook'} />
                    <TextFieldMUI standard small name={'social.instagram'} label={'Instagram'} />
                    <Button>Submit</Button>
                </>
            )}
        </Form>
    )
}

Here is the wrapper <Form>:

import { yupResolver } from '@hookform/resolvers/yup';
import clsx from 'clsx';
import * as React from 'react';
import { FormProvider, SubmitHandler, UseFormProps, UseFormReturn, useForm } from 'react-hook-form';
import * as yup from 'yup';


type FormProps<TFormValues, Schema> = {
  className?: string;
  onSubmit: SubmitHandler<TFormValues>;
  children: (methods: UseFormReturn<TFormValues>) => React.ReactNode;
  options?: UseFormProps<TFormValues>;
  id?: string;
  schema?: Schema;
};

export const Form = <
  TFormValues extends Record<string, unknown> = Record<string, unknown>,
  Schema extends yup.ObjectSchema<yup.AnyObject> = yup.ObjectSchema<yup.AnyObject>
>({
  onSubmit,
  children,
  className,
  options,
  id,
  schema,
}: FormProps<TFormValues, Schema>) => {
  const methods = useForm<TFormValues>({ ...options, resolver: schema && yupResolver(schema) });
  return (
    <FormProvider {...methods} >
      <form
        className={clsx('space-y-6', className)}
        onSubmit={methods.handleSubmit(onSubmit)}
        id={id}
      >
        {children(methods)}
      </form>
    </FormProvider>
  );
};

'name' successfully validates. 'social.facebook' and 'social.instagram' do not validate.

I suspect this has to do with this portion of the <Form> component: Schema extends yup.ObjectSchema<yup.AnyObject> = yup.ObjectSchema<yup.AnyObject>

Paul
  • 25
  • 4

0 Answers0