fixes
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
// Chat state management - type-safe state machine for chat modes
|
||||
|
||||
use crate::tdlib::client::MessageInfo;
|
||||
use crate::tdlib::ProfileInfo;
|
||||
use crate::tdlib::{MessageInfo, ProfileInfo};
|
||||
|
||||
/// Состояния чата - взаимоисключающие режимы работы с чатом
|
||||
#[derive(Debug, Clone)]
|
||||
|
||||
@@ -4,8 +4,7 @@ mod state;
|
||||
pub use chat_state::ChatState;
|
||||
pub use state::AppScreen;
|
||||
|
||||
use crate::tdlib::client::ChatInfo;
|
||||
use crate::tdlib::TdClient;
|
||||
use crate::tdlib::{ChatInfo, TdClient};
|
||||
use ratatui::widgets::ListState;
|
||||
|
||||
pub struct App {
|
||||
@@ -125,15 +124,15 @@ impl App {
|
||||
// Сбрасываем состояние чата в нормальный режим
|
||||
self.chat_state = ChatState::Normal;
|
||||
// Очищаем данные в 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;
|
||||
self.td_client.set_current_chat_id(None);
|
||||
self.td_client.current_chat_messages_mut().clear();
|
||||
self.td_client.set_typing_status(None);
|
||||
self.td_client.set_current_pinned_message(None);
|
||||
}
|
||||
|
||||
/// Начать выбор сообщения для редактирования (при стрелке вверх в пустом инпуте)
|
||||
pub fn start_message_selection(&mut self) {
|
||||
if self.td_client.current_chat_messages.is_empty() {
|
||||
if self.td_client.current_chat_messages().is_empty() {
|
||||
return;
|
||||
}
|
||||
// Начинаем с последнего сообщения (индекс 0 = самое новое снизу)
|
||||
@@ -142,7 +141,7 @@ impl App {
|
||||
|
||||
/// Выбрать предыдущее сообщение (вверх по списку = увеличить индекс)
|
||||
pub fn select_previous_message(&mut self) {
|
||||
let total = self.td_client.current_chat_messages.len();
|
||||
let total = self.td_client.current_chat_messages().len();
|
||||
if total == 0 {
|
||||
return;
|
||||
}
|
||||
@@ -163,14 +162,14 @@ impl App {
|
||||
}
|
||||
|
||||
/// Получить выбранное сообщение
|
||||
pub fn get_selected_message(&self) -> Option<&crate::tdlib::client::MessageInfo> {
|
||||
pub fn get_selected_message(&self) -> Option<&crate::tdlib::MessageInfo> {
|
||||
self.chat_state.selected_message_index().and_then(|idx| {
|
||||
let total = self.td_client.current_chat_messages.len();
|
||||
let total = self.td_client.current_chat_messages().len();
|
||||
if total == 0 || idx >= total {
|
||||
return None;
|
||||
}
|
||||
// idx=0 это последнее сообщение (total-1), idx=1 это предпоследнее (total-2), и т.д.
|
||||
self.td_client.current_chat_messages.get(total - 1 - idx)
|
||||
self.td_client.current_chat_messages().get(total - 1 - idx)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -346,10 +345,10 @@ impl App {
|
||||
}
|
||||
|
||||
/// Получить сообщение, на которое отвечаем
|
||||
pub fn get_replying_to_message(&self) -> Option<&crate::tdlib::client::MessageInfo> {
|
||||
pub fn get_replying_to_message(&self) -> Option<&crate::tdlib::MessageInfo> {
|
||||
self.chat_state.selected_message_id().and_then(|id| {
|
||||
self.td_client
|
||||
.current_chat_messages
|
||||
.current_chat_messages()
|
||||
.iter()
|
||||
.find(|m| m.id == id)
|
||||
})
|
||||
@@ -380,13 +379,13 @@ impl App {
|
||||
}
|
||||
|
||||
/// Получить сообщение для пересылки
|
||||
pub fn get_forwarding_message(&self) -> Option<&crate::tdlib::client::MessageInfo> {
|
||||
pub fn get_forwarding_message(&self) -> Option<&crate::tdlib::MessageInfo> {
|
||||
if !self.chat_state.is_forward() {
|
||||
return None;
|
||||
}
|
||||
self.chat_state.selected_message_id().and_then(|id| {
|
||||
self.td_client
|
||||
.current_chat_messages
|
||||
.current_chat_messages()
|
||||
.iter()
|
||||
.find(|m| m.id == id)
|
||||
})
|
||||
@@ -400,7 +399,7 @@ impl App {
|
||||
}
|
||||
|
||||
/// Войти в режим pinned (вызывается после загрузки pinned сообщений)
|
||||
pub fn enter_pinned_mode(&mut self, messages: Vec<crate::tdlib::client::MessageInfo>) {
|
||||
pub fn enter_pinned_mode(&mut self, messages: Vec<crate::tdlib::MessageInfo>) {
|
||||
if !messages.is_empty() {
|
||||
self.chat_state = ChatState::PinnedMessages {
|
||||
messages,
|
||||
@@ -437,7 +436,7 @@ impl App {
|
||||
}
|
||||
|
||||
/// Получить текущее выбранное pinned сообщение
|
||||
pub fn get_selected_pinned(&self) -> Option<&crate::tdlib::client::MessageInfo> {
|
||||
pub fn get_selected_pinned(&self) -> Option<&crate::tdlib::MessageInfo> {
|
||||
if let ChatState::PinnedMessages {
|
||||
messages,
|
||||
selected_index,
|
||||
@@ -476,7 +475,7 @@ impl App {
|
||||
}
|
||||
|
||||
/// Установить результаты поиска
|
||||
pub fn set_search_results(&mut self, results: Vec<crate::tdlib::client::MessageInfo>) {
|
||||
pub fn set_search_results(&mut self, results: Vec<crate::tdlib::MessageInfo>) {
|
||||
if let ChatState::SearchInChat { results: r, selected_index, .. } = &mut self.chat_state {
|
||||
*r = results;
|
||||
*selected_index = 0;
|
||||
@@ -507,7 +506,7 @@ impl App {
|
||||
}
|
||||
|
||||
/// Получить текущий выбранный результат
|
||||
pub fn get_selected_search_result(&self) -> Option<&crate::tdlib::client::MessageInfo> {
|
||||
pub fn get_selected_search_result(&self) -> Option<&crate::tdlib::MessageInfo> {
|
||||
if let ChatState::SearchInChat {
|
||||
results,
|
||||
selected_index,
|
||||
@@ -551,7 +550,7 @@ impl App {
|
||||
}
|
||||
|
||||
/// Получить результаты поиска
|
||||
pub fn get_search_results(&self) -> Option<&[crate::tdlib::client::MessageInfo]> {
|
||||
pub fn get_search_results(&self) -> Option<&[crate::tdlib::MessageInfo]> {
|
||||
if let ChatState::SearchInChat { results, .. } = &self.chat_state {
|
||||
Some(results.as_slice())
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user