use ratatui::{ layout::{Constraint, Direction, Layout, Rect}, style::{Color, Modifier, Style}, text::{Line, Span}, widgets::{Block, Borders, Paragraph}, Frame, }; use crate::app::App; use super::{chat_list, messages, footer}; /// Порог ширины для компактного режима (одна панель) const COMPACT_WIDTH: u16 = 80; pub fn render(f: &mut Frame, app: &mut App) { let area = f.area(); let is_compact = area.width < COMPACT_WIDTH; let chunks = Layout::default() .direction(Direction::Vertical) .constraints([ Constraint::Length(3), // Folders/tabs Constraint::Min(0), // Main content Constraint::Length(1), // Commands footer ]) .split(area); render_folders(f, chunks[0], app); if is_compact { // Компактный режим: показываем либо список чатов, либо открытый чат if app.selected_chat_id.is_some() { // Чат открыт — показываем только сообщения messages::render(f, chunks[1], app); } else { // Чат не открыт — показываем только список чатов chat_list::render(f, chunks[1], app); } } else { // Обычный режим: две панели let main_chunks = Layout::default() .direction(Direction::Horizontal) .constraints([ Constraint::Percentage(30), // Chat list Constraint::Percentage(70), // Messages area ]) .split(chunks[1]); chat_list::render(f, main_chunks[0], app); messages::render(f, main_chunks[1], app); } footer::render(f, chunks[2], app); } fn render_folders(f: &mut Frame, area: Rect, app: &App) { let mut spans = vec![]; // "All" всегда первая (клавиша 1) let all_style = if app.selected_folder_id.is_none() { Style::default() .fg(Color::Yellow) .add_modifier(Modifier::BOLD) } else { Style::default().fg(Color::White) }; spans.push(Span::styled(" 1:All ", all_style)); // Папки из TDLib (клавиши 2, 3, 4...) for (i, folder) in app.td_client.folders.iter().enumerate() { spans.push(Span::raw("│")); let style = if app.selected_folder_id == Some(folder.id) { Style::default() .fg(Color::Yellow) .add_modifier(Modifier::BOLD) } else { Style::default().fg(Color::White) }; spans.push(Span::styled(format!(" {}:{} ", i + 2, folder.name), style)); } let folders_line = Line::from(spans); let folders_widget = Paragraph::new(folders_line).block( Block::default() .title(" TTUI ") .borders(Borders::ALL), ); f.render_widget(folders_widget, area); }