From ba0fc67a943a352ebafb32d583bff2bf6e2e1efd Mon Sep 17 00:00:00 2001 From: KotlinGeekDev Date: Thu, 25 Sep 2025 18:24:31 +0100 Subject: [PATCH] First hack for bolting follow sets onto follows, for determining if a user follows another. --- .../vitorpamplona/amethyst/model/Account.kt | 20 +++++++++++++++++++ .../reqCommand/user/UserObservers.kt | 7 +++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 3191aae0a..05abfd8e3 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -21,6 +21,7 @@ package com.vitorpamplona.amethyst.model import androidx.compose.runtime.Stable +import androidx.compose.ui.util.fastAny import com.vitorpamplona.amethyst.BuildConfig import com.vitorpamplona.amethyst.LocalPreferences import com.vitorpamplona.amethyst.commons.richtext.RichTextParser @@ -119,6 +120,7 @@ import com.vitorpamplona.quartz.experimental.profileGallery.mimeType import com.vitorpamplona.quartz.nip01Core.core.AddressableEvent import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.HexKey +import com.vitorpamplona.quartz.nip01Core.core.value import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair import com.vitorpamplona.quartz.nip01Core.hints.AddressHintProvider import com.vitorpamplona.quartz.nip01Core.hints.EventHintBundle @@ -215,6 +217,7 @@ import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import java.math.BigDecimal import java.util.Locale @@ -838,6 +841,23 @@ class Account( return@withContext followSetNotes } + fun isUserInFollowSets(user: User): Boolean = + runBlocking(scope.coroutineContext) { + LocalCache.getFollowSetNotesFor(userProfile()).fastAny { it -> + val listEvent = it.event as PeopleListEvent + val isInPublicSets = + listEvent + .publicPeople() + .fastAny { it.toTagArray().value() == user.pubkeyHex } + val isInPrivateSets = + listEvent + .privatePeople(signer) + ?.fastAny { it.toTagArray().value() == user.pubkeyHex } ?: false + + isInPublicSets || isInPrivateSets + } + } + fun mapNoteToFollowSet(note: Note): FollowSet = FollowSet .mapEventToSet( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/UserObservers.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/UserObservers.kt index 7430f3489..b2ece59d3 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/UserObservers.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/UserObservers.kt @@ -420,12 +420,15 @@ fun observeUserIsFollowing( .follows.stateFlow .sample(1000) .mapLatest { userState -> - userState.user.isFollowing(user2) + userState.user.isFollowing(user2) || + accountViewModel.account.isUserInFollowSets(user2) }.distinctUntilChanged() .flowOn(Dispatchers.Default) } - return flow.collectAsStateWithLifecycle(user1.isFollowing(user2)) + return flow.collectAsStateWithLifecycle( + user1.isFollowing(user2) || accountViewModel.account.isUserInFollowSets(user2), + ) } @SuppressLint("StateFlowValueCalledInComposition")