fix: исправлены баги с сообщениями, редактированием и reply

- Изменён порядок хранения сообщений (теперь от старых к новым)
- Исправлена логика выбора сообщений для редактирования
- Исправлена отправка reply (структура условий)
- Добавлено сохранение reply_info при отправке
- Удалены отладочные логи

Fixes: сообщения теперь отображаются корректно в UI
Fixes: редактирование работает без ошибки 'Message not found'
Fixes: reply показывает превью исходного сообщения
This commit is contained in:
Mikhail Kilin
2026-01-31 18:29:02 +03:00
parent 644e36597d
commit 07c401e0f9
4 changed files with 129 additions and 82 deletions

View File

@@ -494,7 +494,12 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
)
.await
{
Ok(Ok(_)) => {
Ok(Ok(messages)) => {
// Сохраняем загруженные сообщения
*app.td_client.current_chat_messages_mut() = messages;
// ВАЖНО: Устанавливаем current_chat_id ТОЛЬКО ПОСЛЕ сохранения истории
// Это предотвращает race condition с Update::NewMessage
app.td_client.set_current_chat_id(Some(ChatId::new(chat_id)));
// Загружаем недостающие reply info
let _ = timeout(
Duration::from_secs(5),
@@ -563,39 +568,39 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
if let Some(chat_id) = app.get_selected_chat_id() {
let text = app.message_input.clone();
if let Some(msg_id) = app.chat_state.selected_message_id() {
if app.is_editing() {
// Режим редактирования
app.message_input.clear();
app.cursor_position = 0;
app.chat_state = crate::app::ChatState::Normal;
match timeout(
Duration::from_secs(5),
app.td_client.edit_message(ChatId::new(chat_id), msg_id, text),
)
.await
{
Ok(Ok(edited_msg)) => {
// Обновляем сообщение в списке
if let Some(msg) = app
.td_client
.current_chat_messages_mut()
.iter_mut()
.find(|m| m.id() == msg_id)
{
msg.content.text = edited_msg.content.text;
msg.content.entities = edited_msg.content.entities;
msg.metadata.edit_date = edited_msg.metadata.edit_date;
if app.is_editing() {
// Режим редактирования
if let Some(msg_id) = app.chat_state.selected_message_id() {
match timeout(
Duration::from_secs(5),
app.td_client.edit_message(ChatId::new(chat_id), msg_id, text),
)
.await
{
Ok(Ok(edited_msg)) => {
// Обновляем сообщение в списке
if let Some(msg) = app
.td_client
.current_chat_messages_mut()
.iter_mut()
.find(|m| m.id() == msg_id)
{
msg.content.text = edited_msg.content.text;
msg.content.entities = edited_msg.content.entities;
msg.metadata.edit_date = edited_msg.metadata.edit_date;
}
// Очищаем инпут и сбрасываем состояние ПОСЛЕ успешного редактирования
app.message_input.clear();
app.cursor_position = 0;
app.chat_state = crate::app::ChatState::Normal;
}
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 {
// Обычная отправка (или reply)
@@ -663,7 +668,12 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
)
.await
{
Ok(Ok(_)) => {
Ok(Ok(messages)) => {
// Сохраняем загруженные сообщения
*app.td_client.current_chat_messages_mut() = messages;
// ВАЖНО: Устанавливаем current_chat_id ТОЛЬКО ПОСЛЕ сохранения истории
// Это предотвращает race condition с Update::NewMessage
app.td_client.set_current_chat_id(Some(ChatId::new(chat_id)));
// Загружаем недостающие reply info
let _ = timeout(
Duration::from_secs(5),