Skip to main content

codetether_agent/tui/ui/chat_view/
messages.rs

1//! Scrollable messages panel renderer.
2//!
3//! Composes the block title (via [`build_title`]), scroll clamping (via
4//! [`clamp_scroll`]), and the wrapped [`Paragraph`] widget.
5
6use ratatui::{
7    Frame,
8    style::Style,
9    text::Line,
10    widgets::{Block, Borders, Paragraph},
11};
12
13use crate::session::Session;
14use crate::tui::app::state::App;
15use crate::tui::color_palette::ColorPalette;
16
17use super::layout_chunks::ChatChunks;
18use super::scroll::clamp_scroll;
19use super::title::build_title;
20
21/// Render the chat messages block with title, borders, and scroll.
22///
23/// # Examples
24///
25/// ```rust,no_run
26/// use codetether_agent::tui::ui::chat_view::messages::render_messages;
27/// # fn demo(f: &mut ratatui::Frame, app: &mut codetether_agent::tui::app::state::App, sess: &codetether_agent::session::Session) {
28/// let pal = codetether_agent::tui::color_palette::ColorPalette::marketing();
29/// let chunks = codetether_agent::tui::ui::chat_view::layout_compute::compute_chat_chunks(f.area(), app);
30/// render_messages(f, app, sess, &chunks, &pal, vec![]);
31/// # }
32/// ```
33pub fn render_messages(
34    f: &mut Frame,
35    app: &mut App,
36    session: &Session,
37    chunks: &ChatChunks,
38    palette: &ColorPalette,
39    lines: Vec<Line<'static>>,
40) {
41    let block = Block::default()
42        .borders(Borders::ALL)
43        .border_style(Style::default().fg(palette.border))
44        .title(build_title(app, session));
45    let scroll = clamp_scroll(app, chunks.messages, &lines);
46    let chat = Paragraph::new(lines).block(block).scroll((scroll, 0));
47    f.render_widget(chat, chunks.messages);
48}