// Chat state management - type-safe state machine for chat modes use crate::tdlib::{MessageInfo, ProfileInfo}; use crate::types::MessageId; /// Vim-like input mode for chat view #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub enum InputMode { /// Normal mode — navigation and commands (default) #[default] Normal, /// Insert mode — text input only Insert, } /// Состояния чата - взаимоисключающие режимы работы с чатом #[derive(Debug, Clone, Default)] pub enum ChatState { /// Обычный режим - просмотр сообщений, набор текста #[default] Normal, /// Выбор сообщения для действия (edit/delete/reply/forward/reaction) MessageSelection { /// Индекс выбранного сообщения (снизу вверх, 0 = последнее) selected_index: usize, }, /// Редактирование сообщения Editing { /// ID редактируемого сообщения message_id: MessageId, /// Индекс сообщения в списке selected_index: usize, }, /// Ответ на сообщение (reply) Reply { /// ID сообщения, на которое отвечаем message_id: MessageId, }, /// Пересылка сообщения (forward) Forward { /// ID сообщения для пересылки message_id: MessageId, }, /// Подтверждение удаления сообщения DeleteConfirmation { /// ID сообщения для удаления message_id: MessageId, }, /// Выбор реакции на сообщение ReactionPicker { /// ID сообщения для реакции message_id: MessageId, /// Список доступных реакций available_reactions: Vec, /// Индекс выбранной реакции в picker selected_index: usize, }, /// Просмотр профиля пользователя/чата Profile { /// Информация профиля info: ProfileInfo, /// Индекс выбранного действия selected_action: usize, /// Шаг подтверждения выхода из группы (0 = не показано, 1-2 = подтверждения) leave_group_confirmation_step: u8, }, /// Поиск по сообщениям в текущем чате SearchInChat { /// Поисковый запрос query: String, /// Результаты поиска results: Vec, /// Индекс выбранного результата selected_index: usize, }, /// Просмотр закреплённых сообщений PinnedMessages { /// Список закреплённых сообщений messages: Vec, /// Индекс выбранного pinned сообщения selected_index: usize, }, } impl ChatState { /// Проверка: находимся в режиме выбора сообщения pub fn is_message_selection(&self) -> bool { matches!(self, ChatState::MessageSelection { .. }) } /// Проверка: находимся в режиме редактирования pub fn is_editing(&self) -> bool { matches!(self, ChatState::Editing { .. }) } /// Проверка: находимся в режиме ответа pub fn is_reply(&self) -> bool { matches!(self, ChatState::Reply { .. }) } /// Проверка: находимся в режиме пересылки pub fn is_forward(&self) -> bool { matches!(self, ChatState::Forward { .. }) } /// Проверка: показываем подтверждение удаления pub fn is_delete_confirmation(&self) -> bool { matches!(self, ChatState::DeleteConfirmation { .. }) } /// Проверка: показываем reaction picker pub fn is_reaction_picker(&self) -> bool { matches!(self, ChatState::ReactionPicker { .. }) } /// Проверка: показываем профиль pub fn is_profile(&self) -> bool { matches!(self, ChatState::Profile { .. }) } /// Проверка: находимся в режиме поиска по сообщениям pub fn is_search_in_chat(&self) -> bool { matches!(self, ChatState::SearchInChat { .. }) } /// Проверка: показываем pinned сообщения pub fn is_pinned_mode(&self) -> bool { matches!(self, ChatState::PinnedMessages { .. }) } /// Возвращает ID выбранного сообщения (если есть) pub fn selected_message_id(&self) -> Option { match self { ChatState::Editing { message_id, .. } => Some(*message_id), ChatState::Reply { message_id } => Some(*message_id), ChatState::Forward { message_id, .. } => Some(*message_id), ChatState::DeleteConfirmation { message_id } => Some(*message_id), ChatState::ReactionPicker { message_id, .. } => Some(*message_id), _ => None, } } /// Возвращает индекс выбранного сообщения (если есть) pub fn selected_message_index(&self) -> Option { match self { ChatState::MessageSelection { selected_index } => Some(*selected_index), ChatState::Editing { selected_index, .. } => Some(*selected_index), _ => None, } } }