This commit is contained in:
Mikhail Kilin
2026-01-20 14:54:30 +03:00
parent 699f50a59c
commit 9912ac11bd
8 changed files with 232 additions and 48 deletions

View File

@@ -25,6 +25,9 @@ pub struct App {
pub folders: Vec<String>,
pub selected_folder: usize,
pub is_loading: bool,
// Search state
pub is_searching: bool,
pub search_query: String,
}
impl App {
@@ -49,6 +52,8 @@ impl App {
folders: vec!["All".to_string()],
selected_folder: 0,
is_loading: true,
is_searching: false,
search_query: String::new(),
}
}
@@ -115,4 +120,80 @@ impl App {
self.selected_chat_id
.and_then(|id| self.chats.iter().find(|c| c.id == id))
}
pub fn start_search(&mut self) {
self.is_searching = true;
self.search_query.clear();
}
pub fn cancel_search(&mut self) {
self.is_searching = false;
self.search_query.clear();
self.chat_list_state.select(Some(0));
}
pub fn get_filtered_chats(&self) -> Vec<&ChatInfo> {
if self.search_query.is_empty() {
self.chats.iter().collect()
} else {
let query = self.search_query.to_lowercase();
self.chats
.iter()
.filter(|c| {
// Поиск по названию чата
c.title.to_lowercase().contains(&query) ||
// Поиск по username (@...)
c.username.as_ref()
.map(|u| u.to_lowercase().contains(&query))
.unwrap_or(false)
})
.collect()
}
}
pub fn next_filtered_chat(&mut self) {
let filtered = self.get_filtered_chats();
if filtered.is_empty() {
return;
}
let i = match self.chat_list_state.selected() {
Some(i) => {
if i >= filtered.len() - 1 {
0
} else {
i + 1
}
}
None => 0,
};
self.chat_list_state.select(Some(i));
}
pub fn previous_filtered_chat(&mut self) {
let filtered = self.get_filtered_chats();
if filtered.is_empty() {
return;
}
let i = match self.chat_list_state.selected() {
Some(i) => {
if i == 0 {
filtered.len() - 1
} else {
i - 1
}
}
None => 0,
};
self.chat_list_state.select(Some(i));
}
pub fn select_filtered_chat(&mut self) {
let filtered = self.get_filtered_chats();
if let Some(i) = self.chat_list_state.selected() {
if let Some(chat) = filtered.get(i) {
self.selected_chat_id = Some(chat.id);
self.cancel_search();
}
}
}
}