fixes
This commit is contained in:
@@ -24,6 +24,49 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
_ => {}
|
||||
}
|
||||
|
||||
// Модалка подтверждения удаления
|
||||
if app.is_confirm_delete_shown() {
|
||||
match key.code {
|
||||
KeyCode::Char('y') | KeyCode::Char('н') | KeyCode::Enter => {
|
||||
// Подтверждение удаления
|
||||
if let Some(msg_id) = app.confirm_delete_message_id {
|
||||
if let Some(chat_id) = app.get_selected_chat_id() {
|
||||
// Находим сообщение для проверки can_be_deleted_for_all_users
|
||||
let can_delete_for_all = app.td_client.current_chat_messages
|
||||
.iter()
|
||||
.find(|m| m.id == msg_id)
|
||||
.map(|m| m.can_be_deleted_for_all_users)
|
||||
.unwrap_or(false);
|
||||
|
||||
match timeout(
|
||||
Duration::from_secs(5),
|
||||
app.td_client.delete_messages(chat_id, vec![msg_id], can_delete_for_all)
|
||||
).await {
|
||||
Ok(Ok(_)) => {
|
||||
// Удаляем из локального списка
|
||||
app.td_client.current_chat_messages.retain(|m| m.id != msg_id);
|
||||
app.selected_message_index = None;
|
||||
}
|
||||
Ok(Err(e)) => {
|
||||
app.error_message = Some(e);
|
||||
}
|
||||
Err(_) => {
|
||||
app.error_message = Some("Таймаут удаления".to_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
app.confirm_delete_message_id = None;
|
||||
}
|
||||
KeyCode::Char('n') | KeyCode::Char('т') | KeyCode::Esc => {
|
||||
// Отмена удаления
|
||||
app.confirm_delete_message_id = None;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Режим поиска
|
||||
if app.is_searching {
|
||||
match key.code {
|
||||
@@ -37,8 +80,8 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
app.status_message = Some("Загрузка сообщений...".to_string());
|
||||
app.message_scroll_offset = 0;
|
||||
match timeout(Duration::from_secs(10), app.td_client.get_chat_history(chat_id, 100)).await {
|
||||
Ok(Ok(messages)) => {
|
||||
app.current_messages = messages;
|
||||
Ok(Ok(_)) => {
|
||||
// Сообщения уже сохранены в td_client.current_chat_messages
|
||||
app.status_message = None;
|
||||
}
|
||||
Ok(Err(e)) => {
|
||||
@@ -75,27 +118,66 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
|
||||
|
||||
|
||||
// Enter - открыть чат или отправить сообщение
|
||||
// Enter - открыть чат, отправить сообщение или редактировать
|
||||
if key.code == KeyCode::Enter {
|
||||
if app.selected_chat_id.is_some() {
|
||||
// Отправка сообщения
|
||||
// Режим выбора сообщения
|
||||
if app.is_selecting_message() {
|
||||
// Начать редактирование выбранного сообщения
|
||||
if app.start_editing_selected() {
|
||||
// Редактирование начато
|
||||
} else {
|
||||
// Нельзя редактировать это сообщение
|
||||
app.selected_message_index = None;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Отправка или редактирование сообщения
|
||||
if !app.message_input.is_empty() {
|
||||
if let Some(chat_id) = app.get_selected_chat_id() {
|
||||
let text = app.message_input.clone();
|
||||
app.message_input.clear();
|
||||
|
||||
match timeout(Duration::from_secs(5), app.td_client.send_message(chat_id, text.clone())).await {
|
||||
Ok(Ok(sent_msg)) => {
|
||||
// Добавляем отправленное сообщение в список
|
||||
app.current_messages.push(sent_msg);
|
||||
// Сбрасываем скролл чтобы видеть новое сообщение
|
||||
app.message_scroll_offset = 0;
|
||||
if let Some(msg_id) = app.editing_message_id {
|
||||
// Режим редактирования
|
||||
app.message_input.clear();
|
||||
app.cursor_position = 0;
|
||||
app.editing_message_id = None;
|
||||
|
||||
match timeout(Duration::from_secs(5), app.td_client.edit_message(chat_id, msg_id, text)).await {
|
||||
Ok(Ok(edited_msg)) => {
|
||||
// Обновляем сообщение в списке
|
||||
if let Some(msg) = app.td_client.current_chat_messages.iter_mut().find(|m| m.id == msg_id) {
|
||||
msg.content = edited_msg.content;
|
||||
msg.entities = edited_msg.entities;
|
||||
msg.edit_date = edited_msg.edit_date;
|
||||
}
|
||||
}
|
||||
Ok(Err(e)) => {
|
||||
app.error_message = Some(e);
|
||||
}
|
||||
Err(_) => {
|
||||
app.error_message = Some("Таймаут редактирования".to_string());
|
||||
}
|
||||
}
|
||||
Ok(Err(e)) => {
|
||||
app.error_message = Some(e);
|
||||
}
|
||||
Err(_) => {
|
||||
app.error_message = Some("Таймаут отправки".to_string());
|
||||
} else {
|
||||
// Обычная отправка
|
||||
app.message_input.clear();
|
||||
app.cursor_position = 0;
|
||||
|
||||
match timeout(Duration::from_secs(5), app.td_client.send_message(chat_id, text)).await {
|
||||
Ok(Ok(sent_msg)) => {
|
||||
// Добавляем отправленное сообщение в список (с лимитом)
|
||||
app.td_client.push_message(sent_msg);
|
||||
// Сбрасываем скролл чтобы видеть новое сообщение
|
||||
app.message_scroll_offset = 0;
|
||||
}
|
||||
Ok(Err(e)) => {
|
||||
app.error_message = Some(e);
|
||||
}
|
||||
Err(_) => {
|
||||
app.error_message = Some("Таймаут отправки".to_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -110,8 +192,8 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
app.status_message = Some("Загрузка сообщений...".to_string());
|
||||
app.message_scroll_offset = 0;
|
||||
match timeout(Duration::from_secs(10), app.td_client.get_chat_history(chat_id, 100)).await {
|
||||
Ok(Ok(messages)) => {
|
||||
app.current_messages = messages;
|
||||
Ok(Ok(_)) => {
|
||||
// Сообщения уже сохранены в td_client.current_chat_messages
|
||||
app.status_message = None;
|
||||
}
|
||||
Ok(Err(e)) => {
|
||||
@@ -129,9 +211,15 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Esc - закрыть чат
|
||||
// Esc - отменить выбор/редактирование или закрыть чат
|
||||
if key.code == KeyCode::Esc {
|
||||
if app.selected_chat_id.is_some() {
|
||||
if app.is_selecting_message() {
|
||||
// Отменить выбор сообщения
|
||||
app.selected_message_index = None;
|
||||
} else if app.is_editing() {
|
||||
// Отменить редактирование
|
||||
app.cancel_editing();
|
||||
} else if app.selected_chat_id.is_some() {
|
||||
app.close_chat();
|
||||
}
|
||||
return;
|
||||
@@ -139,14 +227,97 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
|
||||
// Режим открытого чата
|
||||
if app.selected_chat_id.is_some() {
|
||||
// Режим выбора сообщения для редактирования/удаления
|
||||
if app.is_selecting_message() {
|
||||
match key.code {
|
||||
KeyCode::Up => {
|
||||
app.select_previous_message();
|
||||
}
|
||||
KeyCode::Down => {
|
||||
app.select_next_message();
|
||||
// Если вышли из режима выбора (индекс стал None), ничего не делаем
|
||||
}
|
||||
KeyCode::Char('d') | KeyCode::Char('в') | KeyCode::Delete => {
|
||||
// Показать модалку подтверждения удаления
|
||||
if let Some(msg) = app.get_selected_message() {
|
||||
let can_delete = msg.can_be_deleted_only_for_self || msg.can_be_deleted_for_all_users;
|
||||
if can_delete {
|
||||
app.confirm_delete_message_id = Some(msg.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
match key.code {
|
||||
KeyCode::Backspace => {
|
||||
app.message_input.pop();
|
||||
// Удаляем символ слева от курсора
|
||||
if app.cursor_position > 0 {
|
||||
let chars: Vec<char> = app.message_input.chars().collect();
|
||||
let mut new_input = String::new();
|
||||
for (i, ch) in chars.iter().enumerate() {
|
||||
if i != app.cursor_position - 1 {
|
||||
new_input.push(*ch);
|
||||
}
|
||||
}
|
||||
app.message_input = new_input;
|
||||
app.cursor_position -= 1;
|
||||
}
|
||||
}
|
||||
KeyCode::Delete => {
|
||||
// Удаляем символ справа от курсора
|
||||
let len = app.message_input.chars().count();
|
||||
if app.cursor_position < len {
|
||||
let chars: Vec<char> = app.message_input.chars().collect();
|
||||
let mut new_input = String::new();
|
||||
for (i, ch) in chars.iter().enumerate() {
|
||||
if i != app.cursor_position {
|
||||
new_input.push(*ch);
|
||||
}
|
||||
}
|
||||
app.message_input = new_input;
|
||||
}
|
||||
}
|
||||
KeyCode::Char(c) => {
|
||||
app.message_input.push(c);
|
||||
// Вставляем символ в позицию курсора
|
||||
let chars: Vec<char> = app.message_input.chars().collect();
|
||||
let mut new_input = String::new();
|
||||
for (i, ch) in chars.iter().enumerate() {
|
||||
if i == app.cursor_position {
|
||||
new_input.push(c);
|
||||
}
|
||||
new_input.push(*ch);
|
||||
}
|
||||
if app.cursor_position >= chars.len() {
|
||||
new_input.push(c);
|
||||
}
|
||||
app.message_input = new_input;
|
||||
app.cursor_position += 1;
|
||||
}
|
||||
// Стрелки - скролл сообщений
|
||||
KeyCode::Left => {
|
||||
// Курсор влево
|
||||
if app.cursor_position > 0 {
|
||||
app.cursor_position -= 1;
|
||||
}
|
||||
}
|
||||
KeyCode::Right => {
|
||||
// Курсор вправо
|
||||
let len = app.message_input.chars().count();
|
||||
if app.cursor_position < len {
|
||||
app.cursor_position += 1;
|
||||
}
|
||||
}
|
||||
KeyCode::Home => {
|
||||
// Курсор в начало
|
||||
app.cursor_position = 0;
|
||||
}
|
||||
KeyCode::End => {
|
||||
// Курсор в конец
|
||||
app.cursor_position = app.message_input.chars().count();
|
||||
}
|
||||
// Стрелки вверх/вниз - скролл сообщений или начало выбора
|
||||
KeyCode::Down => {
|
||||
// Скролл вниз (к новым сообщениям)
|
||||
if app.message_scroll_offset > 0 {
|
||||
@@ -154,24 +325,29 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
}
|
||||
}
|
||||
KeyCode::Up => {
|
||||
// Скролл вверх (к старым сообщениям)
|
||||
app.message_scroll_offset += 3;
|
||||
// Если инпут пустой и не в режиме редактирования — начать выбор сообщения
|
||||
if app.message_input.is_empty() && !app.is_editing() {
|
||||
app.start_message_selection();
|
||||
} else {
|
||||
// Скролл вверх (к старым сообщениям)
|
||||
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;
|
||||
// Проверяем, нужно ли подгрузить старые сообщения
|
||||
if !app.td_client.current_chat_messages.is_empty() {
|
||||
let oldest_msg_id = app.td_client.current_chat_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.td_client.current_chat_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.td_client.current_chat_messages.drain(..));
|
||||
app.td_client.current_chat_messages = new_messages;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user