Merge pull request #2421 from vitorpamplona/claude/replace-mls-groups-fab-waio7
Add Marmot group messages to notifications feed
This commit is contained in:
@@ -21,6 +21,7 @@
|
|||||||
package com.vitorpamplona.amethyst.ui.navigation.routes
|
package com.vitorpamplona.amethyst.ui.navigation.routes
|
||||||
|
|
||||||
import com.vitorpamplona.amethyst.commons.model.emphChat.EphemeralChatChannel
|
import com.vitorpamplona.amethyst.commons.model.emphChat.EphemeralChatChannel
|
||||||
|
import com.vitorpamplona.amethyst.commons.model.marmotGroups.MarmotGroupChatroom
|
||||||
import com.vitorpamplona.amethyst.commons.model.nip28PublicChats.PublicChatChannel
|
import com.vitorpamplona.amethyst.commons.model.nip28PublicChats.PublicChatChannel
|
||||||
import com.vitorpamplona.amethyst.commons.model.nip53LiveActivities.LiveActivitiesChannel
|
import com.vitorpamplona.amethyst.commons.model.nip53LiveActivities.LiveActivitiesChannel
|
||||||
import com.vitorpamplona.amethyst.model.Account
|
import com.vitorpamplona.amethyst.model.Account
|
||||||
@@ -61,6 +62,12 @@ fun routeFor(
|
|||||||
note: Note,
|
note: Note,
|
||||||
loggedIn: Account,
|
loggedIn: Account,
|
||||||
): Route? {
|
): Route? {
|
||||||
|
// Marmot group messages should navigate to the group chat
|
||||||
|
val marmotGroup = note.inGatherers?.firstNotNullOfOrNull { it as? MarmotGroupChatroom }
|
||||||
|
if (marmotGroup != null) {
|
||||||
|
return Route.MarmotGroupChat(marmotGroup.nostrGroupId)
|
||||||
|
}
|
||||||
|
|
||||||
val noteEvent = note.event ?: return Route.EventRedirect(note.idHex)
|
val noteEvent = note.event ?: return Route.EventRedirect(note.idHex)
|
||||||
|
|
||||||
return routeFor(noteEvent, loggedIn)
|
return routeFor(noteEvent, loggedIn)
|
||||||
|
|||||||
+2
-2
@@ -106,7 +106,7 @@ fun ChannelFabColumn(nav: INav) {
|
|||||||
|
|
||||||
FloatingActionButton(
|
FloatingActionButton(
|
||||||
onClick = {
|
onClick = {
|
||||||
nav.nav(Route.MarmotGroupList)
|
nav.nav(Route.CreateMarmotGroup)
|
||||||
isOpen = false
|
isOpen = false
|
||||||
},
|
},
|
||||||
modifier = Size55Modifier,
|
modifier = Size55Modifier,
|
||||||
@@ -114,7 +114,7 @@ fun ChannelFabColumn(nav: INav) {
|
|||||||
containerColor = MaterialTheme.colorScheme.primary,
|
containerColor = MaterialTheme.colorScheme.primary,
|
||||||
) {
|
) {
|
||||||
Text(
|
Text(
|
||||||
text = "MLS\nGroups",
|
text = stringRes(R.string.messages_create_group),
|
||||||
color = Color.White,
|
color = Color.White,
|
||||||
textAlign = TextAlign.Center,
|
textAlign = TextAlign.Center,
|
||||||
fontSize = Font12SP,
|
fontSize = Font12SP,
|
||||||
|
|||||||
+4
-1
@@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable
|
|||||||
import androidx.compose.runtime.MutableState
|
import androidx.compose.runtime.MutableState
|
||||||
import androidx.compose.runtime.Stable
|
import androidx.compose.runtime.Stable
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import com.vitorpamplona.amethyst.commons.model.marmotGroups.MarmotGroupChatroom
|
||||||
import com.vitorpamplona.amethyst.commons.ui.feeds.InvalidatableContent
|
import com.vitorpamplona.amethyst.commons.ui.feeds.InvalidatableContent
|
||||||
import com.vitorpamplona.amethyst.commons.ui.feeds.LoadedFeedState
|
import com.vitorpamplona.amethyst.commons.ui.feeds.LoadedFeedState
|
||||||
import com.vitorpamplona.amethyst.commons.ui.notifications.Card
|
import com.vitorpamplona.amethyst.commons.ui.notifications.Card
|
||||||
@@ -306,7 +307,7 @@ class CardFeedContentState(
|
|||||||
it.event !is GenericRepostEvent &&
|
it.event !is GenericRepostEvent &&
|
||||||
it.event !is LnZapEvent
|
it.event !is LnZapEvent
|
||||||
}.map {
|
}.map {
|
||||||
if (it.event is PrivateDmEvent || it.event is NIP17Group) {
|
if (it.event is PrivateDmEvent || it.event is NIP17Group || it.isInMarmotGroup()) {
|
||||||
MessageSetCard(it)
|
MessageSetCard(it)
|
||||||
} else if (it.event is BadgeAwardEvent) {
|
} else if (it.event is BadgeAwardEvent) {
|
||||||
BadgeCard(it)
|
BadgeCard(it)
|
||||||
@@ -475,3 +476,5 @@ data class CombinedZap(
|
|||||||
|
|
||||||
fun idHex() = response.idHex
|
fun idHex() = response.idHex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun Note.isInMarmotGroup(): Boolean = inGatherers?.any { it is MarmotGroupChatroom } == true
|
||||||
|
|||||||
+15
-1
@@ -34,6 +34,7 @@ import com.vitorpamplona.quartz.experimental.audio.track.AudioTrackEvent
|
|||||||
import com.vitorpamplona.quartz.experimental.forks.IForkableEvent
|
import com.vitorpamplona.quartz.experimental.forks.IForkableEvent
|
||||||
import com.vitorpamplona.quartz.experimental.nipsOnNostr.NipTextEvent
|
import com.vitorpamplona.quartz.experimental.nipsOnNostr.NipTextEvent
|
||||||
import com.vitorpamplona.quartz.experimental.zapPolls.ZapPollEvent
|
import com.vitorpamplona.quartz.experimental.zapPolls.ZapPollEvent
|
||||||
|
import com.vitorpamplona.amethyst.commons.model.marmotGroups.MarmotGroupChatroom
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.AddressableEvent
|
import com.vitorpamplona.quartz.nip01Core.core.AddressableEvent
|
||||||
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
import com.vitorpamplona.quartz.nip01Core.core.HexKey
|
||||||
import com.vitorpamplona.quartz.nip01Core.tags.people.isTaggedUser
|
import com.vitorpamplona.quartz.nip01Core.tags.people.isTaggedUser
|
||||||
@@ -151,7 +152,14 @@ class NotificationFeedFilter(
|
|||||||
acceptableEvent(note, filterParams)
|
acceptableEvent(note, filterParams)
|
||||||
}
|
}
|
||||||
|
|
||||||
return sort(notifications)
|
// Include marmot group messages as notifications (like DMs)
|
||||||
|
val loggedInUserHex = account.userProfile().pubkeyHex
|
||||||
|
val marmotMessages =
|
||||||
|
account.marmotGroupList.rooms.mapFlatten { _, chatroom ->
|
||||||
|
chatroom.messages.filter { it.author?.pubkeyHex != loggedInUserHex }
|
||||||
|
}
|
||||||
|
|
||||||
|
return sort(notifications + marmotMessages)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun applyFilter(newItems: Set<Note>): Set<Note> = innerApplyFilter(newItems)
|
override fun applyFilter(newItems: Set<Note>): Set<Note> = innerApplyFilter(newItems)
|
||||||
@@ -168,6 +176,12 @@ class NotificationFeedFilter(
|
|||||||
): Boolean {
|
): Boolean {
|
||||||
val loggedInUserHex = account.userProfile().pubkeyHex
|
val loggedInUserHex = account.userProfile().pubkeyHex
|
||||||
|
|
||||||
|
// Marmot group messages are always acceptable (user is a group member)
|
||||||
|
val isMarmotGroupMessage = it.inGatherers?.any { g -> g is MarmotGroupChatroom } == true
|
||||||
|
if (isMarmotGroupMessage) {
|
||||||
|
return it.author?.pubkeyHex != loggedInUserHex
|
||||||
|
}
|
||||||
|
|
||||||
val noteEvent = it.event
|
val noteEvent = it.event
|
||||||
val notifAuthor =
|
val notifAuthor =
|
||||||
if (noteEvent is LnZapEvent) {
|
if (noteEvent is LnZapEvent) {
|
||||||
|
|||||||
@@ -1090,6 +1090,7 @@
|
|||||||
<string name="new_feature_nip17_activate">Activate</string>
|
<string name="new_feature_nip17_activate">Activate</string>
|
||||||
|
|
||||||
<string name="messages_create_public_chat">Public</string>
|
<string name="messages_create_public_chat">Public</string>
|
||||||
|
<string name="messages_create_group">Group</string>
|
||||||
<string name="messages_create_public_private_chat_description">New Public or Private Group</string>
|
<string name="messages_create_public_private_chat_description">New Public or Private Group</string>
|
||||||
<string name="messages_relay_based">Relay</string>
|
<string name="messages_relay_based">Relay</string>
|
||||||
<string name="messages_new_message">Private</string>
|
<string name="messages_new_message">Private</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user