Skip to main content

codetether_agent/tui/ui/chat_view/
render.rs

1//! Chat view orchestrator.
2//!
3//! [`render_chat_view`] is the single entry-point called from
4//! [`crate::tui::ui::main`]. Composes layout, lines, input, and status.
5
6use ratatui::Frame;
7
8use super::attachment::attachment_suffix;
9use super::input_area::render_input;
10use super::layout_compute::compute_chat_chunks;
11use super::lines::build_chat_lines;
12use super::messages::render_messages;
13use super::status_line::render_status_line;
14use super::suggestions::render_suggestions;
15use crate::session::Session;
16use crate::tui::app::state::App;
17use crate::tui::color_palette::ColorPalette;
18use crate::tui::message_formatter::MessageFormatter;
19
20/// Top-level chat view renderer.
21///
22/// # Examples
23///
24/// ```rust,no_run
25/// # use codetether_agent::tui::ui::chat_view::render_chat_view;
26/// # fn d(f:&mut ratatui::Frame,a:&mut codetether_agent::tui::app::state::App,s:&codetether_agent::session::Session){ render_chat_view(f,a,s); }
27/// ```
28pub fn render_chat_view(f: &mut Frame, app: &mut App, session: &Session) {
29    let chunks = compute_chat_chunks(f.area(), app);
30    let palette = ColorPalette::marketing();
31    let formatter = MessageFormatter::new(chunks.messages.width.saturating_sub(4) as usize);
32    let max_width = chunks.messages.width as usize;
33    let lines = build_chat_lines(app, max_width, max_width, &formatter, &palette);
34    render_messages(f, app, session, &chunks, &palette, lines);
35    let suffix = attachment_suffix(app);
36    render_input(f, app, chunks.input, &palette, &suffix);
37    if let Some(rect) = chunks.suggestions {
38        render_suggestions(f, app, rect);
39    }
40    render_status_line(f, app, chunks.status);
41    crate::tui::help::render_help_overlay_if_needed(f, &mut app.state);
42}