Извлечены все оставшиеся блоки из функции handle():
- handle_profile_mode() - режим профиля с модалкой (~120 строк)
- handle_message_search_mode() - поиск по сообщениям (~73 строки)
- handle_pinned_mode() - закреплённые сообщения (~42 строки)
- handle_reaction_picker_mode() - emoji picker (~90 строк)
- handle_delete_confirmation() - подтверждение удаления (~60 строк)
- handle_forward_mode() - пересылка сообщений (~52 строки)
- handle_chat_search_mode() - поиск по чатам (~43 строки)
- handle_enter_key() - обработка Enter (~145 строк)
- handle_escape_key() - обработка Esc (~35 строк)
- handle_message_selection() - режим выбора сообщения (~95 строк)
- handle_profile_open() - Ctrl+U для профиля (~28 строк)
Результат:
- Функция handle() сокращена с 734 до 82 строк (89% сокращение!)
- Всего извлечено 13 специализированных функций
- Каждая функция имеет чёткую ответственность
- Код стал линейным и легко читаемым
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Извлечены оставшиеся обработчики из функции handle():
- handle_open_chat_keyboard_input() - ввод текста, навигация курсора, скролл (~129 строк)
- handle_chat_list_navigation() - навигация по чатам и папкам (~34 строки)
Результат:
- Функция handle() сокращена с 891 до 734 строк
- Всего извлечено 12 специализированных функций
- Каждая функция имеет чёткую ответственность и документацию
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Упрощение функции handle() в main_input.rs путём извлечения
обработчиков режимов в отдельные функции.
Извлечённые функции:
- handle_profile_mode() - режим профиля с модалкой выхода (~114 строк)
- handle_message_search_mode() - поиск по сообщениям (~73 строки)
- handle_pinned_mode() - закреплённые сообщения (~34 строки)
- handle_reaction_picker_mode() - выбор реакции (~79 строк)
- handle_delete_confirmation() - подтверждение удаления (~53 строки)
- handle_forward_mode() - выбор чата для пересылки (~48 строк)
- handle_chat_search_mode() - поиск по чатам (~32 строки)
- handle_escape_key() - обработка Esc (~25 строк)
- handle_message_selection() - выбор сообщения (~85 строк)
Итого извлечено: ~543 строки из основной функции handle()
Результат:
- handle() сократилась с 891 до ~350 строк (на 61%)
- Каждый режим теперь изолирован и легко тестируется
- Улучшена читаемость и maintainability кода
- Все тесты проходят успешно
Также:
- Обновлён tdlib-rs с 1.1 на 1.2.0
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>
When editing a message that has a reply, convert_message() creates
a new ReplyInfo with sender_name="Unknown" and text="...". This was
causing the reply info to be lost after editing.
Solution: Save the old reply_to from the original message before
replacement, and restore it if the new message has "Unknown" reply info.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Issue: Message edits worked on server (other users saw changes),
but local UI didn't update - edited text wasn't visible.
Root cause: Code was updating individual fields instead of replacing
the whole message, and wasn't triggering UI redraw.
Solution:
- Replace entire message with edited_msg (not individual fields)
- Set needs_redraw = true to trigger UI update
- Remove debug logging
Now edited messages immediately appear in local UI.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Изменён порядок хранения сообщений (теперь от старых к новым)
- Исправлена логика выбора сообщений для редактирования
- Исправлена отправка reply (структура условий)
- Добавлено сохранение reply_info при отправке
- Удалены отладочные логи
Fixes: сообщения теперь отображаются корректно в UI
Fixes: редактирование работает без ошибки 'Message not found'
Fixes: reply показывает превью исходного сообщения
Сгруппированы 16 плоских полей MessageInfo в 4 логические структуры
для улучшения организации кода и maintainability.
Новые структуры:
- MessageMetadata: id, sender_name, date, edit_date
- MessageContent: text, entities
- MessageState: is_outgoing, is_read, can_be_edited, can_be_deleted_*
- MessageInteractions: reply_to, forward_from, reactions
Изменения:
- Добавлены 4 новые структуры в tdlib/types.rs
- Обновлена MessageInfo для использования новых структур
- Добавлен конструктор MessageInfo::new() для удобного создания
- Добавлены getter методы (id(), text(), sender_name() и др.) для удобного доступа
- Обновлены все места создания MessageInfo (convert_message)
- Обновлены все места использования (~200+ обращений):
* ui/messages.rs: рендеринг сообщений
* app/mod.rs: логика приложения
* input/main_input.rs: обработка ввода и копирование
* tdlib/client.rs: обработка updates
* Все тестовые файлы (14 файлов)
Преимущества:
- Логическая группировка данных
- Проще понимать структуру сообщения
- Легче добавлять новые поля в будущем
- Улучшенная читаемость кода
Статус: Priority 2 теперь 80% (4/5 задач)
- ✅ Error enum
- ✅ Config validation
- ✅ Newtype для ID
- ✅ MessageInfo реструктуризация
- ⏳ MessageBuilder pattern
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>