Множественный выбор
Сделаем бота со множественным выбором, который спрашивает, что надеть.
Готовимся
Типичный гардероб:
@Serializable
enum class Clothes {
Socks, Shirt, Pants, Hat
}
Делаем
Что уже надели, будем хранить в состоянии:
@Serializable
data class MultipleChoiceState(
val selectedClothes: Set<Clothes> = emptySet(),
) : MessageState
Теперь реализуем блок message для нашего состояния. Если одежда есть в списке выбранных, будем рисовать кнопку с галочкой, иначе – без.
val multipleChoice = inState<DefaultRole, MultipleChoiceState> {
message {
text("Что наденем?") {
Clothes.values().forEach { clothes ->
row {
if (clothes in state.snapshot.selectedClothes) {
actionButton("✅ ${clothes.name}", UnselectAction(clothes))
} else {
actionButton(clothes.name, SelectAction(clothes))
}
}
}
}
}
}
Для кнопок понадобится два типа действий: выбрать и снять выбор.
@Serializable
class SelectAction(val clothes: Clothes) : Action
@Serializable
class UnselectAction(val clothes: Clothes) : Action
По нажатию кнопки с SelectAction будем добавлять одежду во множество выбранных.
on<SelectAction> {
state.edit { copy(selectedClothes = selectedClothes + it.clothes) }
}
А по нажатию кнопки с UnselectAction – убирать.
on<UnselectAction> {
state.edit { copy(selectedClothes = selectedClothes - it.clothes) }
}
При вызове state.edit сообщение редактируется автоматически в соответствии с обновлённым состоянием.
Результат

Last modified: 24 August 2023