Skip to content

Commit 5f0290d

Browse files
committed
added a progress layer when the UI is loading. this enhances the UX
1 parent c14ef70 commit 5f0290d

3 files changed

Lines changed: 61 additions & 11 deletions

File tree

src/main.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,30 +232,57 @@ async fn main() -> Result<()> {
232232
None => {
233233
// Launch TUI
234234
let password = prompt_password("Enter master password")?;
235+
236+
let mut terminal = match tui::init_terminal() {
237+
Ok(t) => t,
238+
Err(e) => {
239+
eprintln!("Failed to initialize terminal: {}", e);
240+
std::process::exit(1);
241+
}
242+
};
243+
244+
let _ = tui::draw_loading(&mut terminal, "Authenticating with GitHub...");
245+
235246
let repo_name = match config::Config::get_repo_name_with_profile(
236247
effective_profile.as_deref(),
237248
&password,
238249
) {
239250
Ok(name) => name,
240251
Err(e) => {
252+
let _ = tui::restore_terminal(terminal);
241253
eprintln!("Configuration missing or master password incorrect: {}", e);
242254
std::process::exit(1);
243255
}
244256
};
257+
245258
let storage = match storage::Storage::new_with_profile(
246259
effective_profile.as_deref(),
247260
&repo_name,
248261
&password,
249262
).await {
250263
Ok(s) => s,
251264
Err(e) => {
265+
let _ = tui::restore_terminal(terminal);
252266
eprintln!("Failed to initialize storage: {}", e);
253267
std::process::exit(1);
254268
}
255269
};
256-
let master_key = get_or_init_master_key(&storage, &password).await?;
270+
271+
let _ = tui::draw_loading(&mut terminal, "Fetching and verifying master key...");
272+
let master_key = match get_or_init_master_key(&storage, &password).await {
273+
Ok(k) => k,
274+
Err(e) => {
275+
let _ = tui::restore_terminal(terminal);
276+
eprintln!("Failed to get master key: {}", e);
277+
std::process::exit(1);
278+
}
279+
};
257280

258-
tui::run(storage, master_key).await?;
281+
let _ = tui::draw_loading(&mut terminal, "Downloading keys from GitHub...");
282+
if let Err(e) = tui::run(terminal, storage, master_key).await {
283+
eprintln!("TUI error: {}", e);
284+
std::process::exit(1);
285+
}
259286
return Ok(());
260287
}
261288
};

src/tui/mod.rs

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,49 @@ pub mod ui;
1616
use app::App;
1717
use crate::storage::Storage;
1818

19-
pub async fn run(storage: Storage, master_key: String) -> Result<()> {
20-
// setup terminal
19+
pub type TuiTerminal = Terminal<CrosstermBackend<std::io::Stdout>>;
20+
21+
pub fn init_terminal() -> Result<TuiTerminal> {
2122
enable_raw_mode()?;
2223
let mut stdout = io::stdout();
2324
execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
2425
let backend = CrosstermBackend::new(stdout);
25-
let mut terminal = Terminal::new(backend)?;
26-
27-
// create app and run it
28-
let mut app = App::new(storage, master_key).await?;
29-
let res = run_app(&mut terminal, &mut app).await;
26+
Terminal::new(backend).map_err(Into::into)
27+
}
3028

31-
// restore terminal
29+
pub fn restore_terminal(mut terminal: TuiTerminal) -> Result<()> {
3230
disable_raw_mode()?;
3331
execute!(
3432
terminal.backend_mut(),
3533
LeaveAlternateScreen,
3634
DisableMouseCapture
3735
)?;
3836
terminal.show_cursor()?;
37+
Ok(())
38+
}
39+
40+
pub fn draw_loading(terminal: &mut TuiTerminal, msg: &str) -> Result<()> {
41+
terminal.draw(|f| {
42+
use ratatui::{
43+
style::{Color, Style},
44+
widgets::{Block, Borders, Paragraph, Clear},
45+
};
46+
let area = ui::centered_rect(50, 20, f.area());
47+
f.render_widget(Clear, area);
48+
let block = Block::default().title("Loading").borders(Borders::ALL);
49+
let paragraph = Paragraph::new(msg).block(block).style(Style::default().fg(Color::Cyan));
50+
f.render_widget(paragraph, area);
51+
})?;
52+
Ok(())
53+
}
54+
55+
pub async fn run(mut terminal: TuiTerminal, storage: Storage, master_key: String) -> Result<()> {
56+
// create app and run it
57+
let mut app = App::new(storage, master_key).await?;
58+
let res = run_app(&mut terminal, &mut app).await;
59+
60+
// restore terminal
61+
restore_terminal(terminal)?;
3962

4063
if let Err(err) = res {
4164
println!("{:?}", err);

src/tui/ui.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ pub fn draw(f: &mut Frame, app: &mut App) {
158158
}
159159
}
160160

161-
fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect {
161+
pub fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect {
162162
let popup_layout = Layout::default()
163163
.direction(Direction::Vertical)
164164
.constraints(

0 commit comments

Comments
 (0)