103 lines
4.1 KiB
Rust
103 lines
4.1 KiB
Rust
//! 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<T: TdClientTrait>(app: &mut App<T>, 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<T: TdClientTrait>(app: &mut App<T>) {
|
|
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<crate::tdlib::MessageInfo> = 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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|