Skip to main content

romm_cli/tui/screens/
connected_splash.rs

1//! Full-screen “connected” banner after setup or on successful server contact.
2
3use 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
11/// Shown briefly before the main menu when the server is reachable.
12pub 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}