80 lines
2.5 KiB
Rust
80 lines
2.5 KiB
Rust
use ratatui::{
|
|
layout::{Constraint, Direction, Layout, Rect},
|
|
style::{Color, Modifier, Style},
|
|
widgets::{Block, Borders, List, ListItem, Paragraph},
|
|
Frame,
|
|
};
|
|
use crate::app::App;
|
|
|
|
pub fn render(f: &mut Frame, area: Rect, app: &mut App) {
|
|
let chat_chunks = Layout::default()
|
|
.direction(Direction::Vertical)
|
|
.constraints([
|
|
Constraint::Length(3), // Search box
|
|
Constraint::Min(0), // Chat list
|
|
Constraint::Length(3), // User status
|
|
])
|
|
.split(area);
|
|
|
|
// Search box
|
|
let search_text = if app.is_searching {
|
|
if app.search_query.is_empty() {
|
|
"🔍 Введите для поиска...".to_string()
|
|
} else {
|
|
format!("🔍 {}", app.search_query)
|
|
}
|
|
} else {
|
|
"🔍 Ctrl+S для поиска".to_string()
|
|
};
|
|
let search_style = if app.is_searching {
|
|
Style::default().fg(Color::Yellow)
|
|
} else {
|
|
Style::default().fg(Color::DarkGray)
|
|
};
|
|
let search = Paragraph::new(search_text)
|
|
.block(Block::default().borders(Borders::ALL))
|
|
.style(search_style);
|
|
f.render_widget(search, chat_chunks[0]);
|
|
|
|
// Chat list (filtered if searching)
|
|
let filtered_chats = app.get_filtered_chats();
|
|
let items: Vec<ListItem> = filtered_chats
|
|
.iter()
|
|
.map(|chat| {
|
|
let is_selected = app.selected_chat_id == Some(chat.id);
|
|
let prefix = if is_selected { "▌ " } else { " " };
|
|
|
|
let username_text = chat.username.as_ref()
|
|
.map(|u| format!(" {}", u))
|
|
.unwrap_or_default();
|
|
|
|
let unread_badge = if chat.unread_count > 0 {
|
|
format!(" ({})", chat.unread_count)
|
|
} else {
|
|
String::new()
|
|
};
|
|
|
|
let content = format!("{}{}{}{}", prefix, chat.title, username_text, unread_badge);
|
|
let style = Style::default().fg(Color::White);
|
|
|
|
ListItem::new(content).style(style)
|
|
})
|
|
.collect();
|
|
|
|
let chats_list = List::new(items)
|
|
.block(Block::default().borders(Borders::ALL))
|
|
.highlight_style(
|
|
Style::default()
|
|
.add_modifier(Modifier::ITALIC)
|
|
.fg(Color::Yellow),
|
|
);
|
|
|
|
f.render_stateful_widget(chats_list, chat_chunks[1], &mut app.chat_list_state);
|
|
|
|
// User status
|
|
let status = Paragraph::new("[User: Online]")
|
|
.block(Block::default().borders(Borders::ALL))
|
|
.style(Style::default().fg(Color::Green));
|
|
f.render_widget(status, chat_chunks[2]);
|
|
}
|