Yup to validate on the base of function dispatch

Viewed 34

I Want to Make Validation optional for only password and confirm password in the case when updateUser action Dispatch

How can I stop the validation for a specific user action call? this is the yup schema

const RegisterSchema = Yup.object().shape({
    code: Yup.string()
        .required("Employee Code is required!")
        .max(8, "Employee Code should not exceed 8 characters")
        .matches(/^[0-9]+$/, "Only number are allowed for this field"),
    firstName: Yup.string()
        .required("First name is required!")
        .max(16, "First name should not exceed 16 characters")
        .required("First name is required")
        .matches(/^[aA-zZ]+$/, "Invalid First name"),
    lastName: Yup.string()
        .required("Last name is required!")
        .max(16, "Last name should not exceed 16 characters")
        .required("Last name is required")
        .matches(/^[aA-zZ]+$/, "Invalid Last name"),
    userName: Yup.string()
        .required("User name is required")
        .matches(/^[^\s]+(\s+[^\s]+)*$/, "Invalid User name")
        .max(16, "User name should not exceed 16 characters"),
    address: Yup.string()
        .required("Address is required")
        .matches(/^[^\s]+(\s+[^\s]+)*$/, "Invalid Address"),
    role: Yup.mixed().required("Role is required!"),
    desigination: Yup.mixed().required("Desigination is required!"),
    department: Yup.mixed().required("Department is required!"),
    date: Yup.mixed().required("Date is required"),
    city: Yup.mixed().required("City name is required"),
    country: Yup.mixed().required("Country name is required"),
    phone: Yup.string()
        .matches(
            /^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\\\\/]?)?((?:\(?\d{1,}\)?[\-\.\\\\/]?){0,})(?:[\-\.\\\\/]?(?:#|ext\.?|extension|x)[\-\.\\\\/]?(\d+))?$/i,
            "Phone number should be numeric only!"
        )
        .required("Phone number is required")
        .min(10, "Phone number must be at least 10 characters")
        .max(10, "Phone number must be at least 10 characters"),

    email: Yup.string()
        .email("Email must be a valid email address")
        .required("Email is required"),
    password: Yup.string().when("check", {
        is: (check) => true,
        then: Yup.string()
            .required("Password is required")
            .matches(
                /^(?=(?:.*[A-Z].*){1})(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$/,
                "Must Contain 8 Characters,  One Uppercase, One Lowercase, One Number and one special case Character"
            ),
        // otherwise:
    }),
    confirmPassword: Yup.string().when("check", {
        is: (check) => true,
        then: Yup.string()
            .required("Confirm Password is required")
            .oneOf([Yup.ref("password"), null], "Passwords must match"),
        // otherwise:
    }),
});

I tried using When is condition to make it work but it only happens to work with a boolean attribute

const formik = useFormik({
    enableReinitialize: true,
    initialValues: userDetail,
    validationSchema: RegisterSchema,
    onSubmit: async (values) => {
        let roleName: any = [];
        values.role.forEach((role) => {
            roleName.push(role.label);
        });

        let x: any = location.state;
        if (location.state !== undefined) {
            await dispatch(
                updateUser({
                    id: x.userId,
                    firstName: values.firstName,
                    lastName: values.lastName,
                    userName: values.userName,
                    desigination: values.desigination.value,
                    department: values.department.value,
                    role: roleName ? roleName : roles[0],
                    date: values.date,
                    address: values.address,
                    city: values.city,
                    country: values.country,
                    email: values.email,
                    password: values.password,
                    confirmPassword: values.confirmPassword,
                    phone: values.phone,
                    code: values.code,
                })
            );
        } else {
            await dispatch(
                addUser({
                    firstName: values.firstName,
                    lastName: values.lastName,
                    userName: values.userName,
                    desigination: values.desigination.value,
                    department: values.department.value,
                    role: roleName ? roleName : roles[0],
                    date: values.date,
                    address: values.address,
                    city: values.city,
                    country: values.country,
                    email: values.email,
                    password: values.password,
                    confirmPassword: values.confirmPassword,
                    phone: values.phone,
                    code: values.code,
                })
            );
        }
    },
});
0 Answers
Related