This commit is contained in:
Mikhail Kilin
2026-01-21 21:20:18 +03:00
parent 0a9ae8b448
commit 1ef341d907
9 changed files with 326 additions and 95 deletions

View File

@@ -4,7 +4,6 @@ use tokio::time::timeout;
use crate::app::App;
pub async fn handle(app: &mut App, key: KeyEvent) {
let has_super = key.modifiers.contains(KeyModifiers::SUPER);
let has_ctrl = key.modifiers.contains(KeyModifiers::CONTROL);
// Глобальные команды (работают всегда)
@@ -74,56 +73,6 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
return;
}
// Cmd+j/k - навигация (работает и в списке чатов, и для скролла сообщений)
if has_super {
match key.code {
// Cmd+Down - вниз (следующий чат ИЛИ скролл вниз)
KeyCode::Down => {
if app.selected_chat_id.is_some() {
// В открытом чате - скролл вниз (к новым сообщениям)
if app.message_scroll_offset > 0 {
app.message_scroll_offset = app.message_scroll_offset.saturating_sub(3);
}
} else {
// В списке чатов - следующий чат
app.next_chat();
}
}
// Cmd+Up - вверх (предыдущий чат ИЛИ скролл вверх)
KeyCode::Up => {
if app.selected_chat_id.is_some() {
// В открытом чате - скролл вверх (к старым сообщениям)
app.message_scroll_offset += 3;
// Проверяем, нужно ли подгрузить старые сообщения
if !app.current_messages.is_empty() {
let oldest_msg_id = app.current_messages.first().map(|m| m.id).unwrap_or(0);
if let Some(chat_id) = app.get_selected_chat_id() {
// Подгружаем больше сообщений если скролл близко к верху
if app.message_scroll_offset > app.current_messages.len().saturating_sub(10) {
if let Ok(Ok(older)) = timeout(
Duration::from_secs(3),
app.td_client.load_older_messages(chat_id, oldest_msg_id, 20)
).await {
if !older.is_empty() {
// Добавляем старые сообщения в начало
let mut new_messages = older;
new_messages.extend(app.current_messages.drain(..));
app.current_messages = new_messages;
}
}
}
}
}
} else {
// В списке чатов - предыдущий чат
app.previous_chat();
}
}
_ => {}
}
return;
}
// Enter - открыть чат или отправить сообщение
@@ -188,7 +137,7 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
return;
}
// Ввод текста в режиме открытого чата
// Режим открытого чата
if app.selected_chat_id.is_some() {
match key.code {
KeyCode::Backspace => {
@@ -197,6 +146,38 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
KeyCode::Char(c) => {
app.message_input.push(c);
}
// Стрелки - скролл сообщений
KeyCode::Down => {
// Скролл вниз (к новым сообщениям)
if app.message_scroll_offset > 0 {
app.message_scroll_offset = app.message_scroll_offset.saturating_sub(3);
}
}
KeyCode::Up => {
// Скролл вверх (к старым сообщениям)
app.message_scroll_offset += 3;
// Проверяем, нужно ли подгрузить старые сообщения
if !app.current_messages.is_empty() {
let oldest_msg_id = app.current_messages.first().map(|m| m.id).unwrap_or(0);
if let Some(chat_id) = app.get_selected_chat_id() {
// Подгружаем больше сообщений если скролл близко к верху
if app.message_scroll_offset > app.current_messages.len().saturating_sub(10) {
if let Ok(Ok(older)) = timeout(
Duration::from_secs(3),
app.td_client.load_older_messages(chat_id, oldest_msg_id, 20)
).await {
if !older.is_empty() {
// Добавляем старые сообщения в начало
let mut new_messages = older;
new_messages.extend(app.current_messages.drain(..));
app.current_messages = new_messages;
}
}
}
}
}
}
_ => {}
}
} else {
@@ -208,12 +189,24 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
KeyCode::Up => {
app.previous_chat();
}
// Цифры - переключение папок
// Цифры 1-9 - переключение папок
KeyCode::Char(c) if c >= '1' && c <= '9' => {
let folder_idx = (c as usize) - ('1' as usize);
if folder_idx < app.folders.len() {
app.selected_folder = folder_idx;
let folder_num = (c as usize) - ('1' as usize); // 0-based
if folder_num == 0 {
// 1 = All
app.selected_folder_id = None;
} else {
// 2, 3, 4... = папки из TDLib
if let Some(folder) = app.td_client.folders.get(folder_num - 1) {
let folder_id = folder.id;
app.selected_folder_id = Some(folder_id);
// Загружаем чаты папки
app.status_message = Some("Загрузка чатов папки...".to_string());
let _ = timeout(Duration::from_secs(5), app.td_client.load_folder_chats(folder_id, 50)).await;
app.status_message = None;
}
}
app.chat_list_state.select(Some(0));
}
_ => {}
}