From e4dabbe3ac1f6e50d68aef9f85461a5a92aaa81e Mon Sep 17 00:00:00 2001 From: Mikhail Kilin Date: Sun, 25 Jan 2026 01:47:38 +0300 Subject: [PATCH] fixes --- src/tdlib/client.rs | 11 +++++++++-- src/ui/messages.rs | 29 ++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/tdlib/client.rs b/src/tdlib/client.rs index 37bb618..a7f376c 100644 --- a/src/tdlib/client.rs +++ b/src/tdlib/client.rs @@ -429,10 +429,17 @@ impl TdClient { match existing_idx { Some(idx) => { - // Сообщение уже есть - обновляем только если входящее - // (исходящие уже добавлены через send_message с правильным reply_to) + // Сообщение уже есть - обновляем if is_incoming { self.current_chat_messages[idx] = msg_info; + } else { + // Для исходящих: обновляем can_be_edited и другие поля, + // но сохраняем reply_to (добавленный при отправке) + let existing = &mut self.current_chat_messages[idx]; + existing.can_be_edited = msg_info.can_be_edited; + existing.can_be_deleted_only_for_self = msg_info.can_be_deleted_only_for_self; + existing.can_be_deleted_for_all_users = msg_info.can_be_deleted_for_all_users; + existing.is_read = msg_info.is_read; } } None => { diff --git a/src/ui/messages.rs b/src/ui/messages.rs index 0827899..9335a5c 100644 --- a/src/ui/messages.rs +++ b/src/ui/messages.rs @@ -352,10 +352,17 @@ pub fn render(f: &mut Frame, area: Rect, app: &App) { // ID выбранного сообщения для подсветки let selected_msg_id = app.get_selected_message().map(|m| m.id); + // Номер строки, где начинается выбранное сообщение (для автоскролла) + let mut selected_msg_line: Option = None; for msg in &app.td_client.current_chat_messages { // Проверяем, выбрано ли это сообщение let is_selected = selected_msg_id == Some(msg.id); + + // Запоминаем строку начала выбранного сообщения + if is_selected { + selected_msg_line = Some(lines.len()); + } // Проверяем, нужно ли добавить разделитель даты let msg_day = get_day(msg.date); if last_day != Some(msg_day) { @@ -590,13 +597,33 @@ pub fn render(f: &mut Frame, area: Rect, app: &App) { let visible_height = message_chunks[1].height.saturating_sub(2) as usize; let total_lines = lines.len(); + // Базовый скролл (показываем последние сообщения) let base_scroll = if total_lines > visible_height { total_lines - visible_height } else { 0 }; - let scroll_offset = base_scroll.saturating_sub(app.message_scroll_offset) as u16; + // Если выбрано сообщение, автоскроллим к нему + let scroll_offset = if app.is_selecting_message() { + if let Some(selected_line) = selected_msg_line { + // Вычисляем нужный скролл, чтобы выбранное сообщение было видно + if selected_line < visible_height / 2 { + // Сообщение в начале — скроллим к началу + 0 + } else if selected_line > total_lines.saturating_sub(visible_height / 2) { + // Сообщение в конце — скроллим к концу + base_scroll + } else { + // Центрируем выбранное сообщение + selected_line.saturating_sub(visible_height / 2) + } + } else { + base_scroll.saturating_sub(app.message_scroll_offset) + } + } else { + base_scroll.saturating_sub(app.message_scroll_offset) + } as u16; let messages_widget = Paragraph::new(lines) .block(Block::default().borders(Borders::ALL))