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) <noreply@anthropic.com>
This commit is contained in:
nrobi144
2026-04-29 10:18:13 +03:00
parent f4308ac56d
commit 4b1d468ed0
@@ -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)
}
}
}
}