romm_cli/tui/screens/
connected_splash.rs1use std::time::{Duration, Instant};
4
5use ratatui::layout::{Alignment, Rect};
6use ratatui::style::{Color, Modifier, Style};
7use ratatui::text::{Line, Span};
8use ratatui::widgets::{Block, Borders, Paragraph};
9use ratatui::Frame;
10
11pub struct StartupSplash {
13 pub base_url: String,
14 pub server_version: Option<String>,
15 started: Instant,
16}
17
18impl StartupSplash {
19 pub fn new(base_url: String, server_version: Option<String>) -> Self {
20 Self {
21 base_url,
22 server_version,
23 started: Instant::now(),
24 }
25 }
26
27 pub fn should_auto_dismiss(&self) -> bool {
28 self.started.elapsed() > Duration::from_millis(2800)
29 }
30}
31
32pub fn render(f: &mut Frame, area: Rect, splash: &StartupSplash) {
33 let ver_line = splash
34 .server_version
35 .as_ref()
36 .map(|v| format!("RomM server version: {v}"))
37 .unwrap_or_else(|| "Connected (heartbeat version unavailable)".to_string());
38
39 let lines = vec![
40 Line::from(vec![Span::styled(
41 "✓ Connected",
42 Style::default()
43 .fg(Color::Green)
44 .add_modifier(Modifier::BOLD),
45 )]),
46 Line::from(""),
47 Line::from(Span::styled(
48 splash.base_url.to_string(),
49 Style::default().fg(Color::White),
50 )),
51 Line::from(Span::styled(ver_line, Style::default().fg(Color::DarkGray))),
52 Line::from(""),
53 Line::from(Span::styled(
54 "Enter or Esc — continue",
55 Style::default().fg(Color::Cyan),
56 )),
57 ];
58
59 let p = Paragraph::new(lines).alignment(Alignment::Center).block(
60 Block::default()
61 .title("romm-cli")
62 .borders(Borders::ALL)
63 .border_style(Style::default().fg(Color::Green)),
64 );
65 f.render_widget(p, area);
66}