//! Global commands that work from any screen //! //! Handles Ctrl+ combinations: //! - Ctrl+R: Refresh chats //! - Ctrl+S: Start search //! - Ctrl+P: View pinned messages //! - Ctrl+F: Search messages in chat use crate::app::methods::{modal::ModalMethods, search::SearchMethods}; use crate::app::App; use crate::tdlib::TdClientTrait; use crate::types::ChatId; use crate::utils::{with_timeout, with_timeout_msg}; use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; use std::time::Duration; /// Обрабатывает глобальные команды (Ctrl+ combinations). /// /// # Returns /// /// `true` если команда была обработана, `false` если нет pub async fn handle_global_commands(app: &mut App, key: KeyEvent) -> bool { let command = app.get_command(key); match command { Some(crate::config::Command::OpenSearch) => { // Ctrl+S - начать поиск (только если чат не открыт) if app.selected_chat_id.is_none() { app.start_search(); } true } Some(crate::config::Command::OpenSearchInChat) => { // Ctrl+F - поиск по сообщениям в открытом чате if app.selected_chat_id.is_some() && !app.is_pinned_mode() && !app.is_message_search_mode() { app.enter_message_search_mode(); } true } _ => { // Проверяем специальные комбинации, которых нет в Command enum let has_ctrl = key.modifiers.contains(KeyModifiers::CONTROL); match key.code { KeyCode::Char('r') if has_ctrl => { // Ctrl+R - обновить список чатов app.status_message = Some("Обновление чатов...".to_string()); let _ = with_timeout(Duration::from_secs(5), app.td_client.load_chats(50)).await; // Синхронизируем muted чаты после обновления app.notification_manager .sync_muted_chats(app.td_client.chats()); app.status_message = None; true } KeyCode::Char('p') if has_ctrl => { // Ctrl+P - режим просмотра закреплённых сообщений handle_pinned_messages(app).await; true } KeyCode::Char('a') if has_ctrl => { // Ctrl+A - переключение аккаунтов app.open_account_switcher(); true } _ => false, } } } } /// Обрабатывает загрузку и отображение закреплённых сообщений async fn handle_pinned_messages(app: &mut App) { if app.selected_chat_id.is_some() && !app.is_pinned_mode() { if let Some(chat_id) = app.get_selected_chat_id() { app.status_message = Some("Загрузка закреплённых...".to_string()); match with_timeout_msg( Duration::from_secs(5), app.td_client.get_pinned_messages(ChatId::new(chat_id)), "Таймаут загрузки", ) .await { Ok(messages) => { let messages: Vec = messages; if messages.is_empty() { app.status_message = Some("Нет закреплённых сообщений".to_string()); } else { app.enter_pinned_mode(messages); app.status_message = None; } } Err(e) => { app.error_message = Some(e); app.status_message = None; } } } } }