После многих головных болей и царапин на голове я, наконец, нашел решение, не делая вещи уродливыми.Спасибо коллеге-разработчику за это решение.Первоначальной идеей было установить флажок по нажатию кнопки и условно проверить поля.(PS: я использую проверки на уровне поля).Однако проблема заключалась в том, что проверки выполняются ПЕРЕД настройкой флага, поскольку обработчик onClick не будет срабатывать до того, как все проверки будут исправлены, и эта логика скрыта глубоко внутри избыточных форм (льготы, излишне усложняющие простые вещи с помощью библиотеки).).
Вот решение:
обработчик отправки
handleSubmit() {
const { bookingCreate, modalShow, navigateTo } = this.props;
const { isDraftAction } = this.state; // my flag
// create record!
return bookingCreate(isDraftAction)
.then(responsePayload => {
...
})
.catch(handleSubmissionError);
}
isDraftAction
- это флаг, который устанавливается (in local state)
, когдадействие вызывается на onClick
обеих кнопок.
Мои условные проверки уровня поля
<Field
name="date"
component={DateFormField}
validate={isDraftAction && [validateRequiredText]}
fullWidth
helpText="blablabla"
/>
<Field
name="title"
component={TextFormField}
normalizeOnBlur={normalizeTextOnBlur}
validate={!isDraftAction && [validateRequiredText]}
fullWidth
helpText="blablabla"
/>
Мои 2 кнопки для СОХРАНИТЬ ЗАПИСЬ и ОТПРАВИТЬ ЗАПИСЬ.
const submit = handleSubmit(values => onSubmit()); // this is redux-form's submit handler which will in-turn call my own submit handler defined above. (That's where the library hides all the logic and makes developer helpless)
<RaisedButton
label={submitting && isDraft ? 'Saving Draft...' : 'Save Draft'}
type="button"
onClick={() => {
this.props.dispatchAction({ draftAction: true }).then(() => {
submit();
});
}}
disabled={submitting}
primary
/>
<RaisedButton
label={submitting && !isDraft ? 'Submitting Brief...' : 'Submit Brief'}
type="button"
onClick={() => {
this.props.dispatchAction({ draftAction: false }).then(() => {
submit();
});
}}
disabled={submitting}
primary
/>
dispatchAction()
- это моя функция действия, которая ПЕРВЫМ установит флаг в значение true / false, ТО затем вызовите встроенный обработчик отправки в избыточных формах.Кроме того, я извлек обработчик отправки избыточной формы, как указано выше, только для большей ясности.
dispatchAction ()
dispatchAction={({ draftAction }) =>
new Promise(resolve => {
this.setState({ isDraftAction: draftAction }, resolve);
})
}