Skip to content

Commit d097f9d

Browse files
authored
Add MessageComposerState.sendEnabled property to be able to locally enable/disable sned action (#5916)
* Add `MessageComposerState.sendEnabled` property to be able to locally enable/disable sned action * Update CHANGELOG.md
1 parent e0fd721 commit d097f9d

File tree

6 files changed

+24
-13
lines changed

6 files changed

+24
-13
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191

9292
### ⬆️ Improved
9393
- Improved accessibility of the message list items. [#5911](https://github.com/GetStream/stream-chat-android/pull/5911)
94+
- Add MessageComposerState.sendEnabled property to be able to locally enable/disable sned action. [#5916](https://github.com/GetStream/stream-chat-android/pull/5916)
9495
- Show quoted message over messages with attachments. [#5924](https://github.com/GetStream/stream-chat-android/pull/5924)
9596

9697
### ✅ Added

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/composer/MessageInput.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ public fun MessageInput(
6868
innerTrailingContent: @Composable RowScope.() -> Unit = {},
6969
) {
7070
val (value, attachments, activeAction) = messageComposerState
71-
val canSendMessage = messageComposerState.ownCapabilities.contains(ChannelCapabilities.SEND_MESSAGE)
71+
val canSendMessage = messageComposerState.sendEnabled &&
72+
messageComposerState.ownCapabilities.contains(ChannelCapabilities.SEND_MESSAGE)
7273

7374
InputField(
7475
modifier = modifier,

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/MessageComposer.kt

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -511,8 +511,10 @@ internal fun DefaultComposerIntegrations(
511511
val isAttachmentsButtonEnabled = !hasCommandInput && !hasCommandSuggestions && !hasMentionSuggestions
512512
val isCommandsButtonEnabled = !hasTextInput && !hasAttachments
513513

514-
val canSendMessage = ownCapabilities.contains(ChannelCapabilities.SEND_MESSAGE)
515-
val canSendAttachments = ownCapabilities.contains(ChannelCapabilities.UPLOAD_FILE)
514+
val canSendMessage = messageInputState.sendEnabled &&
515+
ownCapabilities.contains(ChannelCapabilities.SEND_MESSAGE)
516+
val canSendAttachments = messageInputState.sendEnabled &&
517+
ownCapabilities.contains(ChannelCapabilities.UPLOAD_FILE)
516518

517519
val isRecording = messageInputState.recording !is RecordingState.Idle
518520

@@ -550,17 +552,17 @@ internal fun DefaultComposerIntegrations(
550552
/**
551553
* Default input field label that the user can override in [MessageComposer].
552554
*
553-
* @param ownCapabilities Set of capabilities the user is given for the current channel.
554-
* For a full list @see [ChannelCapabilities].
555+
* @param state The state of the message input.
555556
*/
556557
@Composable
557-
internal fun DefaultComposerLabel(ownCapabilities: Set<String>) {
558-
val text =
559-
if (ownCapabilities.contains(ChannelCapabilities.SEND_MESSAGE)) {
558+
internal fun DefaultComposerLabel(state: MessageComposerState) {
559+
val text = with(state) {
560+
if (sendEnabled && ownCapabilities.contains(ChannelCapabilities.SEND_MESSAGE)) {
560561
stringResource(id = R.string.stream_compose_message_label)
561562
} else {
562563
stringResource(id = R.string.stream_compose_cannot_send_messages_label)
563564
}
565+
}
564566

565567
Text(
566568
text = text,
@@ -626,7 +628,8 @@ internal fun DefaultMessageComposerTrailingContent(
626628
val isRecordingEnabled = isRecordAudioPermissionDeclared && ChatTheme.messageComposerTheme.audioRecording.enabled
627629
val showRecordOverSend = ChatTheme.messageComposerTheme.audioRecording.showRecordButtonOverSend
628630

629-
val isSendButtonEnabled = ownCapabilities.contains(ChannelCapabilities.SEND_MESSAGE)
631+
val isSendButtonEnabled = messageComposerState.sendEnabled &&
632+
ownCapabilities.contains(ChannelCapabilities.SEND_MESSAGE)
630633
val isInputValid by lazy { (value.isNotBlank() || attachments.isNotEmpty()) && validationErrors.isEmpty() }
631634

632635
if (coolDownTime > 0 && !isInEditMode) {

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1717,7 +1717,7 @@ public interface ChatComponentFactory {
17171717
*/
17181718
@Composable
17191719
public fun MessageComposerLabel(state: MessageComposerState) {
1720-
DefaultComposerLabel(state.ownCapabilities)
1720+
DefaultComposerLabel(state)
17211721
}
17221722

17231723
/**

stream-chat-android-ui-common/api/stream-chat-android-ui-common.api

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2010,14 +2010,16 @@ public final class io/getstream/chat/android/ui/common/state/messages/composer/M
20102010
public fun <init> (Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/ui/common/state/messages/MessageAction;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILio/getstream/chat/android/ui/common/state/messages/MessageMode;ZLjava/util/Set;ZLio/getstream/chat/android/models/User;)V
20112011
public fun <init> (Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/ui/common/state/messages/MessageAction;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILio/getstream/chat/android/ui/common/state/messages/MessageMode;ZLjava/util/Set;ZLio/getstream/chat/android/models/User;Lio/getstream/chat/android/ui/common/state/messages/composer/RecordingState;)V
20122012
public fun <init> (Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/ui/common/state/messages/MessageAction;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILio/getstream/chat/android/ui/common/state/messages/MessageMode;ZLjava/util/Set;ZLio/getstream/chat/android/models/User;Lio/getstream/chat/android/ui/common/state/messages/composer/RecordingState;Z)V
2013-
public synthetic fun <init> (Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/ui/common/state/messages/MessageAction;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILio/getstream/chat/android/ui/common/state/messages/MessageMode;ZLjava/util/Set;ZLio/getstream/chat/android/models/User;Lio/getstream/chat/android/ui/common/state/messages/composer/RecordingState;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
2013+
public fun <init> (Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/ui/common/state/messages/MessageAction;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILio/getstream/chat/android/ui/common/state/messages/MessageMode;ZLjava/util/Set;ZLio/getstream/chat/android/models/User;Lio/getstream/chat/android/ui/common/state/messages/composer/RecordingState;ZZ)V
2014+
public synthetic fun <init> (Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/ui/common/state/messages/MessageAction;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILio/getstream/chat/android/ui/common/state/messages/MessageMode;ZLjava/util/Set;ZLio/getstream/chat/android/models/User;Lio/getstream/chat/android/ui/common/state/messages/composer/RecordingState;ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V
20142015
public final fun component1 ()Ljava/lang/String;
20152016
public final fun component10 ()Z
20162017
public final fun component11 ()Ljava/util/Set;
20172018
public final fun component12 ()Z
20182019
public final fun component13 ()Lio/getstream/chat/android/models/User;
20192020
public final fun component14 ()Lio/getstream/chat/android/ui/common/state/messages/composer/RecordingState;
20202021
public final fun component15 ()Z
2022+
public final fun component16 ()Z
20212023
public final fun component2 ()Ljava/util/List;
20222024
public final fun component3 ()Lio/getstream/chat/android/ui/common/state/messages/MessageAction;
20232025
public final fun component4 ()Ljava/util/List;
@@ -2026,8 +2028,8 @@ public final class io/getstream/chat/android/ui/common/state/messages/composer/M
20262028
public final fun component7 ()Ljava/util/List;
20272029
public final fun component8 ()I
20282030
public final fun component9 ()Lio/getstream/chat/android/ui/common/state/messages/MessageMode;
2029-
public final fun copy (Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/ui/common/state/messages/MessageAction;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILio/getstream/chat/android/ui/common/state/messages/MessageMode;ZLjava/util/Set;ZLio/getstream/chat/android/models/User;Lio/getstream/chat/android/ui/common/state/messages/composer/RecordingState;Z)Lio/getstream/chat/android/ui/common/state/messages/composer/MessageComposerState;
2030-
public static synthetic fun copy$default (Lio/getstream/chat/android/ui/common/state/messages/composer/MessageComposerState;Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/ui/common/state/messages/MessageAction;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILio/getstream/chat/android/ui/common/state/messages/MessageMode;ZLjava/util/Set;ZLio/getstream/chat/android/models/User;Lio/getstream/chat/android/ui/common/state/messages/composer/RecordingState;ZILjava/lang/Object;)Lio/getstream/chat/android/ui/common/state/messages/composer/MessageComposerState;
2031+
public final fun copy (Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/ui/common/state/messages/MessageAction;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILio/getstream/chat/android/ui/common/state/messages/MessageMode;ZLjava/util/Set;ZLio/getstream/chat/android/models/User;Lio/getstream/chat/android/ui/common/state/messages/composer/RecordingState;ZZ)Lio/getstream/chat/android/ui/common/state/messages/composer/MessageComposerState;
2032+
public static synthetic fun copy$default (Lio/getstream/chat/android/ui/common/state/messages/composer/MessageComposerState;Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/ui/common/state/messages/MessageAction;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILio/getstream/chat/android/ui/common/state/messages/MessageMode;ZLjava/util/Set;ZLio/getstream/chat/android/models/User;Lio/getstream/chat/android/ui/common/state/messages/composer/RecordingState;ZZILjava/lang/Object;)Lio/getstream/chat/android/ui/common/state/messages/composer/MessageComposerState;
20312033
public fun equals (Ljava/lang/Object;)Z
20322034
public final fun getAction ()Lio/getstream/chat/android/ui/common/state/messages/MessageAction;
20332035
public final fun getAlsoSendToChannel ()Z
@@ -2043,6 +2045,7 @@ public final class io/getstream/chat/android/ui/common/state/messages/composer/M
20432045
public final fun getOwnCapabilities ()Ljava/util/Set;
20442046
public final fun getPollsEnabled ()Z
20452047
public final fun getRecording ()Lio/getstream/chat/android/ui/common/state/messages/composer/RecordingState;
2048+
public final fun getSendEnabled ()Z
20462049
public final fun getValidationErrors ()Ljava/util/List;
20472050
public fun hashCode ()I
20482051
public fun toString ()Ljava/lang/String;

stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/state/messages/composer/MessageComposerState.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ import io.getstream.chat.android.ui.common.state.messages.MessageMode
4343
* @param currentUser The currently logged in user.
4444
* @param recording The current recording state.
4545
* @param pollsEnabled Indicator if polls are enabled for the current channel.
46+
* @param sendEnabled Whether the send action is enabled or not. If true, the send button is enabled and input file is
47+
* editable unless the user doesn't have proper [ChannelCapabilities] to send messages, otherwise it's disabled.
4648
*/
4749
public data class MessageComposerState @JvmOverloads constructor(
4850
val inputValue: String = "",
@@ -60,4 +62,5 @@ public data class MessageComposerState @JvmOverloads constructor(
6062
val currentUser: User? = null,
6163
val recording: RecordingState = RecordingState.Idle,
6264
val pollsEnabled: Boolean = false,
65+
val sendEnabled: Boolean = true,
6366
)

0 commit comments

Comments
 (0)