fix: handle UpdateMessageSendSucceeded to prevent edit errors

Fixes "Message not found" error when editing immediately after sending.

**Problem**:
When sending a message, TDLib may return a temporary ID, then send
UpdateMessageSendSucceeded with the real server ID. We weren't handling
this update, so the cache kept the old ID while the server had a different
one, causing "Message not found" errors during edits.

**Solution**:
1. Added UpdateMessageSendSucceeded handler (client.rs:801-830)
   - Finds message with temporary ID
   - Replaces it with new message containing real server ID
   - Preserves reply_info if present

2. Added validation before editing (main_input.rs:574-589)
   - Checks message exists in cache
   - Better error messages with chat_id and message_id

3. Added positive ID check in start_editing_selected (mod.rs:240)
   - Blocks editing messages with temporary IDs (negative)

**Test**:
- Added test_edit_immediately_after_send (edit_message.rs:156-181)
- Verifies editing works right after send_message
- All 22 edit_message tests pass

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Mikhail Kilin
2026-02-01 01:47:12 +03:00
parent c5078a54f4
commit 9df8138a46
4 changed files with 86 additions and 2 deletions

View File

@@ -571,6 +571,22 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
if app.is_editing() {
// Режим редактирования
if let Some(msg_id) = app.chat_state.selected_message_id() {
// Проверяем, что сообщение есть в локальном кэше
let msg_exists = app.td_client.current_chat_messages()
.iter()
.any(|m| m.id() == msg_id);
if !msg_exists {
app.error_message = Some(format!(
"Сообщение {} не найдено в кэше чата {}",
msg_id.as_i64(), chat_id
));
app.chat_state = crate::app::ChatState::Normal;
app.message_input.clear();
app.cursor_position = 0;
return;
}
match timeout(
Duration::from_secs(5),
app.td_client.edit_message(ChatId::new(chat_id), msg_id, text),
@@ -599,7 +615,10 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
app.needs_redraw = true; // ВАЖНО: перерисовываем UI
}
Ok(Err(e)) => {
app.error_message = Some(e);
app.error_message = Some(format!(
"Редактирование (chat={}, msg={}): {}",
chat_id, msg_id.as_i64(), e
));
}
Err(_) => {
app.error_message = Some("Таймаут редактирования".to_string());