Fixes community join/leave issue

This commit is contained in:
Vitor Pamplona
2025-08-21 14:06:47 -04:00
parent 1ef9902ece
commit 816de5bf03
5 changed files with 24 additions and 29 deletions

View File

@@ -22,9 +22,12 @@ package com.vitorpamplona.amethyst.model.topNavFeeds.noteBased.community
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import com.vitorpamplona.amethyst.model.topNavFeeds.IFeedTopNavPerRelayFilter import com.vitorpamplona.amethyst.model.topNavFeeds.IFeedTopNavPerRelayFilter
import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address
@Immutable @Immutable
class SingleCommunityTopNavPerRelayFilter( class SingleCommunityTopNavPerRelayFilter(
val community: String, val community: String,
val authors: Set<String>?, val authors: Set<String>?,
) : IFeedTopNavPerRelayFilter ) : IFeedTopNavPerRelayFilter {
val communityAddress = Address.parse(community)
}

View File

@@ -54,7 +54,6 @@ import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.observeNoteEvent import com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.observeNoteEvent
import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage
import com.vitorpamplona.amethyst.ui.components.TranslatableRichTextViewer import com.vitorpamplona.amethyst.ui.components.TranslatableRichTextViewer
import com.vitorpamplona.amethyst.ui.navigation.navs.EmptyNav.scope
import com.vitorpamplona.amethyst.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.navigation.navs.INav
import com.vitorpamplona.amethyst.ui.navigation.routes.routeFor import com.vitorpamplona.amethyst.ui.navigation.routes.routeFor
import com.vitorpamplona.amethyst.ui.note.ClickableUserPicture import com.vitorpamplona.amethyst.ui.note.ClickableUserPicture
@@ -87,8 +86,6 @@ import com.vitorpamplona.quartz.nip72ModCommunities.definition.CommunityDefiniti
import com.vitorpamplona.quartz.nip72ModCommunities.definition.tags.ModeratorTag import com.vitorpamplona.quartz.nip72ModCommunities.definition.tags.ModeratorTag
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.util.Locale import java.util.Locale
@Composable @Composable
@@ -362,10 +359,10 @@ fun WatchAddressableNoteFollows(
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
onFollowChanges: @Composable (Boolean) -> Unit, onFollowChanges: @Composable (Boolean) -> Unit,
) { ) {
val state by accountViewModel.account.kind3FollowList.flow val state by accountViewModel.account.communityList.flowSet
.collectAsStateWithLifecycle() .collectAsStateWithLifecycle()
onFollowChanges(state.communities.contains(note.idHex)) onFollowChanges(state.contains(note.idHex))
} }
@Composable @Composable
@@ -376,16 +373,9 @@ fun JoinCommunityButton(
) { ) {
Button( Button(
modifier = Modifier.padding(horizontal = 3.dp), modifier = Modifier.padding(horizontal = 3.dp),
onClick = { onClick = { accountViewModel.follow(note) },
scope.launch(Dispatchers.IO) {
accountViewModel.follow(note)
}
},
shape = ButtonBorder, shape = ButtonBorder,
colors = colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.primary),
ButtonDefaults.buttonColors(
containerColor = MaterialTheme.colorScheme.primary,
),
contentPadding = ButtonPadding, contentPadding = ButtonPadding,
) { ) {
Text(text = stringRes(R.string.join), color = Color.White) Text(text = stringRes(R.string.join), color = Color.White)
@@ -402,7 +392,7 @@ fun LeaveCommunityButton(
Button( Button(
modifier = Modifier.padding(horizontal = 3.dp), modifier = Modifier.padding(horizontal = 3.dp),
onClick = { scope.launch(Dispatchers.IO) { accountViewModel.account.unfollow(note) } }, onClick = { accountViewModel.unfollow(note) },
shape = ButtonBorder, shape = ButtonBorder,
colors = colors =
ButtonDefaults.buttonColors( ButtonDefaults.buttonColors(

View File

@@ -42,7 +42,7 @@ fun filterCommunitiesAllCommunities(
filter = filter =
Filter( Filter(
kinds = CommunityPostApprovalEvent.KIND_LIST, kinds = CommunityPostApprovalEvent.KIND_LIST,
ids = communityList, tags = mapOf("a" to communityList),
limit = 300, limit = 300,
since = since, since = since,
), ),

View File

@@ -25,11 +25,12 @@ import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap
import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter
import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter
import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl
import com.vitorpamplona.quartz.nip01Core.tags.addressables.Address
import com.vitorpamplona.quartz.nip72ModCommunities.definition.CommunityDefinitionEvent import com.vitorpamplona.quartz.nip72ModCommunities.definition.CommunityDefinitionEvent
fun filterClassifiedsByCommunity( fun filterClassifiedsByCommunity(
relay: NormalizedRelayUrl, relay: NormalizedRelayUrl,
community: String, community: Address,
authors: Set<String>?, authors: Set<String>?,
since: Long? = null, since: Long? = null,
): List<RelayBasedFilter> { ): List<RelayBasedFilter> {
@@ -40,9 +41,9 @@ fun filterClassifiedsByCommunity(
relay = relay, relay = relay,
filter = filter =
Filter( Filter(
authors = authors, authors = listOf(community.pubKeyHex),
kinds = listOf(CommunityDefinitionEvent.KIND), kinds = listOf(CommunityDefinitionEvent.KIND),
ids = listOf(community), tags = mapOf("d" to listOf(community.dTag)),
limit = 300, limit = 300,
since = since, since = since,
), ),
@@ -59,11 +60,13 @@ fun filterCommunitiesByCommunity(
return communitySet.set return communitySet.set
.mapNotNull { .mapNotNull {
it.value.communityAddress?.let { address ->
filterClassifiedsByCommunity( filterClassifiedsByCommunity(
relay = it.key, relay = it.key,
community = it.value.community, community = address,
authors = it.value.authors, authors = it.value.authors,
since = since?.get(it.key)?.time ?: defaultSince, since = since?.get(it.key)?.time ?: defaultSince,
) )
}
}.flatten() }.flatten()
} }

View File

@@ -25,7 +25,6 @@ import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap
import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter
import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter
import com.vitorpamplona.quartz.nip72ModCommunities.approval.CommunityPostApprovalEvent import com.vitorpamplona.quartz.nip72ModCommunities.approval.CommunityPostApprovalEvent
import com.vitorpamplona.quartz.nip72ModCommunities.definition.CommunityDefinitionEvent
import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.TimeUtils
fun filterCommunitiesGlobal( fun filterCommunitiesGlobal(
@@ -42,7 +41,7 @@ fun filterCommunitiesGlobal(
relay = it.key, relay = it.key,
filter = filter =
Filter( Filter(
kinds = listOf(CommunityDefinitionEvent.KIND), kinds = CommunityPostApprovalEvent.KIND_LIST,
limit = 100, limit = 100,
since = since, since = since,
), ),
@@ -51,7 +50,7 @@ fun filterCommunitiesGlobal(
relay = it.key, relay = it.key,
filter = filter =
Filter( Filter(
kinds = listOf(CommunityPostApprovalEvent.KIND), kinds = CommunityPostApprovalEvent.KIND_LIST,
limit = 100, limit = 100,
since = since ?: TimeUtils.oneWeekAgo(), since = since ?: TimeUtils.oneWeekAgo(),
), ),