reactjsformikyup

How to access a Yup object's parent?


I have a Formik using a Yup validation schema that looks like this:

const validationSchema = Yup.object({
        name: Yup.object({
            first: Yup.string(),
            last: Yup.string(),

            isNameUnknown: Yup.boolean()
        }) 
          // tests using isNameUnknown here, not important

        idNumber: Yup.object({
            number: Yup.number()
            label: Yup.string()
        })

I need to make idNumber number and label required unless isNameUnknown is true. I tried:

.when("name.isNameUnknown", (unknown, schema) => {
    if (unknown) { return schema.optional() } else { return schema.required() }
}),

as well as calling "parent.name.isNameUnknown", but I am always getting undefined.

How can I access the value of isNameUnknown? I've been having difficulty searching for solutions and I cannot fully understand the Yup documentation.


Solution

  • I ended up finding the solution by using test and testContext.

    idNumber: Yup.object({
            number: Yup.number(),
            label: Yup.string()
        })
            .test("", "ID is required", (value, testContext) => {
                let unknown = testContext.parent.name.isNameUnknown
    
                if (!unknown) {
                    testContext.schema.fields.number.required()
                    testContext.schema.fields.label.required()
                }
                
                return unknown || (!unknown && value.number && value.label)
            })