sorts pubkeys in the relay management and fixes issues on duplicated keys for the lazy column

This commit is contained in:
Vitor Pamplona
2026-03-28 19:23:23 -04:00
parent dbd0fe03fa
commit 7290f16d0d
@@ -23,11 +23,11 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.relays.nip86
import androidx.compose.runtime.Stable import androidx.compose.runtime.Stable
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.LocalCache
import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.amethyst.model.nip86RelayManagement.Nip86Retriever import com.vitorpamplona.amethyst.model.nip86RelayManagement.Nip86Retriever
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner
import com.vitorpamplona.quartz.nip86RelayManagement.Nip86Client import com.vitorpamplona.quartz.nip86RelayManagement.Nip86Client
import com.vitorpamplona.quartz.nip86RelayManagement.rpc.AllowedPubkey import com.vitorpamplona.quartz.nip86RelayManagement.rpc.AllowedPubkey
import com.vitorpamplona.quartz.nip86RelayManagement.rpc.BannedEvent import com.vitorpamplona.quartz.nip86RelayManagement.rpc.BannedEvent
@@ -52,10 +52,10 @@ class PubkeyUser(
@Stable @Stable
class RelayManagementViewModel( class RelayManagementViewModel(
relayUrl: NormalizedRelayUrl, relayUrl: NormalizedRelayUrl,
signer: NostrSigner, account: Account,
private val retriever: Nip86Retriever, private val retriever: Nip86Retriever,
) : ViewModel() { ) : ViewModel() {
val client = Nip86Client(relayUrl, signer) val client = Nip86Client(relayUrl, account.signer)
private val _supportedMethods = MutableStateFlow<ImmutableList<String>>(persistentListOf()) private val _supportedMethods = MutableStateFlow<ImmutableList<String>>(persistentListOf())
val supportedMethods: StateFlow<ImmutableList<String>> = _supportedMethods val supportedMethods: StateFlow<ImmutableList<String>> = _supportedMethods
@@ -80,16 +80,18 @@ class RelayManagementViewModel(
val bannedPubkeyUsers: Flow<List<PubkeyUser>> = val bannedPubkeyUsers: Flow<List<PubkeyUser>> =
_bannedPubkeys.map { list -> _bannedPubkeys.map { list ->
list.mapNotNull { entry -> list
LocalCache.checkGetOrCreateUser(entry.pubkey)?.let { PubkeyUser(it, entry.reason) } .mapNotNull { entry ->
} LocalCache.checkGetOrCreateUser(entry.pubkey)?.let { PubkeyUser(it, entry.reason) }
}.sortedByDescending { account.isKnown(it.user) }
} }
val allowedPubkeyUsers: Flow<List<PubkeyUser>> = val allowedPubkeyUsers: Flow<List<PubkeyUser>> =
_allowedPubkeys.map { list -> _allowedPubkeys.map { list ->
list.mapNotNull { entry -> list
LocalCache.checkGetOrCreateUser(entry.pubkey)?.let { PubkeyUser(it, entry.reason) } .mapNotNull { entry ->
} LocalCache.checkGetOrCreateUser(entry.pubkey)?.let { PubkeyUser(it, entry.reason) }
}.sortedByDescending { account.isKnown(it.user) }
} }
private val _isLoading = MutableStateFlow(false) private val _isLoading = MutableStateFlow(false)
@@ -118,7 +120,7 @@ class RelayManagementViewModel(
if (response.error != null) { if (response.error != null) {
_error.value = response.error _error.value = response.error
} else { } else {
_bannedPubkeys.value = client.parseBannedPubkeys(response) ?: emptyList() _bannedPubkeys.value = client.parseBannedPubkeys(response)?.distinctBy { it.pubkey } ?: emptyList()
} }
} }
} }
@@ -129,7 +131,7 @@ class RelayManagementViewModel(
if (response.error != null) { if (response.error != null) {
_error.value = response.error _error.value = response.error
} else { } else {
_allowedPubkeys.value = client.parseAllowedPubkeys(response) ?: emptyList() _allowedPubkeys.value = client.parseAllowedPubkeys(response)?.distinctBy { it.pubkey } ?: emptyList()
} }
} }
} }
@@ -140,7 +142,7 @@ class RelayManagementViewModel(
if (response.error != null) { if (response.error != null) {
_error.value = response.error _error.value = response.error
} else { } else {
_bannedEvents.value = client.parseBannedEvents(response) ?: emptyList() _bannedEvents.value = client.parseBannedEvents(response)?.distinctBy { it.id } ?: emptyList()
} }
} }
} }
@@ -151,7 +153,7 @@ class RelayManagementViewModel(
if (response.error != null) { if (response.error != null) {
_error.value = response.error _error.value = response.error
} else { } else {
_eventsNeedingModeration.value = client.parseEventsNeedingModeration(response) ?: emptyList() _eventsNeedingModeration.value = client.parseEventsNeedingModeration(response)?.distinctBy { it.id } ?: emptyList()
} }
} }
} }
@@ -162,7 +164,7 @@ class RelayManagementViewModel(
if (response.error != null) { if (response.error != null) {
_error.value = response.error _error.value = response.error
} else { } else {
_allowedKinds.value = client.parseAllowedKinds(response) ?: emptyList() _allowedKinds.value = client.parseAllowedKinds(response)?.distinctBy { it } ?: emptyList()
} }
} }
} }
@@ -173,7 +175,7 @@ class RelayManagementViewModel(
if (response.error != null) { if (response.error != null) {
_error.value = response.error _error.value = response.error
} else { } else {
_blockedIps.value = client.parseBlockedIps(response) ?: emptyList() _blockedIps.value = client.parseBlockedIps(response)?.distinctBy { it.ip } ?: emptyList()
} }
} }
} }