refactor: complete nesting simplification with let-else guards
Применены дополнительные упрощения: - handle_escape_key: преобразован в early returns - handle_message_selection: применены let-else guards для всех веток - Блоки 'd', 'y', 'e' теперь с явными guards Результат Phase 4: - Уменьшена вложенность во всех извлечённых функциях - Применены паттерны: early returns, let-else guards, вспомогательные функции - Код стал максимально линейным и читаемым - Глубина вложенности: 6+ → 2-3 уровня Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -181,14 +181,15 @@ async fn handle_message_selection<T: TdClientTrait>(app: &mut App<T>, key: KeyEv
|
|||||||
}
|
}
|
||||||
KeyCode::Char('d') | KeyCode::Char('в') | KeyCode::Delete => {
|
KeyCode::Char('d') | KeyCode::Char('в') | KeyCode::Delete => {
|
||||||
// Показать модалку подтверждения удаления
|
// Показать модалку подтверждения удаления
|
||||||
if let Some(msg) = app.get_selected_message() {
|
let Some(msg) = app.get_selected_message() else {
|
||||||
let can_delete =
|
return;
|
||||||
msg.can_be_deleted_only_for_self() || msg.can_be_deleted_for_all_users();
|
};
|
||||||
if can_delete {
|
let can_delete =
|
||||||
app.chat_state = crate::app::ChatState::DeleteConfirmation {
|
msg.can_be_deleted_only_for_self() || msg.can_be_deleted_for_all_users();
|
||||||
message_id: msg.id(),
|
if can_delete {
|
||||||
};
|
app.chat_state = crate::app::ChatState::DeleteConfirmation {
|
||||||
}
|
message_id: msg.id(),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
KeyCode::Char('r') | KeyCode::Char('к') => {
|
KeyCode::Char('r') | KeyCode::Char('к') => {
|
||||||
@@ -201,55 +202,57 @@ async fn handle_message_selection<T: TdClientTrait>(app: &mut App<T>, key: KeyEv
|
|||||||
}
|
}
|
||||||
KeyCode::Char('y') | KeyCode::Char('н') => {
|
KeyCode::Char('y') | KeyCode::Char('н') => {
|
||||||
// Копировать сообщение
|
// Копировать сообщение
|
||||||
if let Some(msg) = app.get_selected_message() {
|
let Some(msg) = app.get_selected_message() else {
|
||||||
let text = format_message_for_clipboard(&msg);
|
return;
|
||||||
match copy_to_clipboard(&text) {
|
};
|
||||||
Ok(_) => {
|
let text = format_message_for_clipboard(&msg);
|
||||||
app.status_message = Some("Сообщение скопировано".to_string());
|
match copy_to_clipboard(&text) {
|
||||||
}
|
Ok(_) => {
|
||||||
Err(e) => {
|
app.status_message = Some("Сообщение скопировано".to_string());
|
||||||
app.error_message = Some(format!("Ошибка копирования: {}", e));
|
}
|
||||||
}
|
Err(e) => {
|
||||||
|
app.error_message = Some(format!("Ошибка копирования: {}", e));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
KeyCode::Char('e') | KeyCode::Char('у') => {
|
KeyCode::Char('e') | KeyCode::Char('у') => {
|
||||||
// Открыть emoji picker для добавления реакции
|
// Открыть emoji picker для добавления реакции
|
||||||
if let Some(msg) = app.get_selected_message() {
|
let Some(msg) = app.get_selected_message() else {
|
||||||
let chat_id = app.selected_chat_id.unwrap();
|
return;
|
||||||
let message_id = msg.id();
|
};
|
||||||
|
let chat_id = app.selected_chat_id.unwrap();
|
||||||
|
let message_id = msg.id();
|
||||||
|
|
||||||
app.status_message = Some("Загрузка реакций...".to_string());
|
app.status_message = Some("Загрузка реакций...".to_string());
|
||||||
app.needs_redraw = true;
|
app.needs_redraw = true;
|
||||||
|
|
||||||
// Запрашиваем доступные реакции
|
// Запрашиваем доступные реакции
|
||||||
match with_timeout_msg(
|
match with_timeout_msg(
|
||||||
Duration::from_secs(5),
|
Duration::from_secs(5),
|
||||||
app.td_client
|
app.td_client
|
||||||
.get_message_available_reactions(chat_id, message_id),
|
.get_message_available_reactions(chat_id, message_id),
|
||||||
"Таймаут загрузки реакций",
|
"Таймаут загрузки реакций",
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
Ok(reactions) => {
|
Ok(reactions) => {
|
||||||
let reactions: Vec<String> = reactions;
|
let reactions: Vec<String> = reactions;
|
||||||
if reactions.is_empty() {
|
if reactions.is_empty() {
|
||||||
app.error_message =
|
app.error_message =
|
||||||
Some("Реакции недоступны для этого сообщения".to_string());
|
Some("Реакции недоступны для этого сообщения".to_string());
|
||||||
app.status_message = None;
|
app.status_message = None;
|
||||||
app.needs_redraw = true;
|
app.needs_redraw = true;
|
||||||
} else {
|
} else {
|
||||||
app.enter_reaction_picker_mode(message_id.as_i64(), reactions);
|
app.enter_reaction_picker_mode(message_id.as_i64(), reactions);
|
||||||
app.status_message = None;
|
|
||||||
app.needs_redraw = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
app.error_message = Some(e);
|
|
||||||
app.status_message = None;
|
app.status_message = None;
|
||||||
app.needs_redraw = true;
|
app.needs_redraw = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Err(e) => {
|
||||||
|
app.error_message = Some(e);
|
||||||
|
app.status_message = None;
|
||||||
|
app.needs_redraw = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
@@ -264,28 +267,39 @@ async fn handle_message_selection<T: TdClientTrait>(app: &mut App<T>, key: KeyEv
|
|||||||
/// - В режиме ответа: отменить ответ
|
/// - В режиме ответа: отменить ответ
|
||||||
/// - В открытом чате: сохранить черновик и закрыть чат
|
/// - В открытом чате: сохранить черновик и закрыть чат
|
||||||
async fn handle_escape_key<T: TdClientTrait>(app: &mut App<T>) {
|
async fn handle_escape_key<T: TdClientTrait>(app: &mut App<T>) {
|
||||||
|
// Early return для режима выбора сообщения
|
||||||
if app.is_selecting_message() {
|
if app.is_selecting_message() {
|
||||||
// Отменить выбор сообщения
|
|
||||||
app.chat_state = crate::app::ChatState::Normal;
|
app.chat_state = crate::app::ChatState::Normal;
|
||||||
} else if app.is_editing() {
|
return;
|
||||||
// Отменить редактирование
|
|
||||||
app.cancel_editing();
|
|
||||||
} else if app.is_replying() {
|
|
||||||
// Отменить режим ответа
|
|
||||||
app.cancel_reply();
|
|
||||||
} else if app.selected_chat_id.is_some() {
|
|
||||||
// Сохраняем черновик если есть текст в инпуте
|
|
||||||
if let Some(chat_id) = app.selected_chat_id {
|
|
||||||
if !app.message_input.is_empty() && !app.is_editing() && !app.is_replying() {
|
|
||||||
let draft_text = app.message_input.clone();
|
|
||||||
let _ = app.td_client.set_draft_message(chat_id, draft_text).await;
|
|
||||||
} else if app.message_input.is_empty() {
|
|
||||||
// Очищаем черновик если инпут пустой
|
|
||||||
let _ = app.td_client.set_draft_message(chat_id, String::new()).await;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
app.close_chat();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Early return для режима редактирования
|
||||||
|
if app.is_editing() {
|
||||||
|
app.cancel_editing();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Early return для режима ответа
|
||||||
|
if app.is_replying() {
|
||||||
|
app.cancel_reply();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Закрытие чата с сохранением черновика
|
||||||
|
let Some(chat_id) = app.selected_chat_id else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Сохраняем черновик если есть текст в инпуте
|
||||||
|
if !app.message_input.is_empty() && !app.is_editing() && !app.is_replying() {
|
||||||
|
let draft_text = app.message_input.clone();
|
||||||
|
let _ = app.td_client.set_draft_message(chat_id, draft_text).await;
|
||||||
|
} else if app.message_input.is_empty() {
|
||||||
|
// Очищаем черновик если инпут пустой
|
||||||
|
let _ = app.td_client.set_draft_message(chat_id, String::new()).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
app.close_chat();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Редактирование существующего сообщения
|
/// Редактирование существующего сообщения
|
||||||
|
|||||||
Reference in New Issue
Block a user