Как проверить минимальный возраст с Yup?

Я создал некоторые регистрации Schema

 export const registrationSchema = (translate) => Yup.object().shape({
  //... other properties that are validated.
  //       for example username
    username: Yup.string()
    .min(6, translate('validation:common.username.min', { min: 6 }))
    .max(20, translate('validation:common.username.max', { max: 20 }))
    .required(translate('validation:common.username.required')),
     DOB: Yup.lazy(value => {
        console.log('yup', value);
        if (moment().diff(moment(value), 'years') < 18)
          // Here return DOB error somehow
      })
    ...

и до сих пор это работает как шарм. Но теперь мне нужно проверить, если пользователю минимум 18 лет. Я получаю DateOfBirth от выбора даты, и я могу проверить, не меньше ли он 18 с момента.

if(moment().diff(moment(date),'years) < 18)

и это значение даты, которое я получил при использовании Yup.lazy, но не знаю, как выдать ошибку проверки, если до 18 лет -display это в поле DOB. Я даже не знаю, правильно ли я использую метод YUP. Я хотел использовать yup.date(). но как получить выбранную дату внутри схемы, чтобы проверить, действительно ли это возраст.

3 ответа

Решение

Ты можешь использовать Yup.string как это:

Yup.string().test(
  "DOB",
  "error message",
  value => {
    return moment().diff(moment(value),'years') >= 18;
  }
)

если тестовая функция возвращает true, поля проходят тест. Иначе ошибка установлена.

Начиная с ответа Baboo, используя date-dns:

      import differenceInYears from 'date-fns/differenceInYears';


yup
    .string()
    .required('DOB is required')
    .test('DOB', 'You must be adult', value => {
      return differenceInYears(new Date(), new Date(value)) >= 18;
    })

Другие вопросы по тегам