Merge pull request #2511 from vitorpamplona/claude/fix-marmot-group-tabs-zLq2N
Implement known/new group classification based on follow set
This commit is contained in:
+1
@@ -124,6 +124,7 @@ class AccountFeedContentStates(
|
|||||||
scope.launch(Dispatchers.IO) {
|
scope.launch(Dispatchers.IO) {
|
||||||
account.marmotGroupList.groupListChanges.collect {
|
account.marmotGroupList.groupListChanges.collect {
|
||||||
dmKnown.invalidateData()
|
dmKnown.invalidateData()
|
||||||
|
dmNew.invalidateData()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-2
@@ -93,8 +93,12 @@ fun MarmotGroupListScreen(
|
|||||||
// (Account.ensureMarmotKeyPackagePublished), so this screen no longer
|
// (Account.ensureMarmotKeyPackagePublished), so this screen no longer
|
||||||
// needs to do anything to make sure invitees can find a KeyPackage.
|
// needs to do anything to make sure invitees can find a KeyPackage.
|
||||||
|
|
||||||
val knownGroups = remember(groupList) { groupList.filter { it.second.ownerSentMessage } }
|
val followState by accountViewModel.account.kind3FollowList.flow
|
||||||
val newRequestGroups = remember(groupList) { groupList.filter { !it.second.ownerSentMessage } }
|
.collectAsStateWithLifecycle()
|
||||||
|
val followingKeySet = followState.authors
|
||||||
|
|
||||||
|
val knownGroups = remember(groupList, followingKeySet) { groupList.filter { it.second.isKnown(followingKeySet) } }
|
||||||
|
val newRequestGroups = remember(groupList, followingKeySet) { groupList.filter { !it.second.isKnown(followingKeySet) } }
|
||||||
val visibleGroups = if (selectedTab == 0) knownGroups else newRequestGroups
|
val visibleGroups = if (selectedTab == 0) knownGroups else newRequestGroups
|
||||||
|
|
||||||
Scaffold(
|
Scaffold(
|
||||||
|
|||||||
+5
-1
@@ -79,7 +79,11 @@ class ChatroomListKnownFeedFilter(
|
|||||||
|
|
||||||
val marmotGroups =
|
val marmotGroups =
|
||||||
account.marmotGroupList.rooms.mapNotNull { _, chatroom ->
|
account.marmotGroupList.rooms.mapNotNull { _, chatroom ->
|
||||||
chatroom.newestMessage ?: chatroom.placeholderNote()
|
if (chatroom.isKnown(followingKeySet)) {
|
||||||
|
chatroom.newestMessage ?: chatroom.placeholderNote()
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (privateMessages + publicChannels + ephemeralChats + marmotGroups).sortedWith(DefaultFeedOrder)
|
return (privateMessages + publicChannels + ephemeralChats + marmotGroups).sortedWith(DefaultFeedOrder)
|
||||||
|
|||||||
+10
-1
@@ -47,7 +47,16 @@ class ChatroomListNewFeedFilter(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return privateMessages.sortedWith(DefaultFeedOrder)
|
val marmotGroups =
|
||||||
|
account.marmotGroupList.rooms.mapNotNull { _, chatroom ->
|
||||||
|
if (!chatroom.isKnown(followingKeySet)) {
|
||||||
|
chatroom.newestMessage ?: chatroom.placeholderNote()
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (privateMessages + marmotGroups).sortedWith(DefaultFeedOrder)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun updateListWith(
|
override fun updateListWith(
|
||||||
|
|||||||
+15
@@ -69,6 +69,21 @@ class MarmotGroupChatroom(
|
|||||||
*/
|
*/
|
||||||
var ownerSentMessage: Boolean = false
|
var ownerSentMessage: Boolean = false
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Classifies this group for the Known/New Requests split.
|
||||||
|
*
|
||||||
|
* Rules:
|
||||||
|
* - If the local user has already participated ([ownerSentMessage]), Known.
|
||||||
|
* - If the group has no known members and no messages yet, New Requests
|
||||||
|
* (we don't know who invited us, so it's untrusted by default).
|
||||||
|
* - Otherwise, Known iff at least one admin is in the follow set.
|
||||||
|
*/
|
||||||
|
fun isKnown(followingKeySet: Set<HexKey>): Boolean {
|
||||||
|
if (ownerSentMessage) return true
|
||||||
|
if (memberCount.value == 0 && messages.isEmpty()) return false
|
||||||
|
return adminPubkeys.value.any { it in followingKeySet }
|
||||||
|
}
|
||||||
|
|
||||||
// Synthetic note used by list views to represent the group when no
|
// Synthetic note used by list views to represent the group when no
|
||||||
// messages have been received yet. Lazily created and kept stable so
|
// messages have been received yet. Lazily created and kept stable so
|
||||||
// equality-based feed diffing treats it as the same row across refreshes.
|
// equality-based feed diffing treats it as the same row across refreshes.
|
||||||
|
|||||||
Reference in New Issue
Block a user