Skip to main content

git_same/setup/screens/
complete.rs

1//! Step 6: Completion / success screen.
2
3use crate::setup::state::SetupState;
4use ratatui::layout::{Constraint, Layout, Rect};
5use ratatui::style::{Color, Modifier, Style};
6use ratatui::text::{Line, Span};
7use ratatui::widgets::Paragraph;
8use ratatui::Frame;
9
10pub fn render(state: &SetupState, frame: &mut Frame, area: Rect) {
11    let chunks = Layout::vertical([
12        Constraint::Length(3), // Title
13        Constraint::Min(10),   // Content
14        Constraint::Length(2), // Help
15    ])
16    .split(area);
17
18    // Title
19    let title_text = if state.is_first_setup {
20        "Workspace Created!"
21    } else {
22        "Workspace Added!"
23    };
24    let title = Paragraph::new(Line::from(vec![
25        Span::styled(
26            "  \u{2713} ",
27            Style::default()
28                .fg(Color::Rgb(21, 128, 61))
29                .add_modifier(Modifier::BOLD),
30        ),
31        Span::styled(
32            title_text,
33            Style::default()
34                .fg(Color::Rgb(21, 128, 61))
35                .add_modifier(Modifier::BOLD),
36        ),
37    ]));
38    frame.render_widget(title, chunks[0]);
39
40    // Summary
41    let selected_orgs = state.selected_orgs();
42    let total_repos: usize = state
43        .orgs
44        .iter()
45        .filter(|o| o.selected)
46        .map(|o| o.repo_count)
47        .sum();
48    let org_count = selected_orgs.len();
49
50    let value_style = Style::default()
51        .fg(Color::White)
52        .add_modifier(Modifier::BOLD);
53    let dim = Style::default().fg(Color::DarkGray);
54    let yellow = Style::default().fg(Color::Yellow);
55
56    let lines = vec![
57        Line::raw(""),
58        Line::from(Span::styled(format!("  {}", state.base_path), value_style)),
59        Line::from(Span::styled(
60            format!(
61                "  {} organization{}  \u{00b7}  {} repos",
62                org_count,
63                if org_count == 1 { "" } else { "s" },
64                total_repos
65            ),
66            dim,
67        )),
68        Line::raw(""),
69        Line::raw(""),
70        Line::from(Span::styled("  Press Enter to continue", yellow)),
71    ];
72
73    let content = Paragraph::new(lines);
74    frame.render_widget(content, chunks[1]);
75
76    // Help
77    let help = Paragraph::new("Enter Dashboard  Esc Back").style(dim);
78    frame.render_widget(help, chunks[2]);
79}
80
81#[cfg(test)]
82#[path = "complete_tests.rs"]
83mod tests;