use std::time::Duration;
use ratatui::layout::Rect;
use ratatui::style::{Modifier, Style};
use ratatui::text::{Line, Span};
use ratatui::widgets::Paragraph;
use ratatui::Frame;
use crate::engine::models::TestPhase;
use crate::tui::animation::spinner_frame;
use crate::tui::theme::Theme;
use crate::utils::format::{format_duration, format_eta};
#[derive(Debug, Clone, Copy)]
pub struct StatusInfo<'a> {
pub phase: Option<TestPhase>,
pub server: &'a str,
pub tick: u64,
pub elapsed: Duration,
pub eta: Option<Duration>,
}
pub fn render(frame: &mut Frame, area: Rect, theme: &Theme, info: &StatusInfo) {
if area.height == 0 {
return;
}
let colors = &theme.colors;
let left = match info.phase {
Some(phase) => Line::from(vec![
Span::styled(
format!(" {} ", spinner_frame(info.tick)),
Style::default().fg(colors.accent),
),
Span::styled(
phase.label(),
Style::default()
.fg(colors.text)
.add_modifier(Modifier::BOLD),
),
]),
None => Line::from(Span::styled(
" ✓ Complete",
Style::default().fg(colors.success),
)),
};
frame.render_widget(Paragraph::new(left), area);
frame.render_widget(
Paragraph::new(
Line::from(Span::styled(
info.server.to_owned(),
Style::default().fg(colors.subtext),
))
.centered(),
),
area,
);
let mut right = vec![Span::styled(
format_duration(info.elapsed),
Style::default().fg(colors.subtext),
)];
if let Some(eta) = info.eta {
right.push(Span::styled(" eta ", Style::default().fg(colors.muted)));
right.push(Span::styled(
format_eta(eta),
Style::default().fg(colors.subtext),
));
}
right.push(Span::raw(" "));
frame.render_widget(Paragraph::new(Line::from(right).right_aligned()), area);
}