This commit is contained in:
Mikhail Kilin
2026-01-20 14:54:30 +03:00
parent 699f50a59c
commit 9912ac11bd
8 changed files with 232 additions and 48 deletions

View File

@@ -15,14 +15,70 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
app.status_message = None;
return;
}
KeyCode::Char('s') if has_ctrl => {
// Ctrl+S - начать поиск (только если чат не открыт)
if app.selected_chat_id.is_none() {
app.start_search();
}
return;
}
_ => {}
}
// Режим поиска
if app.is_searching {
match key.code {
KeyCode::Esc => {
app.cancel_search();
}
KeyCode::Enter => {
// Выбрать чат из отфильтрованного списка
app.select_filtered_chat();
if let Some(chat_id) = app.get_selected_chat_id() {
app.status_message = Some("Загрузка сообщений...".to_string());
app.message_scroll_offset = 0;
match timeout(Duration::from_secs(5), app.td_client.get_chat_history(chat_id, 50)).await {
Ok(Ok(messages)) => {
app.current_messages = messages;
app.status_message = None;
}
Ok(Err(e)) => {
app.error_message = Some(e);
app.status_message = None;
}
Err(_) => {
app.error_message = Some("Таймаут загрузки сообщений".to_string());
app.status_message = None;
}
}
}
}
KeyCode::Backspace => {
app.search_query.pop();
// Сбрасываем выделение при изменении запроса
app.chat_list_state.select(Some(0));
}
KeyCode::Down => {
app.next_filtered_chat();
}
KeyCode::Up => {
app.previous_filtered_chat();
}
KeyCode::Char(c) => {
app.search_query.push(c);
// Сбрасываем выделение при изменении запроса
app.chat_list_state.select(Some(0));
}
_ => {}
}
return;
}
// Cmd+j/k - навигация (работает и в списке чатов, и для скролла сообщений)
if has_super {
match key.code {
// Cmd+j - вниз (следующий чат ИЛИ скролл вниз)
KeyCode::Char('j') | KeyCode::Char('д') | KeyCode::Down => {
// Cmd+Down - вниз (следующий чат ИЛИ скролл вниз)
KeyCode::Down => {
if app.selected_chat_id.is_some() {
// В открытом чате - скролл вниз (к новым сообщениям)
if app.message_scroll_offset > 0 {
@@ -33,8 +89,8 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
app.next_chat();
}
}
// Cmd+k - вверх (предыдущий чат ИЛИ скролл вверх)
KeyCode::Char('k') | KeyCode::Char('л') | KeyCode::Up => {
// Cmd+Up - вверх (предыдущий чат ИЛИ скролл вверх)
KeyCode::Up => {
if app.selected_chat_id.is_some() {
// В открытом чате - скролл вверх (к старым сообщениям)
app.message_scroll_offset += 3;
@@ -69,13 +125,6 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
return;
}
// Ctrl+k - в первый чат (только в режиме списка)
if has_ctrl && matches!(key.code, KeyCode::Char('k') | KeyCode::Char('л')) {
if app.selected_chat_id.is_none() {
app.select_first_chat();
}
return;
}
// Enter - открыть чат или отправить сообщение
if key.code == KeyCode::Enter {
@@ -151,14 +200,12 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
_ => {}
}
} else {
// В режиме списка чатов - навигация j/k и переключение папок
// В режиме списка чатов - навигация стрелками и переключение папок
match key.code {
// j или д - следующий чат
KeyCode::Char('j') | KeyCode::Char('д') | KeyCode::Down => {
KeyCode::Down => {
app.next_chat();
}
// k или л - предыдущий чат
KeyCode::Char('k') | KeyCode::Char('л') | KeyCode::Up => {
KeyCode::Up => {
app.previous_chat();
}
// Цифры - переключение папок