add pinned messages

This commit is contained in:
Mikhail Kilin
2026-01-27 04:38:29 +03:00
parent 4d5625f950
commit 81dc5b9007
5 changed files with 395 additions and 13 deletions

View File

@@ -50,6 +50,13 @@ pub struct App {
// Typing indicator
/// Время последней отправки typing status (для throttling)
pub last_typing_sent: Option<std::time::Instant>,
// Pinned messages mode
/// Режим просмотра закреплённых сообщений
pub is_pinned_mode: bool,
/// Список закреплённых сообщений
pub pinned_messages: Vec<crate::tdlib::client::MessageInfo>,
/// Индекс выбранного pinned сообщения
pub selected_pinned_index: usize,
}
impl App {
@@ -83,6 +90,9 @@ impl App {
forwarding_message_id: None,
is_selecting_forward_chat: false,
last_typing_sent: None,
is_pinned_mode: false,
pinned_messages: Vec::new(),
selected_pinned_index: 0,
}
}
@@ -140,10 +150,15 @@ impl App {
self.selected_message_index = None;
self.replying_to_message_id = None;
self.last_typing_sent = None;
// Сбрасываем pinned режим
self.is_pinned_mode = false;
self.pinned_messages.clear();
self.selected_pinned_index = 0;
// Очищаем данные в TdClient
self.td_client.current_chat_id = None;
self.td_client.current_chat_messages.clear();
self.td_client.typing_status = None;
self.td_client.current_pinned_message = None;
}
/// Начать выбор сообщения для редактирования (при стрелке вверх в пустом инпуте)
@@ -382,4 +397,51 @@ impl App {
self.td_client.current_chat_messages.iter().find(|m| m.id == id)
})
}
// === Pinned messages mode ===
/// Проверка режима pinned
pub fn is_pinned_mode(&self) -> bool {
self.is_pinned_mode
}
/// Войти в режим pinned (вызывается после загрузки pinned сообщений)
pub fn enter_pinned_mode(&mut self, messages: Vec<crate::tdlib::client::MessageInfo>) {
if !messages.is_empty() {
self.pinned_messages = messages;
self.selected_pinned_index = 0;
self.is_pinned_mode = true;
}
}
/// Выйти из режима pinned
pub fn exit_pinned_mode(&mut self) {
self.is_pinned_mode = false;
self.pinned_messages.clear();
self.selected_pinned_index = 0;
}
/// Выбрать предыдущий pinned (вверх = более старый)
pub fn select_previous_pinned(&mut self) {
if !self.pinned_messages.is_empty() && self.selected_pinned_index < self.pinned_messages.len() - 1 {
self.selected_pinned_index += 1;
}
}
/// Выбрать следующий pinned (вниз = более новый)
pub fn select_next_pinned(&mut self) {
if self.selected_pinned_index > 0 {
self.selected_pinned_index -= 1;
}
}
/// Получить текущее выбранное pinned сообщение
pub fn get_selected_pinned(&self) -> Option<&crate::tdlib::client::MessageInfo> {
self.pinned_messages.get(self.selected_pinned_index)
}
/// Получить ID текущего pinned для перехода в историю
pub fn get_selected_pinned_id(&self) -> Option<i64> {
self.get_selected_pinned().map(|m| m.id)
}
}