diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/RelayMembers.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/RelayMembers.kt index ee19fdba8..86287e585 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/RelayMembers.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/RelayMembers.kt @@ -77,13 +77,19 @@ fun RenderRelayAddMember( nav: INav, ) { val noteEvent = baseNote.event as? RelayAddMemberEvent ?: return - val memberKey = remember(noteEvent) { noteEvent.memberPubKey() } + val memberKeys = remember(noteEvent) { noteEvent.memberPubKeys() } + val title = + if (memberKeys.size == 1) { + stringRes(R.string.relay_member_added) + } else { + stringRes(R.string.relay_members_added, memberKeys.size) + } + val subtitle = remember(memberKeys) { memberKeys.joinToString(", ") { it.take(16) + "..." } } RelayMemberEventCard( icon = Icons.Default.PersonAdd, - title = stringRes(R.string.relay_member_added), - subtitle = memberKey?.take(16)?.let { "$it..." }, - nav = nav, + title = title, + subtitle = subtitle, relayPubKey = noteEvent.pubKey, ) } @@ -95,13 +101,19 @@ fun RenderRelayRemoveMember( nav: INav, ) { val noteEvent = baseNote.event as? RelayRemoveMemberEvent ?: return - val memberKey = remember(noteEvent) { noteEvent.memberPubKey() } + val memberKeys = remember(noteEvent) { noteEvent.memberPubKeys() } + val title = + if (memberKeys.size == 1) { + stringRes(R.string.relay_member_removed) + } else { + stringRes(R.string.relay_members_removed, memberKeys.size) + } + val subtitle = remember(memberKeys) { memberKeys.joinToString(", ") { it.take(16) + "..." } } RelayMemberEventCard( icon = Icons.Default.PersonRemove, - title = stringRes(R.string.relay_member_removed), - subtitle = memberKey?.take(16)?.let { "$it..." }, - nav = nav, + title = title, + subtitle = subtitle, relayPubKey = noteEvent.pubKey, ) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt index d46423583..4f855ce20 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt @@ -165,7 +165,12 @@ import com.vitorpamplona.amethyst.ui.note.types.RenderPoll import com.vitorpamplona.amethyst.ui.note.types.RenderPostApproval import com.vitorpamplona.amethyst.ui.note.types.RenderPrivateMessage import com.vitorpamplona.amethyst.ui.note.types.RenderPublicMessage +import com.vitorpamplona.amethyst.ui.note.types.RenderRelayAddMember import com.vitorpamplona.amethyst.ui.note.types.RenderRelayDiscovery +import com.vitorpamplona.amethyst.ui.note.types.RenderRelayJoinRequest +import com.vitorpamplona.amethyst.ui.note.types.RenderRelayLeaveRequest +import com.vitorpamplona.amethyst.ui.note.types.RenderRelayMembershipList +import com.vitorpamplona.amethyst.ui.note.types.RenderRelayRemoveMember import com.vitorpamplona.amethyst.ui.note.types.RenderTextEvent import com.vitorpamplona.amethyst.ui.note.types.RenderTextModificationEvent import com.vitorpamplona.amethyst.ui.note.types.RenderTorrent @@ -231,6 +236,11 @@ import com.vitorpamplona.quartz.nip34Git.repository.GitRepositoryEvent import com.vitorpamplona.quartz.nip35Torrents.TorrentCommentEvent import com.vitorpamplona.quartz.nip35Torrents.TorrentEvent import com.vitorpamplona.quartz.nip37Drafts.DraftWrapEvent +import com.vitorpamplona.quartz.nip43RelayMembers.addMember.RelayAddMemberEvent +import com.vitorpamplona.quartz.nip43RelayMembers.joinRequest.RelayJoinRequestEvent +import com.vitorpamplona.quartz.nip43RelayMembers.leaveRequest.RelayLeaveRequestEvent +import com.vitorpamplona.quartz.nip43RelayMembers.list.RelayMembershipListEvent +import com.vitorpamplona.quartz.nip43RelayMembers.removeMember.RelayRemoveMemberEvent import com.vitorpamplona.quartz.nip50Search.SearchRelayListEvent import com.vitorpamplona.quartz.nip51Lists.PinListEvent import com.vitorpamplona.quartz.nip51Lists.followList.FollowListEvent @@ -712,6 +722,16 @@ private fun FullBleedNoteCompose( RenderRepost(baseNote, quotesLeft = 3, backgroundColor, accountViewModel, nav) } else if (noteEvent is RelayDiscoveryEvent) { RenderRelayDiscovery(baseNote, accountViewModel, nav) + } else if (noteEvent is RelayMembershipListEvent) { + RenderRelayMembershipList(baseNote, accountViewModel, nav) + } else if (noteEvent is RelayAddMemberEvent) { + RenderRelayAddMember(baseNote, accountViewModel, nav) + } else if (noteEvent is RelayRemoveMemberEvent) { + RenderRelayRemoveMember(baseNote, accountViewModel, nav) + } else if (noteEvent is RelayJoinRequestEvent) { + RenderRelayJoinRequest(baseNote, accountViewModel, nav) + } else if (noteEvent is RelayLeaveRequestEvent) { + RenderRelayLeaveRequest(baseNote, accountViewModel, nav) } else if (noteEvent is TextNoteModificationEvent) { RenderTextModificationEvent( note = baseNote, diff --git a/amethyst/src/main/res/values/strings.xml b/amethyst/src/main/res/values/strings.xml index 81becc5f6..835a4e4c1 100644 --- a/amethyst/src/main/res/values/strings.xml +++ b/amethyst/src/main/res/values/strings.xml @@ -2096,7 +2096,9 @@ You are a member Relay membership list Member added to relay + %1$d members added to relay Member removed from relay + %1$d members removed from relay Relay join request Relay leave request diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip43RelayMembers/addMember/RelayAddMemberEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip43RelayMembers/addMember/RelayAddMemberEvent.kt index 504355cce..8c387a6a9 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip43RelayMembers/addMember/RelayAddMemberEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip43RelayMembers/addMember/RelayAddMemberEvent.kt @@ -39,20 +39,20 @@ class RelayAddMemberEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { - fun memberPubKey() = tags.firstNotNullOfOrNull(PTag::parseKey) + fun memberPubKeys() = tags.mapNotNull(PTag::parseKey) companion object { const val KIND = 8000 const val ALT_DESCRIPTION = "Relay member added" fun build( - memberPubKey: HexKey, + memberPubKeys: List, createdAt: Long = TimeUtils.now(), initializer: TagArrayBuilder.() -> Unit = {}, ) = eventTemplate(KIND, "", createdAt) { alt(ALT_DESCRIPTION) protect() - add(PTag.assemble(memberPubKey, null)) + memberPubKeys.forEach { add(PTag.assemble(it, null)) } initializer() } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip43RelayMembers/removeMember/RelayRemoveMemberEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip43RelayMembers/removeMember/RelayRemoveMemberEvent.kt index 9d5ea2668..83b82c41c 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip43RelayMembers/removeMember/RelayRemoveMemberEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip43RelayMembers/removeMember/RelayRemoveMemberEvent.kt @@ -39,20 +39,20 @@ class RelayRemoveMemberEvent( content: String, sig: HexKey, ) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { - fun memberPubKey() = tags.firstNotNullOfOrNull(PTag::parseKey) + fun memberPubKeys() = tags.mapNotNull(PTag::parseKey) companion object { const val KIND = 8001 const val ALT_DESCRIPTION = "Relay member removed" fun build( - memberPubKey: HexKey, + memberPubKeys: List, createdAt: Long = TimeUtils.now(), initializer: TagArrayBuilder.() -> Unit = {}, ) = eventTemplate(KIND, "", createdAt) { alt(ALT_DESCRIPTION) protect() - add(PTag.assemble(memberPubKey, null)) + memberPubKeys.forEach { add(PTag.assemble(it, null)) } initializer() } }