git_same/setup/screens/
confirm.rs1use 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), Constraint::Length(8), Constraint::Min(3), ])
16 .split(area);
17
18 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 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 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;