From 992d2a4d0622ebbd3e77976bcdc85927c7daca47 Mon Sep 17 00:00:00 2001 From: Joseph Montanaro Date: Thu, 14 Sep 2023 15:04:25 -0700 Subject: [PATCH] show non-fatal setup errors on home screen instead of in popup --- package.json | 2 +- src-tauri/Cargo.lock | 2 +- src-tauri/Cargo.toml | 2 +- src-tauri/src/app.rs | 17 ++++++++++++----- src-tauri/src/errors.rs | 9 +++++++++ src-tauri/src/ipc.rs | 6 ++++++ src-tauri/src/state.rs | 11 ++++++++++- src-tauri/tauri.conf.json | 2 +- src/App.svelte | 7 ++++++- src/lib/state.js | 1 + src/views/Home.svelte | 15 ++++++++++++++- 11 files changed, 62 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index aadb93e..a44d7a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "creddy", - "version": "0.3.1", + "version": "0.3.2", "scripts": { "dev": "vite", "build": "vite build", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 7bab8e8..c03df5c 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1035,7 +1035,7 @@ dependencies = [ [[package]] name = "creddy" -version = "0.3.1" +version = "0.3.2" dependencies = [ "argon2", "auto-launch", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 59be51e..f9c4b47 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "creddy" -version = "0.3.1" +version = "0.3.2" description = "A friendly AWS credentials manager" authors = ["Joseph Montanaro"] license = "" diff --git a/src-tauri/src/app.rs b/src-tauri/src/app.rs index e4a2a67..63cc441 100644 --- a/src-tauri/src/app.rs +++ b/src-tauri/src/app.rs @@ -43,6 +43,7 @@ pub fn run() -> tauri::Result<()> { ipc::get_config, ipc::save_config, ipc::launch_terminal, + ipc::get_setup_errors, ]) .setup(|app| rt::block_on(setup(app))) .build(tauri::generate_context!())? @@ -77,14 +78,15 @@ async fn setup(app: &mut App) -> Result<(), Box> { // get_or_create_db_path doesn't create the actual db file, just the directory let is_first_launch = !config::get_or_create_db_path()?.exists(); - let pool = connect_db().await?; + let mut setup_errors: Vec = vec![]; let conf = match AppConfig::load(&pool).await { Ok(c) => c, Err(SetupError::ConfigParseError(_)) => { - Err("Could not load configuration from database. Reverting to defaults.") - .error_popup("Setup error"); + setup_errors.push( + "Could not load configuration from database. Reverting to defaults.".into() + ); AppConfig::default() }, err => err?, @@ -94,7 +96,12 @@ async fn setup(app: &mut App) -> Result<(), Box> { let srv = Server::new(conf.listen_addr, conf.listen_port, app.handle()).await?; config::set_auto_launch(conf.start_on_login)?; - config::register_hotkeys(&conf.hotkeys).error_popup("Setup error"); + if let Err(_e) = config::set_auto_launch(conf.start_on_login) { + setup_errors.push("Error: Failed to manage autolaunch.".into()); + } + if let Err(e) = config::register_hotkeys(&conf.hotkeys) { + setup_errors.push(format!("{e}")); + } // if session is empty, this is probably the first launch, so don't autohide if !conf.start_minimized || is_first_launch { @@ -103,7 +110,7 @@ async fn setup(app: &mut App) -> Result<(), Box> { .show()?; } - let state = AppState::new(conf, session, srv, pool); + let state = AppState::new(conf, session, srv, pool, setup_errors); app.manage(state); Ok(()) } diff --git a/src-tauri/src/errors.rs b/src-tauri/src/errors.rs index 266f3fd..f56a2df 100644 --- a/src-tauri/src/errors.rs +++ b/src-tauri/src/errors.rs @@ -22,6 +22,7 @@ use serde::{Serialize, Serializer, ser::SerializeMap}; pub trait ErrorPopup { fn error_popup(self, title: &str); + fn error_popup_nowait(self, title: &str); } impl ErrorPopup for Result<(), E> { @@ -35,6 +36,14 @@ impl ErrorPopup for Result<(), E> { rx.recv().unwrap(); } } + + fn error_popup_nowait(self, title: &str) { + if let Err(e) = self { + MessageDialogBuilder::new(title, format!("{e}")) + .kind(MessageDialogKind::Error) + .show(|_| {}) + } + } } diff --git a/src-tauri/src/ipc.rs b/src-tauri/src/ipc.rs index eef4754..0b9428d 100644 --- a/src-tauri/src/ipc.rs +++ b/src-tauri/src/ipc.rs @@ -85,3 +85,9 @@ pub async fn save_config(config: AppConfig, app_state: State<'_, AppState>) -> R pub async fn launch_terminal(base: bool) -> Result<(), LaunchTerminalError> { terminal::launch(base).await } + + +#[tauri::command] +pub async fn get_setup_errors(app_state: State<'_, AppState>) -> Result, ()> { + Ok(app_state.setup_errors.clone()) +} diff --git a/src-tauri/src/state.rs b/src-tauri/src/state.rs index 90038cd..eda9a81 100644 --- a/src-tauri/src/state.rs +++ b/src-tauri/src/state.rs @@ -30,12 +30,20 @@ pub struct AppState { pub waiting_requests: RwLock>, pub pending_terminal_request: RwLock, pub bans: RwLock>>, + // setup_errors is never modified and so doesn't need to be wrapped in RwLock + pub setup_errors: Vec, server: RwLock, pool: sqlx::SqlitePool, } impl AppState { - pub fn new(config: AppConfig, session: Session, server: Server, pool: SqlitePool) -> AppState { + pub fn new( + config: AppConfig, + session: Session, + server: Server, + pool: SqlitePool, + setup_errors: Vec, + ) -> AppState { AppState { config: RwLock::new(config), session: RwLock::new(session), @@ -43,6 +51,7 @@ impl AppState { waiting_requests: RwLock::new(HashMap::new()), pending_terminal_request: RwLock::new(false), bans: RwLock::new(HashSet::new()), + setup_errors, server: RwLock::new(server), pool, } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 5c857f7..6bb2ca5 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -8,7 +8,7 @@ }, "package": { "productName": "creddy", - "version": "0.3.1" + "version": "0.3.2" }, "tauri": { "allowlist": { diff --git a/src/App.svelte b/src/App.svelte index 891ff8a..66659e6 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -28,7 +28,12 @@ listen('launch-terminal-request', async (tauriEvent) => { // else, session is unlocked, so do nothing // (although we shouldn't even get the event in that case) } -}) +}); + +invoke('get_setup_errors') + .then(errs => { + $appState.setupErrors = errs.map(e => ({msg: e, show: true})); + }); acceptRequest(); diff --git a/src/lib/state.js b/src/lib/state.js index 8850c57..3c3d0b2 100644 --- a/src/lib/state.js +++ b/src/lib/state.js @@ -8,6 +8,7 @@ export let appState = writable({ currentRequest: null, pendingRequests: queue(), credentialStatus: 'locked', + setupErrors: [], }); diff --git a/src/views/Home.svelte b/src/views/Home.svelte index c9b24cf..a37d042 100644 --- a/src/views/Home.svelte +++ b/src/views/Home.svelte @@ -51,4 +51,17 @@ {/if} {/await} - \ No newline at end of file + + +{#if $appState.setupErrors.some(e => e.show)} +
+ {#each $appState.setupErrors as error} + {#if error.show} +
+ {error.msg} + +
+ {/if} + {/each} +
+{/if} \ No newline at end of file