Add back button for language settings
Some checks failed
Build docker image / Build-Docker-Image (push) Has been cancelled
rust-clippy analyze / Run rust-clippy analyzing (push) Has been cancelled

Add LangSettingsBack callback variant and serialization
(Display/FromStr). Add a "← Назад" button to the language keyboard
and handle its callback to return to the main settings. Make the
keyboard vector mutable and adjust match arms to use references and
clone/remove as needed.
This commit is contained in:
2026-02-16 22:20:47 +01:00
parent fb4ef7e952
commit bacab9ee32
2 changed files with 29 additions and 5 deletions

View File

@@ -20,6 +20,8 @@ pub enum SettingsCallbackData {
}, },
/// Return from default search submenu to main settings /// Return from default search submenu to main settings
DefaultSearchBack, DefaultSearchBack,
/// Return from languages submenu to main settings
LangSettingsBack,
} }
impl FromStr for SettingsCallbackData { impl FromStr for SettingsCallbackData {
@@ -35,6 +37,9 @@ impl FromStr for SettingsCallbackData {
if s == "defsearch_back" { if s == "defsearch_back" {
return Ok(SettingsCallbackData::DefaultSearchBack); return Ok(SettingsCallbackData::DefaultSearchBack);
} }
if s == "lang_settings_back" {
return Ok(SettingsCallbackData::LangSettingsBack);
}
if let Some(value) = s.strip_prefix("defsearch_") { if let Some(value) = s.strip_prefix("defsearch_") {
return Ok(SettingsCallbackData::DefaultSearch { return Ok(SettingsCallbackData::DefaultSearch {
value: value.to_string().into(), value: value.to_string().into(),
@@ -69,6 +74,7 @@ impl Display for SettingsCallbackData {
SettingsCallbackData::DefaultSearchMenu => write!(f, "defsearch"), SettingsCallbackData::DefaultSearchMenu => write!(f, "defsearch"),
SettingsCallbackData::DefaultSearch { value } => write!(f, "defsearch_{value}"), SettingsCallbackData::DefaultSearch { value } => write!(f, "defsearch_{value}"),
SettingsCallbackData::DefaultSearchBack => write!(f, "defsearch_back"), SettingsCallbackData::DefaultSearchBack => write!(f, "defsearch_back"),
SettingsCallbackData::LangSettingsBack => write!(f, "lang_settings_back"),
} }
} }
} }

View File

@@ -57,7 +57,7 @@ fn get_lang_keyboard(
all_langs: Vec<Lang>, all_langs: Vec<Lang>,
allowed_langs: HashSet<SmartString>, allowed_langs: HashSet<SmartString>,
) -> InlineKeyboardMarkup { ) -> InlineKeyboardMarkup {
let buttons = all_langs let mut buttons: Vec<Vec<InlineKeyboardButton>> = all_langs
.into_iter() .into_iter()
.map(|lang| { .map(|lang| {
let (emoji, callback_data) = match allowed_langs.contains(&lang.code) { let (emoji, callback_data) = match allowed_langs.contains(&lang.code) {
@@ -78,6 +78,13 @@ fn get_lang_keyboard(
}) })
.collect(); .collect();
buttons.push(vec![InlineKeyboardButton {
text: "← Назад".to_string(),
kind: teloxide::types::InlineKeyboardButtonKind::CallbackData(
SettingsCallbackData::LangSettingsBack.to_string(),
),
}]);
InlineKeyboardMarkup { InlineKeyboardMarkup {
inline_keyboard: buttons, inline_keyboard: buttons,
} }
@@ -180,6 +187,14 @@ async fn settings_callback_handler(
bot.answer_callback_query(cq.id).send().await?; bot.answer_callback_query(cq.id).send().await?;
return Ok(()); return Ok(());
} }
SettingsCallbackData::LangSettingsBack => {
bot.edit_message_text(message.chat().id, message.id(), "Настройки")
.reply_markup(get_main_settings_keyboard())
.send()
.await?;
bot.answer_callback_query(cq.id).send().await?;
return Ok(());
}
SettingsCallbackData::DefaultSearch { value } => { SettingsCallbackData::DefaultSearch { value } => {
let current = get_user_settings(user.id).await.ok().flatten(); let current = get_user_settings(user.id).await.ok().flatten();
let allowed_langs: SmallVec<[SmartString; 3]> = match current { let allowed_langs: SmallVec<[SmartString; 3]> = match current {
@@ -233,15 +248,18 @@ async fn settings_callback_handler(
allowed_langs_set.insert(v); allowed_langs_set.insert(v);
}); });
match callback_data { match &callback_data {
SettingsCallbackData::Settings => (), SettingsCallbackData::Settings => (),
SettingsCallbackData::On { code } => { SettingsCallbackData::On { code } => {
allowed_langs_set.insert(code); allowed_langs_set.insert(code.clone());
} }
SettingsCallbackData::Off { code } => { SettingsCallbackData::Off { code } => {
allowed_langs_set.remove(&code); allowed_langs_set.remove(code);
} }
_ => {} SettingsCallbackData::LangSettingsBack
| SettingsCallbackData::DefaultSearchBack
| SettingsCallbackData::DefaultSearchMenu
| SettingsCallbackData::DefaultSearch { .. } => {}
}; };
if allowed_langs_set.is_empty() { if allowed_langs_set.is_empty() {