From 573b478bbc9b5e399939461db0b7c1918599aaa9 Mon Sep 17 00:00:00 2001 From: nrobi144 Date: Tue, 28 Apr 2026 14:16:47 +0300 Subject: [PATCH] fix(multi-account): preserve existing account when adding new one - ensureCurrentAccountInStorage(): saves current account metadata to encrypted storage before switching to new account via AddAccountDialog - AddAccountDialog calls ensureCurrentAccountInStorage() before each login method to prevent losing the previous account - LoginScreen onLoginSuccess now calls refreshAccountList() so the switcher dropdown picks up the initial account immediately Co-Authored-By: Claude Opus 4.6 (1M context) --- .../vitorpamplona/amethyst/desktop/Main.kt | 4 ++++ .../desktop/account/AccountManager.kt | 11 ++++++++++ .../desktop/ui/account/AddAccountDialog.kt | 21 ++++++++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt index c1543da02..59ef6d07c 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt @@ -708,6 +708,10 @@ fun App( if (current?.signerType is com.vitorpamplona.amethyst.commons.model.account.SignerType.Remote) { accountManager.startHeartbeat(scope) } + // Refresh account list for switcher + scope.launch(Dispatchers.IO) { + accountManager.refreshAccountList() + } }, ) } diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/account/AccountManager.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/account/AccountManager.kt index cc3c00b5f..905fb1540 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/account/AccountManager.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/account/AccountManager.kt @@ -637,6 +637,17 @@ class AccountManager internal constructor( refreshAccountList() } + /** + * Ensures the currently logged-in account is persisted in multi-account storage. + * Call before switching to a new account to avoid losing the current one. + */ + suspend fun ensureCurrentAccountInStorage() { + val current = currentAccount() ?: return + val info = AccountInfo(npub = current.npub, signerType = current.signerType) + accountStorage.saveAccount(info) + accountStorage.setCurrentAccount(current.npub) + } + suspend fun removeAccountFromStorage(npub: String) { val current = currentAccount() accountStorage.deleteAccount(npub) diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/account/AddAccountDialog.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/account/AddAccountDialog.kt index 4764a1c6f..9aaf5f629 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/account/AddAccountDialog.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/account/AddAccountDialog.kt @@ -88,6 +88,12 @@ fun AddAccountDialog( ) { LoginCard( onLogin = { keyInput -> + // Save current account before switching + scope.launch { + withContext(Dispatchers.IO) { + accountManager.ensureCurrentAccountInStorage() + } + } accountManager.loginWithKey(keyInput).map { scope.launch { withContext(Dispatchers.IO) { accountManager.saveCurrentAccount() } @@ -96,18 +102,31 @@ fun AddAccountDialog( } }, onGenerateNew = { - accountManager.generateNewAccount() scope.launch { + withContext(Dispatchers.IO) { + accountManager.ensureCurrentAccountInStorage() + } + accountManager.generateNewAccount() withContext(Dispatchers.IO) { accountManager.saveCurrentAccount() } onAccountAdded() } }, onLoginBunker = { bunkerUri -> + scope.launch { + withContext(Dispatchers.IO) { + accountManager.ensureCurrentAccountInStorage() + } + } accountManager.loginWithBunker(bunkerUri).map { onAccountAdded() } }, onLoginNostrConnect = { onUriGenerated -> + scope.launch { + withContext(Dispatchers.IO) { + accountManager.ensureCurrentAccountInStorage() + } + } accountManager.loginWithNostrConnect(onUriGenerated).map { onAccountAdded() }