This commit is contained in:
Mikhail Kilin
2026-01-24 18:53:35 +03:00
parent 22c4e17377
commit fa749d24c5
7 changed files with 576 additions and 29 deletions

View File

@@ -39,6 +39,14 @@ pub struct App {
// Delete confirmation
/// ID сообщения для подтверждения удаления (показывает модалку)
pub confirm_delete_message_id: Option<i64>,
// Reply state
/// ID сообщения, на которое отвечаем (None = обычная отправка)
pub replying_to_message_id: Option<i64>,
// Forward state
/// ID сообщения для пересылки
pub forwarding_message_id: Option<i64>,
/// Режим выбора чата для пересылки
pub is_selecting_forward_chat: bool,
}
impl App {
@@ -68,6 +76,9 @@ impl App {
editing_message_id: None,
selected_message_index: None,
confirm_delete_message_id: None,
replying_to_message_id: None,
forwarding_message_id: None,
is_selecting_forward_chat: false,
}
}
@@ -123,6 +134,7 @@ impl App {
self.message_scroll_offset = 0;
self.editing_message_id = None;
self.selected_message_index = None;
self.replying_to_message_id = None;
// Очищаем данные в TdClient
self.td_client.current_chat_id = None;
self.td_client.current_chat_messages.clear();
@@ -306,4 +318,62 @@ impl App {
pub fn is_confirm_delete_shown(&self) -> bool {
self.confirm_delete_message_id.is_some()
}
/// Начать режим ответа на выбранное сообщение
pub fn start_reply_to_selected(&mut self) -> bool {
if let Some(msg) = self.get_selected_message() {
self.replying_to_message_id = Some(msg.id);
self.selected_message_index = None;
return true;
}
false
}
/// Отменить режим ответа
pub fn cancel_reply(&mut self) {
self.replying_to_message_id = None;
}
/// Проверить, находимся ли в режиме ответа
pub fn is_replying(&self) -> bool {
self.replying_to_message_id.is_some()
}
/// Получить сообщение, на которое отвечаем
pub fn get_replying_to_message(&self) -> Option<&crate::tdlib::client::MessageInfo> {
self.replying_to_message_id.and_then(|id| {
self.td_client.current_chat_messages.iter().find(|m| m.id == id)
})
}
/// Начать режим пересылки выбранного сообщения
pub fn start_forward_selected(&mut self) -> bool {
if let Some(msg) = self.get_selected_message() {
self.forwarding_message_id = Some(msg.id);
self.selected_message_index = None;
self.is_selecting_forward_chat = true;
// Сбрасываем выбор чата на первый
self.chat_list_state.select(Some(0));
return true;
}
false
}
/// Отменить режим пересылки
pub fn cancel_forward(&mut self) {
self.forwarding_message_id = None;
self.is_selecting_forward_chat = false;
}
/// Проверить, находимся ли в режиме выбора чата для пересылки
pub fn is_forwarding(&self) -> bool {
self.is_selecting_forward_chat && self.forwarding_message_id.is_some()
}
/// Получить сообщение для пересылки
pub fn get_forwarding_message(&self) -> Option<&crate::tdlib::client::MessageInfo> {
self.forwarding_message_id.and_then(|id| {
self.td_client.current_chat_messages.iter().find(|m| m.id == id)
})
}
}