From 365c4209011d35705c8ebcd6b8cbeb8963172e2c Mon Sep 17 00:00:00 2001 From: Hibryda Date: Wed, 18 Mar 2026 01:21:48 +0100 Subject: [PATCH] fix(settings): replace console.error with handleError + Promise.allSettled - All 6 settings components: save handlers use handleError with user intent - onMount loaders migrated from Promise.all to Promise.allSettled (partial recovery) - loadError $state + inline warning banner on full load failure - JSON parse catches use handleInfraError with explicit fallback comments - Secret operations (reveal/store/delete) use handleError for user feedback --- .../categories/AdvancedSettings.svelte | 28 +++++++------ .../settings/categories/AgentSettings.svelte | 33 ++++++++++------ .../categories/AppearanceSettings.svelte | 39 ++++++++++++------- .../categories/OrchestrationSettings.svelte | 31 +++++++++------ .../categories/ProjectSettings.svelte | 4 +- .../categories/SecuritySettings.svelte | 31 ++++++++++----- 6 files changed, 106 insertions(+), 60 deletions(-) diff --git a/src/lib/settings/categories/AdvancedSettings.svelte b/src/lib/settings/categories/AdvancedSettings.svelte index a82051e..4f89ff0 100644 --- a/src/lib/settings/categories/AdvancedSettings.svelte +++ b/src/lib/settings/categories/AdvancedSettings.svelte @@ -4,6 +4,7 @@ import { getPluginEntries, setPluginEnabled, reloadAllPlugins } from '../../stores/plugins.svelte'; import { checkForUpdates, getCurrentVersion, getLastCheckTimestamp } from '../../utils/updater'; import type { UpdateInfo } from '../../utils/updater'; + import { handleError } from '../../utils/handle-error'; let pluginEntries = $derived(getPluginEntries()); let pluginAutoUpdate = $state(false); @@ -20,9 +21,10 @@ let otlpEndpoint = $state(''); let importFileInput: HTMLInputElement | undefined = $state(); + let loadError = $state(''); onMount(async () => { - const [version, rawAutoUpdate, rawRelays, rawTimeout, rawLog, rawOtlp] = await Promise.all([ + const results = await Promise.allSettled([ getCurrentVersion(), getSetting('plugin_auto_update'), getSetting('relay_urls'), @@ -30,19 +32,21 @@ getSetting('log_level'), getSetting('otlp_endpoint'), ]); - appVersion = version; - pluginAutoUpdate = rawAutoUpdate === 'true'; - relayUrls = rawRelays ?? ''; - connectionTimeout = rawTimeout ? parseInt(rawTimeout, 10) : 30; - if (rawLog === 'trace' || rawLog === 'debug' || rawLog === 'info' || rawLog === 'warn' || rawLog === 'error') logLevel = rawLog; - otlpEndpoint = rawOtlp ?? ''; + let failCount = 0; + if (results[0].status === 'fulfilled') appVersion = results[0].value; else failCount++; + if (results[1].status === 'fulfilled') pluginAutoUpdate = results[1].value === 'true'; else failCount++; + if (results[2].status === 'fulfilled') relayUrls = results[2].value ?? ''; else failCount++; + if (results[3].status === 'fulfilled') connectionTimeout = results[3].value ? parseInt(results[3].value, 10) : 30; else failCount++; + if (results[4].status === 'fulfilled') { const v = results[4].value; if (v === 'trace' || v === 'debug' || v === 'info' || v === 'warn' || v === 'error') logLevel = v; } else failCount++; + if (results[5].status === 'fulfilled') otlpEndpoint = results[5].value ?? ''; else failCount++; + if (failCount === results.length) loadError = 'Could not load settings. Displaying defaults.'; const ts = getLastCheckTimestamp(); if (ts) updateLastCheck = new Date(ts).toLocaleString(); }); async function save(key: string, value: string) { - try { await setSetting(key, value); } catch (e) { console.error(`Failed to save ${key}:`, e); } + try { await setSetting(key, value); } catch (e) { handleError(e, `settings.save.${key}`, 'save your settings'); } } async function handleCheckForUpdates() { @@ -52,14 +56,14 @@ const ts = getLastCheckTimestamp(); if (ts) updateLastCheck = new Date(ts).toLocaleString(); } catch (e) { - console.error('Update check failed:', e); + handleError(e, 'settings.updates.check', 'check for updates'); } finally { updateChecking = false; } } async function handleReloadPlugins() { - try { await reloadAllPlugins(); } catch (e) { console.error('Plugin reload failed:', e); } + try { await reloadAllPlugins(); } catch (e) { handleError(e, 'settings.plugins.reload', 'reload plugins'); } } async function handleExport() { @@ -97,12 +101,13 @@ if (typeof value === 'string') await setSetting(key, value); } } catch (err) { - console.error('Settings import failed:', err); + handleError(err, 'settings.import', 'import settings'); } input.value = ''; } +{#if loadError}

{loadError}

{/if}

Plugins

{#if pluginEntries.length === 0} @@ -239,6 +244,7 @@