Купон ставки
Собирает пользовательский draft ставки и показывает server-authoritative quote перед подтверждением.
Состояния, которые видит пользователь
Иллюстрация по теме
Визуальный ориентир помогает быстрее считать сценарий страницы и не оставлять компонент абстрактным.

Граница данных
| Inputs | selection ids, stake draft, account context |
|---|---|
| Outputs | quote request, placement command, visible validation |
| Failure mode | stale quote, out-of-order response, unknown placement outcome |
| Ownership | UI владеет представлением и recoverable context; финальное бизнес-состояние подтверждает серверный контракт. |
Что важно в реализации
Компонент считается самостоятельной границей только если команда может назвать его входы, выходы и невозможные состояния. Если он требует читать provider-specific поля напрямую или хранит финальный статус операции только локально, граница выбрана слишком поздно.
При изменении контракта сначала обновляется state model и совместимость, затем визуальный слой. Это уменьшает риск ситуации, когда новый UI уже ожидает поле или статус, которого старая версия API не гарантирует.
Связанные разборы
Проверки перед релизом
- После reload восстанавливается только draft; старая цена не считается подтверждённой.
- Два quote-ответа, пришедшие не по порядку, не откатывают UI к старой версии.
- Повторный tap во время placing не создаёт вторую команду.
- Reprice визуально отделён от обычного изменения локального input.
- При unknown outcome UI сверяет server state до разрешения нового placement.
- Focus после server reject остаётся в контексте ошибки и доступен с клавиатуры.
Почему купон ставки — отдельная граница
Локальный draft повышает отзывчивость, но authority для цены и допустимости остаётся на сервере. Поэтому компонент должен уметь жить с конфликтом между тем, что пользователь собрал, и тем, что сейчас разрешено выполнить.
При review команда проверяет не название компонента, а его инварианты: какие данные он имеет право считать финальными, что обязан показать при деградации и как возвращается в согласованное состояние после сбоя.
Что проверить на длинной сессии
Соберите draft, получите quote, измените сумму, дождитесь нового ответа и перезагрузите страницу. После восстановления Betslip может вернуть selections и локальную сумму, но обязан заново подтвердить цену и допустимость. Затем повторите сценарий с двумя quote-ответами, пришедшими не по порядку.
Граница компонента считается устойчивой, если любое server-authoritative изменение переводит его в понятное состояние, а не заставляет отдельные поля формы самостоятельно решать, какой ответ «главнее».
Подробный путь команды разобран в купон ставки → отправка ставки.
Где купон ставки чаще всего ломается в реальном продукте
Первые проблемы появляются не в happy path, а на стыке quote и пользовательского ожидания: цена изменилась, placement ещё не завершён, а пользователь уже пытается повторить действие. Поэтому компонент нельзя оценивать только по красивому состоянию confirmed. Куда важнее, умеет ли он объяснить reprice, блокировать повтор и вернуть понятный контекст после server reject. Подробная граница этого поведения разобрана в статье о валидации betslip.