From 4b1d468ed0fcee2fa1e2c2f83605f05bae9af191 Mon Sep 17 00:00:00 2001 From: nrobi144 Date: Wed, 29 Apr 2026 10:18:13 +0300 Subject: [PATCH] fix(multi-account): fetch metadata for all accounts, persist display names Display names weren't showing because metadata was never requested for account pubkeys. Now: 1. LaunchedEffect triggers loadMetadataForPubkeys() for all accounts in the switcher once relays connect 2. metadataVersion collector persists display names for ALL accounts (not just active one) when metadata arrives from relays 3. Names available immediately on next dropdown open Co-Authored-By: Claude Opus 4.6 (1M context) --- .../vitorpamplona/amethyst/desktop/Main.kt | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) 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 972d90c7fb..8e9a9965bc 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt @@ -673,15 +673,37 @@ fun App( } } - // Persist display name when metadata arrives from relays (debounced) + // Fetch metadata for all accounts in the switcher + persist display names + val allAccountsForMetadata by accountManager.allAccounts.collectAsState() + LaunchedEffect(allAccountsForMetadata, accountState) { + if (accountState !is AccountState.LoggedIn) return@LaunchedEffect + // Wait for relay connections before requesting metadata + relayManager.connectedRelays.first { it.isNotEmpty() } + // Request metadata for all account pubkeys + val pubkeys = + allAccountsForMetadata.mapNotNull { info -> + com.vitorpamplona.quartz.nip19Bech32 + .decodePublicKeyAsHexOrNull(info.npub) + } + if (pubkeys.isNotEmpty()) { + subscriptionsCoordinator.loadMetadataForPubkeys(pubkeys) + } + } + + // Persist display names when metadata arrives (debounced) LaunchedEffect(Unit) { localCache.metadataVersion.collect { - kotlinx.coroutines.delay(2000) // debounce — wait for batch of metadata to settle - val current = accountManager.currentAccount() ?: return@collect - val user = localCache.getUserIfExists(current.pubKeyHex) ?: return@collect - val name = user.toBestDisplayName() - if (name != user.pubkeyDisplayHex()) { - accountManager.updateDisplayName(current.npub, name) + kotlinx.coroutines.delay(3000) + val accounts = accountManager.allAccounts.value + for (info in accounts) { + val hex = + com.vitorpamplona.quartz.nip19Bech32 + .decodePublicKeyAsHexOrNull(info.npub) ?: continue + val user = localCache.getUserIfExists(hex) ?: continue + val name = user.toBestDisplayName() + if (name != user.pubkeyDisplayHex() && name != info.displayName) { + accountManager.updateDisplayName(info.npub, name) + } } } }