Как я могу проверить два часа с Yup? - PullRequest
1 голос
/ 21 июня 2019

У меня есть схема проверки формы Formik в React Native с использованием Yup.Есть два поля (start_time и end_time), и я хочу сравнить, если start_time после end_time и выдал сообщение пользователю.

Я прочитал о mixed.when и пытался найти решение с этим, но я заблокирован им.

const isSameOrAfterTime = (startTime, endTime) =>
  moment(startTime, HOUR_MINUTE_SECONDS_MASK).isSameOrAfter(endTime);

// example - data
// start_time: 08:00:25
// end_time: 10:23:42

start_time: Yup.string().when(['start_time', 'end_time'], {
    is: (startTime, endTime) => isSameOrAfterTime(startTime, endTime),
    then: Yup.string() // ???
    otherwise: // ????
  }),

Я хочу выбросить сообщение, когда start_time после end_time

Edit rough-currying-t9n88

1 Ответ

2 голосов
/ 22 июня 2019

Используйте yup.test вместо.

https://github.com/jquense/yup#mixedtestname-string-message-string--function-test-function-schema


const SignupSchema = Yup.object().shape({
  // (end_time, screma, self)
  start_time: Yup.string()
  .test(
    'not empty',
    'Start time cant be empty',
    function(value) {
      return !!value;
    }
  )
  .test(
    "start_time_test",
    "Start time must be before end time",
    function(value) {
      const { end_time } = this.parent;
      return isSameOrBefore(value, end_time);
    }
  ),
  end_time: Yup.string()
});

const isSameOrBefore = (startTime, endTime) => {
  return moment(startTime, 'HH:mm').isSameOrBefore(moment(endTime, 'HH:mm'));
}

https://codesandbox.io/s/awesome-johnson-vdueg

...