This commit is contained in:
Mikhail Kilin
2026-01-25 01:47:38 +03:00
parent fa749d24c5
commit e4dabbe3ac
2 changed files with 37 additions and 3 deletions

View File

@@ -429,10 +429,17 @@ impl TdClient {
match existing_idx { match existing_idx {
Some(idx) => { Some(idx) => {
// Сообщение уже есть - обновляем только если входящее // Сообщение уже есть - обновляем
// (исходящие уже добавлены через send_message с правильным reply_to)
if is_incoming { if is_incoming {
self.current_chat_messages[idx] = msg_info; 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 => { None => {

View File

@@ -352,10 +352,17 @@ pub fn render(f: &mut Frame, area: Rect, app: &App) {
// ID выбранного сообщения для подсветки // ID выбранного сообщения для подсветки
let selected_msg_id = app.get_selected_message().map(|m| m.id); let selected_msg_id = app.get_selected_message().map(|m| m.id);
// Номер строки, где начинается выбранное сообщение (для автоскролла)
let mut selected_msg_line: Option<usize> = None;
for msg in &app.td_client.current_chat_messages { for msg in &app.td_client.current_chat_messages {
// Проверяем, выбрано ли это сообщение // Проверяем, выбрано ли это сообщение
let is_selected = selected_msg_id == Some(msg.id); 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); let msg_day = get_day(msg.date);
if last_day != Some(msg_day) { 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 visible_height = message_chunks[1].height.saturating_sub(2) as usize;
let total_lines = lines.len(); let total_lines = lines.len();
// Базовый скролл (показываем последние сообщения)
let base_scroll = if total_lines > visible_height { let base_scroll = if total_lines > visible_height {
total_lines - visible_height total_lines - visible_height
} else { } else {
0 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) let messages_widget = Paragraph::new(lines)
.block(Block::default().borders(Borders::ALL)) .block(Block::default().borders(Borders::ALL))