From a7ec8e6d0409cd271e35b8e5563b1ddee7598196 Mon Sep 17 00:00:00 2001 From: Fabrice Bellamy Date: Mon, 19 Jan 2026 13:04:03 +0100 Subject: [PATCH] Display error instead of when there was an error communicating with pcscd --- src-tauri/src/io.rs | 14 +-- src-tauri/src/rescue/mod.rs | 5 +- .../components/device/NoDeviceStatus.svelte | 23 ++++ src/lib/device/manager.svelte.ts | 7 +- src/lib/layout/sidebar.svelte | 104 +++++++++++++++--- src/lib/views/configView.svelte | 7 +- src/lib/views/homeView.svelte | 7 +- src/lib/views/passkeysView.svelte | 7 +- 8 files changed, 132 insertions(+), 42 deletions(-) create mode 100644 src/lib/components/device/NoDeviceStatus.svelte diff --git a/src-tauri/src/io.rs b/src-tauri/src/io.rs index b136115..555f68a 100644 --- a/src-tauri/src/io.rs +++ b/src-tauri/src/io.rs @@ -46,14 +46,14 @@ pub fn reboot(to_bootsel: bool) -> Result { #[tauri::command] pub async fn get_credentials(pin: String) -> Result, String> { - tauri::async_runtime::spawn_blocking(move || { - fido::get_credentials(pin) - }).await.map_err(|e| e.to_string())? + tauri::async_runtime::spawn_blocking(move || fido::get_credentials(pin)) + .await + .map_err(|e| e.to_string())? } #[tauri::command] pub async fn delete_credential(pin: String, credential_id: String) -> Result { - tauri::async_runtime::spawn_blocking(move || { - fido::delete_credential(pin, credential_id) - }).await.map_err(|e| e.to_string())? -} \ No newline at end of file + tauri::async_runtime::spawn_blocking(move || fido::delete_credential(pin, credential_id)) + .await + .map_err(|e| e.to_string())? +} diff --git a/src-tauri/src/rescue/mod.rs b/src-tauri/src/rescue/mod.rs index 1506118..af12fd6 100644 --- a/src-tauri/src/rescue/mod.rs +++ b/src-tauri/src/rescue/mod.rs @@ -12,7 +12,10 @@ use std::io::Cursor; /// Connects to the first available reader and selects the Rescue Applet fn connect_and_select() -> Result<(pcsc::Card, Vec), PFError> { - let ctx = Context::establish(Scope::User)?; + let ctx = Context::establish(Scope::User).map_err(|e| { + log::error!("Failed to establish PCSC context: {}", e); + PFError::Pcsc(e) + })?; let mut readers_buf = [0; 2048]; let mut readers = ctx.list_readers(&mut readers_buf)?; diff --git a/src/lib/components/device/NoDeviceStatus.svelte b/src/lib/components/device/NoDeviceStatus.svelte new file mode 100644 index 0000000..12bde5c --- /dev/null +++ b/src/lib/components/device/NoDeviceStatus.svelte @@ -0,0 +1,23 @@ + + + + + {device.error ? "Connection Error" : "No Device Connected"} + + {device.error || message} + + diff --git a/src/lib/device/manager.svelte.ts b/src/lib/device/manager.svelte.ts index 4cd7010..402edcf 100644 --- a/src/lib/device/manager.svelte.ts +++ b/src/lib/device/manager.svelte.ts @@ -15,6 +15,7 @@ class DeviceManager { loading = $state(false); connected = $state(false); fidoInfo: FidoInfo | null = $state(null); + error: string | null = $state(null); credentials: StoredCredential[] = $state([]); unlocked = $state(false); @@ -38,6 +39,7 @@ class DeviceManager { async refresh() { this.loading = true; + this.error = null; try { logger.add("Attempting to connect to device...", "info"); @@ -66,10 +68,13 @@ class DeviceManager { logger.add(`Device Connected! Serial: ${this.info.serial}, FW: v${this.info.firmwareVersion}`, "success"); } this.connected = true; - } catch (err) { + } catch (err: any) { console.error("Connection failed:", err); + this.error = err; if (this.connected) { logger.add(`Connection lost: ${err}`, "error"); + } else { + logger.add(`Connection failed: ${err}`, "error"); } this.connected = false; } finally { diff --git a/src/lib/layout/sidebar.svelte b/src/lib/layout/sidebar.svelte index e1c9587..f508ccb 100644 --- a/src/lib/layout/sidebar.svelte +++ b/src/lib/layout/sidebar.svelte @@ -2,7 +2,19 @@ import { onMount } from "svelte"; import { getCurrentWindow } from "@tauri-apps/api/window"; - import { Home, Info, KeyRound, Maximize, Minimize, Minus, RefreshCw, ScrollText, Settings, ShieldCheck, X } from "@lucide/svelte"; + import { + Home, + Info, + KeyRound, + Maximize, + Minimize, + Minus, + RefreshCw, + ScrollText, + Settings, + ShieldCheck, + X, + } from "@lucide/svelte"; import type { Component } from "svelte"; import { Button } from "$lib/components/ui/button"; @@ -52,10 +64,10 @@ isMaximized = maximized; }); }; - + handleResize(); window.addEventListener("resize", handleResize); - + return () => { window.removeEventListener("resize", handleResize); }; @@ -66,8 +78,15 @@
- PicoForge Logo - PicoForge + PicoForge Logo + PicoForge
@@ -78,7 +97,10 @@ {#each menuItems as item} - onViewChange(item.view)}> + onViewChange(item.view)} + > {item.label} @@ -89,18 +111,40 @@ - +
- Device Status + Device Status {#if device.connected} - Online + Online + {:else if device.error} + Error {:else} - Offline + Offline {/if}
-
-
-
+
-
+
- -