refactor: restructure MessageInfo with logical field grouping (P2.6)
Сгруппированы 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>
This commit is contained in:
@@ -193,7 +193,7 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
.td_client
|
||||
.current_chat_messages()
|
||||
.iter()
|
||||
.position(|m| m.id == msg_id);
|
||||
.position(|m| m.id() == msg_id);
|
||||
|
||||
if let Some(idx) = msg_index {
|
||||
let total = app.td_client.current_chat_messages().len();
|
||||
@@ -268,7 +268,7 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
.td_client
|
||||
.current_chat_messages()
|
||||
.iter()
|
||||
.position(|m| m.id == msg_id);
|
||||
.position(|m| m.id() == msg_id);
|
||||
|
||||
if let Some(idx) = msg_index {
|
||||
// Вычисляем scroll offset чтобы показать сообщение
|
||||
@@ -381,8 +381,8 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
.td_client
|
||||
.current_chat_messages()
|
||||
.iter()
|
||||
.find(|m| m.id == msg_id)
|
||||
.map(|m| m.can_be_deleted_for_all_users)
|
||||
.find(|m| m.id() == msg_id)
|
||||
.map(|m| m.can_be_deleted_for_all_users())
|
||||
.unwrap_or(false);
|
||||
|
||||
match timeout(
|
||||
@@ -399,7 +399,7 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
// Удаляем из локального списка
|
||||
app.td_client
|
||||
.current_chat_messages_mut()
|
||||
.retain(|m| m.id != msg_id);
|
||||
.retain(|m| m.id() != msg_id);
|
||||
// Сбрасываем состояние
|
||||
app.chat_state = crate::app::ChatState::Normal;
|
||||
}
|
||||
@@ -582,11 +582,11 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
.td_client
|
||||
.current_chat_messages_mut()
|
||||
.iter_mut()
|
||||
.find(|m| m.id == msg_id)
|
||||
.find(|m| m.id() == msg_id)
|
||||
{
|
||||
msg.content = edited_msg.content;
|
||||
msg.entities = edited_msg.entities;
|
||||
msg.edit_date = edited_msg.edit_date;
|
||||
msg.content.text = edited_msg.content.text;
|
||||
msg.content.entities = edited_msg.content.entities;
|
||||
msg.metadata.edit_date = edited_msg.metadata.edit_date;
|
||||
}
|
||||
}
|
||||
Ok(Err(e)) => {
|
||||
@@ -607,9 +607,9 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
// Создаём ReplyInfo ДО отправки, пока сообщение точно доступно
|
||||
let reply_info = app.get_replying_to_message().map(|m| {
|
||||
crate::tdlib::ReplyInfo {
|
||||
message_id: m.id,
|
||||
sender_name: m.sender_name.clone(),
|
||||
text: m.content.clone(),
|
||||
message_id: m.id(),
|
||||
sender_name: m.sender_name().to_string(),
|
||||
text: m.text().to_string(),
|
||||
}
|
||||
});
|
||||
app.message_input.clear();
|
||||
@@ -741,10 +741,10 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
// Показать модалку подтверждения удаления
|
||||
if let Some(msg) = app.get_selected_message() {
|
||||
let can_delete =
|
||||
msg.can_be_deleted_only_for_self || msg.can_be_deleted_for_all_users;
|
||||
msg.can_be_deleted_only_for_self() || msg.can_be_deleted_for_all_users();
|
||||
if can_delete {
|
||||
app.chat_state = crate::app::ChatState::DeleteConfirmation {
|
||||
message_id: msg.id,
|
||||
message_id: msg.id(),
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -775,7 +775,7 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
// Открыть emoji picker для добавления реакции
|
||||
if let Some(msg) = app.get_selected_message() {
|
||||
let chat_id = app.selected_chat_id.unwrap();
|
||||
let message_id = msg.id;
|
||||
let message_id = msg.id();
|
||||
|
||||
app.status_message = Some("Загрузка реакций...".to_string());
|
||||
app.needs_redraw = true;
|
||||
@@ -942,7 +942,7 @@ pub async fn handle(app: &mut App, key: KeyEvent) {
|
||||
.td_client
|
||||
.current_chat_messages()
|
||||
.first()
|
||||
.map(|m| m.id)
|
||||
.map(|m| m.id())
|
||||
.unwrap_or(0);
|
||||
if let Some(chat_id) = app.get_selected_chat_id() {
|
||||
// Подгружаем больше сообщений если скролл близко к верху
|
||||
@@ -1051,7 +1051,7 @@ fn format_message_for_clipboard(msg: &crate::tdlib::MessageInfo) -> String {
|
||||
}
|
||||
|
||||
// Добавляем основной текст с markdown форматированием
|
||||
result.push_str(&convert_entities_to_markdown(&msg.content, &msg.entities));
|
||||
result.push_str(&convert_entities_to_markdown(msg.text(), msg.entities()));
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user