2026-07-11 13:16:10 +07:00
|
|
|
use ratatui::layout::Rect;
|
|
|
|
|
use ratatui::style::{Style, Modifier};
|
|
|
|
|
use ratatui::text::{Line, Span};
|
|
|
|
|
use ratatui::widgets::Block;
|
|
|
|
|
use ratatui::Frame;
|
|
|
|
|
use super::theme::Theme;
|
|
|
|
|
|
|
|
|
|
pub fn draw_status_bar(frame: &mut Frame, area: Rect, state: &crate::app::state::rest::AppStateRest) {
|
2026-07-12 03:14:52 +07:00
|
|
|
// Connection status — reflects actual agent readiness:
|
|
|
|
|
// PROG → turn is in flight
|
|
|
|
|
// READY → connected and ready
|
|
|
|
|
// NOAPI → disconnected
|
2026-07-12 03:19:25 +07:00
|
|
|
let spinner_frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
2026-07-12 03:14:52 +07:00
|
|
|
let (agent_status, conn_color) = if state.turn_in_flight() {
|
2026-07-12 03:19:25 +07:00
|
|
|
let frame = spinner_frames[(state.misc.tick_count as usize / 2) % spinner_frames.len()];
|
|
|
|
|
(format!("{} PROG", frame), Theme::MODE_YOLO)
|
2026-07-12 03:14:52 +07:00
|
|
|
} else if state.misc.api_connected {
|
2026-07-12 03:19:25 +07:00
|
|
|
("READY".to_string(), Theme::MODE_AUTO)
|
2026-07-12 03:14:52 +07:00
|
|
|
} else {
|
2026-07-12 03:19:25 +07:00
|
|
|
("NOAPI".to_string(), Theme::DIM)
|
2026-07-12 03:14:52 +07:00
|
|
|
};
|
|
|
|
|
let status = Span::styled(
|
|
|
|
|
format!(" {} ", agent_status),
|
2026-07-11 13:16:10 +07:00
|
|
|
Style::default()
|
2026-07-12 03:14:52 +07:00
|
|
|
.fg(if agent_status == "NOAPI" { Theme::DIM } else { Theme::BG })
|
|
|
|
|
.bg(conn_color)
|
2026-07-11 13:16:10 +07:00
|
|
|
.add_modifier(Modifier::BOLD),
|
|
|
|
|
);
|
|
|
|
|
|
2026-07-12 03:14:52 +07:00
|
|
|
// Left chunk: [zesdex] STATUS
|
|
|
|
|
let mut spans = vec![
|
|
|
|
|
Span::styled(" [zesdex] ", Style::default().fg(Theme::TEXT).add_modifier(Modifier::BOLD)),
|
|
|
|
|
status,
|
|
|
|
|
];
|
2026-07-11 13:16:10 +07:00
|
|
|
|
2026-07-12 03:14:52 +07:00
|
|
|
// Right chunk: provider · model
|
|
|
|
|
spans.push(Span::styled(
|
|
|
|
|
format!(" {} · {} ", state.settings.provider, state.settings.model),
|
2026-07-11 13:16:10 +07:00
|
|
|
Style::default().fg(Theme::DIM),
|
2026-07-12 03:14:52 +07:00
|
|
|
));
|
2026-07-11 13:16:10 +07:00
|
|
|
|
2026-07-12 03:14:52 +07:00
|
|
|
let line = Line::from(spans);
|
2026-07-11 13:16:10 +07:00
|
|
|
|
|
|
|
|
let block = Block::default()
|
|
|
|
|
.style(
|
|
|
|
|
Style::default()
|
|
|
|
|
.bg(Theme::STATUS_BAR_BG)
|
|
|
|
|
.fg(Theme::TEXT),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
let paragraph = ratatui::widgets::Paragraph::new(line).block(block);
|
|
|
|
|
frame.render_widget(paragraph, area);
|
|
|
|
|
}
|