From 9c856129d83b5341e79eddef61b6a7e0db506d4c Mon Sep 17 00:00:00 2001 From: TZGyn Date: Mon, 18 May 2026 04:04:24 +0800 Subject: [PATCH] add settings page with reset app: clears keychain secrets and SQLite cache --- apps/desktop/src/bun/index.ts | 29 +++++++++ .../src/lib/components/EvmDashboard.svelte | 4 ++ apps/desktop/src/lib/electrobun.ts | 4 ++ apps/desktop/src/lib/states/wallet.svelte.ts | 19 ++++++ apps/desktop/src/routes/settings.svelte | 61 +++++++++++++++++++ 5 files changed, 117 insertions(+) create mode 100644 apps/desktop/src/routes/settings.svelte diff --git a/apps/desktop/src/bun/index.ts b/apps/desktop/src/bun/index.ts index 2a83881..8be7c6c 100644 --- a/apps/desktop/src/bun/index.ts +++ b/apps/desktop/src/bun/index.ts @@ -28,6 +28,13 @@ import { MoneroWalletManager, } from './lib/monero' import { canPromptTouchID, promptTouchID } from './lib/biometric' +import { sqlite } from './lib/sqlite' +import { + tokenMetadata, + transactions, + transactionReceipts, + txHistory, +} from './lib/db/schema' const env = getENV() @@ -134,6 +141,10 @@ type TxEntry = { type RPC = { bun: RPCSchema<{ requests: { + resetApp: { + params: {} + response: boolean + } biometricCanAuth: { params: {} response: boolean @@ -366,6 +377,24 @@ const rpc = BrowserView.defineRPC({ maxRequestTime: 120000, handlers: { requests: { + resetApp: async () => { + try { + await Promise.all([ + Bun.secrets.delete({ service: 'koins', name: 'vault' }), + Bun.secrets.delete({ service: 'koins', name: 'vault_password' }), + Bun.secrets.delete({ service: 'koins', name: 'alchemy_key' }), + ]) + sqlite.run('DELETE FROM token_metadata') + sqlite.run('DELETE FROM transactions') + sqlite.run('DELETE FROM transaction_receipts') + sqlite.run('DELETE FROM tx_history') + console.log('[rpc] resetApp complete') + return true + } catch (e) { + console.log('[rpc] resetApp error:', e) + return false + } + }, biometricCanAuth: async () => { try { return canPromptTouchID() diff --git a/apps/desktop/src/lib/components/EvmDashboard.svelte b/apps/desktop/src/lib/components/EvmDashboard.svelte index 98a5b51..30ed49d 100644 --- a/apps/desktop/src/lib/components/EvmDashboard.svelte +++ b/apps/desktop/src/lib/components/EvmDashboard.svelte @@ -14,6 +14,7 @@ import ArrowDown from '@lucide/svelte/icons/arrow-down' import ArrowUp from '@lucide/svelte/icons/arrow-up' import QrCodeIcon from '@lucide/svelte/icons/qr-code' + import SettingsIcon from '@lucide/svelte/icons/settings' import Fingerprint from '@lucide/svelte/icons/fingerprint' import * as Dialog from '$lib/components/ui/dialog/index.js' import QRCode from 'qrcode' @@ -252,6 +253,9 @@ + diff --git a/apps/desktop/src/lib/electrobun.ts b/apps/desktop/src/lib/electrobun.ts index 564a5d4..e3da15d 100644 --- a/apps/desktop/src/lib/electrobun.ts +++ b/apps/desktop/src/lib/electrobun.ts @@ -92,6 +92,10 @@ export type TokenBalanceResult = { type RPC = { bun: { requests: { + resetApp: { + params: {} + response: boolean + } biometricCanAuth: { params: {} response: boolean diff --git a/apps/desktop/src/lib/states/wallet.svelte.ts b/apps/desktop/src/lib/states/wallet.svelte.ts index ad2b0c9..224427e 100644 --- a/apps/desktop/src/lib/states/wallet.svelte.ts +++ b/apps/desktop/src/lib/states/wallet.svelte.ts @@ -199,6 +199,24 @@ export const Wallet = () => { } } + const resetApp = async () => { + if (!electrobun.rpc) return false + const [ok] = await tryCatch( + electrobun.rpc.request.resetApp({}), + ) + if (!ok) return false + seed = '' + address = '' + balance = '0' + error = '' + tokenBalances = [] + transactions = [] + apiKey = '' + vaultExists = false + passwordHash = '' + return true + } + const setPassword = async (password: string) => { if (!electrobun.rpc) return const ph = await hashPassword(password) @@ -473,6 +491,7 @@ export const Wallet = () => { unlockWithBiometrics, unlockWithPassword, setPassword, + resetApp, saveVault, switchNetwork, saveApiKey, diff --git a/apps/desktop/src/routes/settings.svelte b/apps/desktop/src/routes/settings.svelte new file mode 100644 index 0000000..cffacf6 --- /dev/null +++ b/apps/desktop/src/routes/settings.svelte @@ -0,0 +1,61 @@ + + +
+
+ + + Settings + App preferences and data management + + +
+

Reset App

+

+ Removes your seed, API key, and all cached data from the keychain + and database. You can then set up the wallet fresh. +

+
+ {#if confirm} +
+

Are you sure?

+ + +
+ {:else} + + {/if} +
+
+
+
+
+