Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ class MessagesActivity : ComponentActivity() {
selectedMessage = selectedMessage,
currentUser = user,
isInThread = listViewModel.isInThread,
ownCapabilities = selectedMessageState.ownCapabilities,
channel = selectedMessageState.channel,
),
message = selectedMessage,
ownCapabilities = selectedMessageState.ownCapabilities,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1640,10 +1640,11 @@ public final class io/getstream/chat/android/compose/ui/components/composer/Mess
public final class io/getstream/chat/android/compose/ui/components/messageoptions/MessageOptionItemVisibility {
public static final field $stable I
public fun <init> ()V
public fun <init> (ZZZZZZZZZZ)V
public synthetic fun <init> (ZZZZZZZZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (ZZZZZZZZZZZ)V
public synthetic fun <init> (ZZZZZZZZZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Z
public final fun component10 ()Z
public final fun component11 ()Z
public final fun component2 ()Z
public final fun component3 ()Z
public final fun component4 ()Z
Expand All @@ -1652,8 +1653,8 @@ public final class io/getstream/chat/android/compose/ui/components/messageoption
public final fun component7 ()Z
public final fun component8 ()Z
public final fun component9 ()Z
public final fun copy (ZZZZZZZZZZ)Lio/getstream/chat/android/compose/ui/components/messageoptions/MessageOptionItemVisibility;
public static synthetic fun copy$default (Lio/getstream/chat/android/compose/ui/components/messageoptions/MessageOptionItemVisibility;ZZZZZZZZZZILjava/lang/Object;)Lio/getstream/chat/android/compose/ui/components/messageoptions/MessageOptionItemVisibility;
public final fun copy (ZZZZZZZZZZZ)Lio/getstream/chat/android/compose/ui/components/messageoptions/MessageOptionItemVisibility;
public static synthetic fun copy$default (Lio/getstream/chat/android/compose/ui/components/messageoptions/MessageOptionItemVisibility;ZZZZZZZZZZZILjava/lang/Object;)Lio/getstream/chat/android/compose/ui/components/messageoptions/MessageOptionItemVisibility;
public fun equals (Ljava/lang/Object;)Z
public fun hashCode ()I
public final fun isBlockUserVisible ()Z
Expand All @@ -1662,6 +1663,7 @@ public final class io/getstream/chat/android/compose/ui/components/messageoption
public final fun isEditMessageVisible ()Z
public final fun isFlagMessageVisible ()Z
public final fun isMarkAsUnreadVisible ()Z
public final fun isMuteUserVisible ()Z
public final fun isPinMessageVisible ()Z
public final fun isReplyVisible ()Z
public final fun isRetryMessageVisible ()Z
Expand All @@ -1671,7 +1673,7 @@ public final class io/getstream/chat/android/compose/ui/components/messageoption

public final class io/getstream/chat/android/compose/ui/components/messageoptions/MessageOptionsKt {
public static final fun MessageOptions (Ljava/util/List;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V
public static final fun defaultMessageOptionsState (Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;ZLjava/util/Set;Landroidx/compose/runtime/Composer;I)Ljava/util/List;
public static final fun defaultMessageOptionsState (Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;ZLio/getstream/chat/android/models/Channel;Landroidx/compose/runtime/Composer;I)Ljava/util/List;
}

public final class io/getstream/chat/android/compose/ui/components/messages/ComposableSingletons$MessageReactionsKt {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import io.getstream.chat.android.compose.ui.components.selectedmessage.SelectedM
* @param isFlagMessageVisible Visibility of the flag message option.
* @param isPinMessageVisible Visibility of the pin message to chat option.
* @param isDeleteMessageVisible Visibility of the delete message option.
* @param isMuteUserVisible Visibility of the mute user option.
* @param isBlockUserVisible Visibility of the block user option.
*
* @see [SelectedMessageMenu]
Expand All @@ -46,5 +47,6 @@ public data class MessageOptionItemVisibility(
val isFlagMessageVisible: Boolean = true,
val isPinMessageVisible: Boolean = true,
val isDeleteMessageVisible: Boolean = true,
val isMuteUserVisible: Boolean = true,
val isBlockUserVisible: Boolean = true,
)
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,13 @@ import io.getstream.chat.android.compose.util.extensions.canDeleteMessage
import io.getstream.chat.android.compose.util.extensions.canEditMessage
import io.getstream.chat.android.compose.util.extensions.canFlagMessage
import io.getstream.chat.android.compose.util.extensions.canMarkAsUnread
import io.getstream.chat.android.compose.util.extensions.canMuteUser
import io.getstream.chat.android.compose.util.extensions.canPinMessage
import io.getstream.chat.android.compose.util.extensions.canReplyToMessage
import io.getstream.chat.android.compose.util.extensions.canRetryMessage
import io.getstream.chat.android.compose.util.extensions.canThreadReplyToMessage
import io.getstream.chat.android.compose.util.extensions.toSet
import io.getstream.chat.android.models.Channel
import io.getstream.chat.android.models.ChannelCapabilities
import io.getstream.chat.android.models.Message
import io.getstream.chat.android.models.SyncStatus
Expand All @@ -47,11 +49,13 @@ import io.getstream.chat.android.ui.common.state.messages.Delete
import io.getstream.chat.android.ui.common.state.messages.Edit
import io.getstream.chat.android.ui.common.state.messages.Flag
import io.getstream.chat.android.ui.common.state.messages.MarkAsUnread
import io.getstream.chat.android.ui.common.state.messages.MuteUser
import io.getstream.chat.android.ui.common.state.messages.Pin
import io.getstream.chat.android.ui.common.state.messages.Reply
import io.getstream.chat.android.ui.common.state.messages.Resend
import io.getstream.chat.android.ui.common.state.messages.ThreadReply
import io.getstream.chat.android.ui.common.state.messages.UnblockUser
import io.getstream.chat.android.ui.common.state.messages.UnmuteUser

/**
* Displays all [MessageOptionItemState]s.
Expand Down Expand Up @@ -83,21 +87,21 @@ public fun MessageOptions(
* @param selectedMessage Currently selected message, used to callbacks.
* @param currentUser Current user, used to expose different states for messages.
* @param isInThread If the message is being displayed in a thread.
* @param ownCapabilities Set of capabilities the user is given for the current channel.
* For a full list @see [ChannelCapabilities].
* @param channel The channel where the message was sent.
*/
@Suppress("LongMethod")
@Composable
public fun defaultMessageOptionsState(
selectedMessage: Message,
currentUser: User?,
isInThread: Boolean,
ownCapabilities: Set<String>,
channel: Channel,
): List<MessageOptionItemState> {
if (selectedMessage.id.isEmpty()) {
return emptyList()
}
val selectedMessageUserId = selectedMessage.user.id
val ownCapabilities = channel.ownCapabilities
val visibility = ChatTheme.messageOptionsTheme.optionVisibility

return listOfNotNull(
Expand Down Expand Up @@ -187,6 +191,19 @@ public fun defaultMessageOptionsState(
} else {
null
},
if (visibility.canMuteUser(currentUser, selectedMessage, channel)) {
val isSenderMuted = currentUser?.mutes?.any { it.target?.id == selectedMessageUserId } == true
MessageOptionItemState(
title = if (isSenderMuted) R.string.stream_compose_unmute_user else R.string.stream_compose_mute_user,
iconPainter = painterResource(
if (isSenderMuted) R.drawable.stream_compose_ic_unmute else R.drawable.stream_compose_ic_mute,
),
action = if (isSenderMuted) UnmuteUser(selectedMessage) else MuteUser(selectedMessage),
destructive = false,
)
} else {
null
},
if (visibility.canBlockUser(currentUser, selectedMessage)) {
val isSenderBlocked = currentUser?.blockedUserIds?.contains(selectedMessageUserId) == true
val title = if (isSenderBlocked) {
Expand Down Expand Up @@ -283,7 +300,7 @@ private fun MessageOptionsPreview(
selectedMessage = selectedMMessage,
currentUser = currentUser,
isInThread = false,
ownCapabilities = ChannelCapabilities.toSet(),
channel = Channel(ownCapabilities = ChannelCapabilities.toSet()),
)

MessageOptions(options = messageOptionsStateList, onMessageOptionSelected = {})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ import io.getstream.chat.android.compose.ui.messages.list.LocalSelectedMessageBo
import io.getstream.chat.android.compose.ui.theme.ChatTheme
import io.getstream.chat.android.compose.ui.theme.StreamTokens
import io.getstream.chat.android.compose.util.extensions.toSet
import io.getstream.chat.android.models.Channel
import io.getstream.chat.android.models.ChannelCapabilities
import io.getstream.chat.android.models.Message
import io.getstream.chat.android.models.ReactionSortingByLastReactionAt
Expand Down Expand Up @@ -311,7 +312,7 @@ private fun SelectedMessageMenuPreview(selectedMessage: Message) {
selectedMessage = selectedMessage,
currentUser = PreviewUserData.user1,
isInThread = false,
ownCapabilities = ChannelCapabilities.toSet(),
channel = Channel(ownCapabilities = ChannelCapabilities.toSet()),
)

SelectedMessageMenu(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -441,15 +441,16 @@ private fun BoxScope.MessagesScreenMenus(
) {
val user by listViewModel.user.collectAsState()

val ownCapabilities = selectedMessageState?.ownCapabilities ?: setOf()
val channel = selectedMessageState?.channel ?: Channel()
val ownCapabilities = channel.ownCapabilities

val isInThread = listViewModel.isInThread

val newMessageOptions = defaultMessageOptionsState(
selectedMessage = selectedMessage,
currentUser = user,
isInThread = isInThread,
ownCapabilities = ownCapabilities,
channel = channel,
)

var messageOptions by remember {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package io.getstream.chat.android.compose.util.extensions

import io.getstream.chat.android.compose.ui.components.messageoptions.MessageOptionItemVisibility
import io.getstream.chat.android.models.Channel
import io.getstream.chat.android.models.Message
import io.getstream.chat.android.models.User
import io.getstream.chat.android.ui.common.utils.canBlockUser
Expand All @@ -25,6 +26,7 @@ import io.getstream.chat.android.ui.common.utils.canDeleteMessage
import io.getstream.chat.android.ui.common.utils.canEditMessage
import io.getstream.chat.android.ui.common.utils.canFlagMessage
import io.getstream.chat.android.ui.common.utils.canMarkAsUnread
import io.getstream.chat.android.ui.common.utils.canMuteUser
import io.getstream.chat.android.ui.common.utils.canPinMessage
import io.getstream.chat.android.ui.common.utils.canReplyToMessage
import io.getstream.chat.android.ui.common.utils.canRetryMessage
Expand Down Expand Up @@ -99,6 +101,17 @@ internal fun MessageOptionItemVisibility.canPinMessage(
ownCapabilities = ownCapabilities,
)

internal fun MessageOptionItemVisibility.canMuteUser(
currentUser: User?,
message: Message,
channel: Channel,
): Boolean = canMuteUser(
muteUserEnabled = isMuteUserVisible,
currentUser = currentUser,
message = message,
channel = channel,
)

internal fun MessageOptionItemVisibility.canBlockUser(
currentUser: User?,
message: Message,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ package io.getstream.chat.android.compose.util.extensions

import io.getstream.chat.android.compose.ui.components.messageoptions.MessageOptionItemVisibility
import io.getstream.chat.android.models.AttachmentType
import io.getstream.chat.android.models.Channel
import io.getstream.chat.android.models.ChannelCapabilities
import io.getstream.chat.android.models.Config
import io.getstream.chat.android.models.Message
import io.getstream.chat.android.models.SyncStatus
import io.getstream.chat.android.models.User
Expand Down Expand Up @@ -119,6 +121,18 @@ internal class MessageOptionItemVisibilityTest {
messageOptionItemVisibility.canPinMessage(message, ownCapabilities) `should be` expectedResult
}

@ParameterizedTest
@MethodSource("canMuteUserArguments")
fun `Verify canMuteUser() extension function returns proper value`(
messageOptionItemVisibility: MessageOptionItemVisibility,
currentUser: User?,
message: Message,
channel: Channel,
expectedResult: Boolean,
) {
messageOptionItemVisibility.canMuteUser(currentUser, message, channel) `should be` expectedResult
}

@ParameterizedTest
@MethodSource("canBlockUserArguments")
fun `Verify canBlockUser() extension function return proper value`(
Expand Down Expand Up @@ -284,6 +298,38 @@ internal class MessageOptionItemVisibilityTest {
),
)

@JvmStatic
fun canMuteUserArguments() = listOf(
Arguments.of(
MessageOptionItemVisibility(isMuteUserVisible = false),
currentUser.takeIf { randomBoolean() },
randomMessage(),
Channel(config = Config(muteEnabled = true)),
false,
),
Arguments.of(
MessageOptionItemVisibility(),
currentUser,
randomMessage(user = currentUser),
Channel(config = Config(muteEnabled = true)),
false,
),
Arguments.of(
MessageOptionItemVisibility(isMuteUserVisible = true),
currentUser.takeIf { randomBoolean() },
randomMessage(),
Channel(config = Config(muteEnabled = false)),
false,
),
Arguments.of(
MessageOptionItemVisibility(isMuteUserVisible = true),
currentUser.takeIf { randomBoolean() },
randomMessage(),
Channel(config = Config(muteEnabled = true)),
true,
),
)

@JvmStatic
fun canBlockUserArguments() = listOf(
Arguments.of(
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ private object SelectedMessageMenuUsageSnippet {
selectedMessage = selectedMessage,
currentUser = user,
isInThread = listViewModel.isInThread,
ownCapabilities = selectedMessageState.ownCapabilities
channel = selectedMessageState.channel
),
// The message you selected
message = selectedMessage,
Expand Down Expand Up @@ -121,7 +121,7 @@ private object SelectedMessageMenuHandlingActionsSnippet {
selectedMessage = selectedMessage,
currentUser = user,
isInThread = listViewModel.isInThread,
ownCapabilities = selectedMessageState.ownCapabilities
channel = selectedMessageState.channel
),
// The message you selected
message = selectedMessage,
Expand Down Expand Up @@ -184,7 +184,7 @@ private object SelectedMessageMenuCustomizationSnippet {
selectedMessage = selectedMessage,
currentUser = user,
isInThread = listViewModel.isInThread,
ownCapabilities = selectedMessageState.ownCapabilities
channel = selectedMessageState.channel
),
// The capabilities the user has in a given channel
ownCapabilities = selectedMessageState.ownCapabilities,
Expand Down
Loading
Loading