Skip to main content

git_same/setup/screens/
confirm.rs

1//! Step 5: Review and save screen with bordered summary card.
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::{Block, Borders, 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::Length(8), // Summary card
14        Constraint::Min(3),    // Info + error
15    ])
16    .split(area);
17
18    // Title
19    let title = Paragraph::new(Line::from(Span::styled(
20        "  Review Workspace Configuration",
21        Style::default()
22            .fg(Color::Cyan)
23            .add_modifier(Modifier::BOLD),
24    )));
25    frame.render_widget(title, chunks[0]);
26
27    // Summary card
28    let provider = state.selected_provider();
29    let selected_orgs = state.selected_orgs();
30    let orgs_display = if selected_orgs.is_empty() {
31        "all organizations".to_string()
32    } else if selected_orgs.len() <= 3 {
33        selected_orgs.join(", ")
34    } else {
35        format!(
36            "{}, ... +{} more",
37            selected_orgs[..2].join(", "),
38            selected_orgs.len() - 2
39        )
40    };
41
42    let label_style = Style::default().fg(Color::DarkGray);
43    let value_style = Style::default()
44        .fg(Color::White)
45        .add_modifier(Modifier::BOLD);
46
47    let summary_lines = vec![
48        Line::from(vec![
49            Span::styled("  Provider      ", label_style),
50            Span::styled(provider.display_name(), value_style),
51        ]),
52        Line::from(vec![
53            Span::styled("  Username      ", label_style),
54            Span::styled(
55                format!("@{}", state.username.as_deref().unwrap_or("unknown")),
56                value_style,
57            ),
58        ]),
59        Line::from(vec![
60            Span::styled("  Base Path     ", label_style),
61            Span::styled(&state.base_path, value_style),
62        ]),
63        Line::from(vec![
64            Span::styled("  Organizations ", label_style),
65            Span::styled(&orgs_display, value_style),
66        ]),
67    ];
68
69    let summary = Paragraph::new(summary_lines).block(
70        Block::default()
71            .borders(Borders::ALL)
72            .border_style(Style::default().fg(Color::DarkGray)),
73    );
74    frame.render_widget(summary, chunks[1]);
75
76    // Info + error
77    let mut info_lines: Vec<Line> = Vec::new();
78    info_lines.push(Line::raw(""));
79    info_lines.push(Line::from(Span::styled(
80        format!("  Config will be saved to: {}/.git-same/", state.base_path),
81        Style::default().fg(Color::DarkGray),
82    )));
83    info_lines.push(Line::raw(""));
84    info_lines.push(Line::from(Span::styled(
85        "  Press Enter to save and continue",
86        Style::default().fg(Color::Yellow),
87    )));
88
89    if let Some(ref err) = state.error_message {
90        info_lines.push(Line::raw(""));
91        info_lines.push(Line::from(Span::styled(
92            format!("  Error: {}", err),
93            Style::default().fg(Color::Red),
94        )));
95    }
96
97    frame.render_widget(Paragraph::new(info_lines), chunks[2]);
98}
99
100#[cfg(test)]
101#[path = "confirm_tests.rs"]
102mod tests;