Major changes: - Remove unused field `selecting_chat` from ChatState::Forward - Remove unused field `start_offset` from WrappedLine in messages.rs - Delete unused functions from modal_handler.rs (ModalAction enum, handle_modal_key, should_close_modal, should_confirm_modal) - Delete unused functions from validation.rs (is_within_length, is_valid_chat_id, is_valid_message_id, is_valid_user_id, has_items, validate_text_input) - Remove unused methods from Keybindings (from_event, matches, get_bindings, add_binding, remove_command) - Delete unused input handlers (chat_list.rs, messages.rs, modal.rs, search.rs) - Remove unused imports across multiple files Performance optimizations: - Fix slow chat opening: load only last 100 messages instead of i32::MAX (10-100x faster) - Reduce timeout from 30s to 10s for initial message load - Fix slow text input: replace O(n) string rebuilding with O(1) String::insert()/remove() operations - Optimize Backspace, Delete, and Char input handlers Bug fixes: - Remove duplicate ChatSortOrder tests after enum deletion - Fix test compilation errors after removing unused methods - Update tests to use get_command() instead of removed matches() method Code cleanup: - Remove ~400 lines of dead code - Remove 12 unused tests - Clean up imports in config/mod.rs, main_input.rs, tdlib/messages.rs Test status: 565 tests passing Warnings reduced from 40+ to 9 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
87 lines
3.1 KiB
Rust
87 lines
3.1 KiB
Rust
//! Modal dialog utilities
|
||
//!
|
||
//! Переиспользуемая логика для обработки модальных окон (диалогов).
|
||
|
||
use crossterm::event::KeyCode;
|
||
|
||
/// Обрабатывает клавиши для подтверждения Yes/No.
|
||
///
|
||
/// Поддерживает:
|
||
/// - `y` / `Y` / `д` / `Д` - да (confirm)
|
||
/// - `n` / `N` / `т` / `Т` - нет (close)
|
||
/// - `Enter` - подтвердить (confirm)
|
||
/// - `Esc` - отменить (close)
|
||
///
|
||
/// # Arguments
|
||
///
|
||
/// * `key_code` - код нажатой клавиши
|
||
///
|
||
/// # Returns
|
||
///
|
||
/// * `Some(true)` - подтверждение (yes/Enter)
|
||
/// * `Some(false)` - отмена (no/Escape)
|
||
/// * `None` - другая клавиша (продолжить ввод)
|
||
///
|
||
/// # Examples
|
||
///
|
||
/// ```
|
||
/// use crossterm::event::KeyCode;
|
||
/// use tele_tui::utils::modal_handler::handle_yes_no;
|
||
///
|
||
/// assert_eq!(handle_yes_no(KeyCode::Char('y')), Some(true));
|
||
/// assert_eq!(handle_yes_no(KeyCode::Char('Y')), Some(true));
|
||
/// assert_eq!(handle_yes_no(KeyCode::Char('н')), Some(true)); // русская 'y'
|
||
/// assert_eq!(handle_yes_no(KeyCode::Enter), Some(true));
|
||
///
|
||
/// assert_eq!(handle_yes_no(KeyCode::Char('n')), Some(false));
|
||
/// assert_eq!(handle_yes_no(KeyCode::Char('т')), Some(false)); // русская 'n'
|
||
/// assert_eq!(handle_yes_no(KeyCode::Esc), Some(false));
|
||
///
|
||
/// assert_eq!(handle_yes_no(KeyCode::Char('a')), None);
|
||
/// ```
|
||
pub fn handle_yes_no(key_code: KeyCode) -> Option<bool> {
|
||
match key_code {
|
||
// Yes - подтверждение (английская и русская раскладка)
|
||
KeyCode::Char('y') | KeyCode::Char('Y') | KeyCode::Char('н') | KeyCode::Char('Н') => {
|
||
Some(true)
|
||
}
|
||
KeyCode::Enter => Some(true),
|
||
|
||
// No - отмена (английская и русская раскладка)
|
||
KeyCode::Char('n') | KeyCode::Char('N') | KeyCode::Char('т') | KeyCode::Char('Т') => {
|
||
Some(false)
|
||
}
|
||
KeyCode::Esc => Some(false),
|
||
|
||
// Другие клавиши - продолжить
|
||
_ => None,
|
||
}
|
||
}
|
||
|
||
#[cfg(test)]
|
||
mod tests {
|
||
use super::*;
|
||
|
||
#[test]
|
||
fn test_handle_yes_no() {
|
||
// Yes variants
|
||
assert_eq!(handle_yes_no(KeyCode::Char('y')), Some(true));
|
||
assert_eq!(handle_yes_no(KeyCode::Char('Y')), Some(true));
|
||
assert_eq!(handle_yes_no(KeyCode::Char('н')), Some(true)); // Russian
|
||
assert_eq!(handle_yes_no(KeyCode::Char('Н')), Some(true)); // Russian
|
||
assert_eq!(handle_yes_no(KeyCode::Enter), Some(true));
|
||
|
||
// No variants
|
||
assert_eq!(handle_yes_no(KeyCode::Char('n')), Some(false));
|
||
assert_eq!(handle_yes_no(KeyCode::Char('N')), Some(false));
|
||
assert_eq!(handle_yes_no(KeyCode::Char('т')), Some(false)); // Russian
|
||
assert_eq!(handle_yes_no(KeyCode::Char('Т')), Some(false)); // Russian
|
||
assert_eq!(handle_yes_no(KeyCode::Esc), Some(false));
|
||
|
||
// Other keys
|
||
assert_eq!(handle_yes_no(KeyCode::Char('a')), None);
|
||
assert_eq!(handle_yes_no(KeyCode::Up), None);
|
||
assert_eq!(handle_yes_no(KeyCode::Char(' ')), None);
|
||
}
|
||
}
|