fixes
This commit is contained in:
@@ -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 => {
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user