This commit is contained in:
Mikhail Kilin
2026-01-30 23:55:01 +03:00
parent 433233d766
commit bba5cbd22d
25 changed files with 5896 additions and 1469 deletions

View File

@@ -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)]

View File

@@ -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 {