kwaak 0.6.0

Run a team of autonomous agents on your code, right from your terminal
Documentation
use ratatui::prelude::*;
use ratatui::widgets::{Block, Borders, HighlightSpacing, List, ListItem, Padding};

use crate::chat::Chat;
use crate::frontend::App;

pub struct ChatListWidget;

impl ChatListWidget {
    pub fn render(f: &mut ratatui::Frame, app: &mut App, area: Rect) {
        let list: List = app
            .chats
            .iter()
            .map(format_chat_in_list)
            .collect::<List>()
            .highlight_spacing(HighlightSpacing::Always)
            .highlight_style(Style::default().fg(Color::Yellow).bg(Color::DarkGray))
            .block(
                Block::default()
                    .title("Chats".bold())
                    .title_alignment(Alignment::Center)
                    .borders(Borders::TOP | Borders::RIGHT)
                    .padding(Padding::horizontal(1)),
            );

        f.render_stateful_widget(list, area, &mut app.chats_state);
    }
}

fn format_chat_in_list(chat: &Chat) -> ListItem {
    const LOADING: &str = "";
    const CAN_MESSAGE: &str = "󰍩";
    const NEW_MESSAGE: &str = "󱥁";
    const MESSAGE_LOCK: &str = "󱅳";

    let prefix = if chat.is_loading() && chat.new_message_count > 0 {
        MESSAGE_LOCK
    } else if chat.is_loading() {
        LOADING
    } else if chat.new_message_count > 0 {
        NEW_MESSAGE
    } else {
        CAN_MESSAGE
    };

    ListItem::from(format!("{prefix}  {name}", name = chat.name))
}