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.
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)
})