Skip to content

Conversation

JcMinarro
Copy link
Contributor

🎯 Goal

Add a new MessageComposerState.sendEnabled property that allow to disable the Message Compose Input depending on custom logic the customer could have locally on the app.

🧪 Testing

You only need to modify the MessageComposerState.sendEnabled.
The following snippet toggles every 5 seconds the sendEnabled property to reflect how it could be edited locally from the ChatComponentFactory implementation

Git Path
diff --git a/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/CustomChatComponentFactory.kt b/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/CustomChatComponentFactory.kt
index 71740664d3..8aa642af5e 100644
--- a/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/CustomChatComponentFactory.kt
+++ b/stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/CustomChatComponentFactory.kt
@@ -18,9 +18,12 @@ package io.getstream.chat.android.compose.sample.ui.component
 
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.ColumnScope
+import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.widthIn
 import androidx.compose.foundation.lazy.LazyItemScope
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import io.getstream.chat.android.client.extensions.isPinned
 import io.getstream.chat.android.client.utils.message.hasSharedLocation
@@ -29,17 +32,24 @@ import io.getstream.chat.android.compose.sample.feature.reminders.MessageReminde
 import io.getstream.chat.android.compose.state.channels.list.ItemState
 import io.getstream.chat.android.compose.state.mediagallerypreview.MediaGalleryPreviewResult
 import io.getstream.chat.android.compose.ui.channels.list.ChannelItem
+import io.getstream.chat.android.compose.ui.messages.composer.actions.AudioRecordingActions
 import io.getstream.chat.android.compose.ui.theme.ChatComponentFactory
 import io.getstream.chat.android.compose.ui.theme.ChatTheme
+import io.getstream.chat.android.models.Attachment
 import io.getstream.chat.android.models.Channel
+import io.getstream.chat.android.models.Command
+import io.getstream.chat.android.models.LinkPreview
 import io.getstream.chat.android.models.Message
 import io.getstream.chat.android.models.Option
 import io.getstream.chat.android.models.Poll
 import io.getstream.chat.android.models.User
 import io.getstream.chat.android.models.Vote
+import io.getstream.chat.android.ui.common.state.messages.composer.MessageComposerState
 import io.getstream.chat.android.ui.common.state.messages.list.GiphyAction
 import io.getstream.chat.android.ui.common.state.messages.list.MessageItemState
 import io.getstream.chat.android.ui.common.state.messages.poll.PollSelectionType
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.flow
 
 class CustomChatComponentFactory(
     private val delegate: ChatComponentFactory = MessageRemindersComponentFactory(),
@@ -70,6 +80,70 @@ class CustomChatComponentFactory(
         )
     }
 
+    @Composable
+    override fun MessageComposer(
+        messageComposerState: MessageComposerState,
+        onSendMessage: (String, List<Attachment>) -> Unit,
+        modifier: Modifier,
+        onAttachmentsClick: () -> Unit,
+        onCommandsClick: () -> Unit,
+        onValueChange: (String) -> Unit,
+        onAttachmentRemoved: (Attachment) -> Unit,
+        onCancelAction: () -> Unit,
+        onLinkPreviewClick: ((LinkPreview) -> Unit)?,
+        onMentionSelected: (User) -> Unit,
+        onCommandSelected: (Command) -> Unit,
+        onAlsoSendToChannelSelected: (Boolean) -> Unit,
+        recordingActions: AudioRecordingActions,
+        headerContent: @Composable (ColumnScope.(MessageComposerState) -> Unit),
+        footerContent: @Composable (ColumnScope.(MessageComposerState) -> Unit),
+        mentionPopupContent: @Composable ((List<User>) -> Unit),
+        commandPopupContent: @Composable ((List<Command>) -> Unit),
+        integrations: @Composable (RowScope.(MessageComposerState) -> Unit),
+        label: @Composable ((MessageComposerState) -> Unit),
+        input: @Composable (RowScope.(MessageComposerState) -> Unit),
+        audioRecordingContent: @Composable (RowScope.(MessageComposerState) -> Unit),
+        trailingContent: @Composable ((MessageComposerState) -> Unit),
+    ) {
+        val sendMessageState = remember {
+            flow {
+                var enabled = false
+                while (true) {
+                    enabled = !enabled
+                    emit(enabled)
+                    delay(5000)
+                }
+            }
+        }.collectAsState(initial = true)
+        super.MessageComposer(
+            messageComposerState
+                .copy(
+                    sendEnabled = sendMessageState.value
+                ),
+            onSendMessage,
+            modifier,
+            onAttachmentsClick,
+            onCommandsClick,
+            onValueChange,
+            onAttachmentRemoved,
+            onCancelAction,
+            onLinkPreviewClick,
+            onMentionSelected,
+            onCommandSelected,
+            onAlsoSendToChannelSelected,
+            recordingActions,
+            headerContent,
+            footerContent,
+            mentionPopupContent,
+            commandPopupContent,
+            integrations,
+            label,
+            input,
+            audioRecordingContent,
+            trailingContent
+        )
+    }
+
     @Composable
     override fun ColumnScope.MessageItemCenterContent(
         messageItem: MessageItemState,

Copy link
Contributor

github-actions bot commented Sep 3, 2025

SDK Size Comparison 📏

SDK Before After Difference Status
stream-chat-android-client 3.21 MB 3.21 MB 0.00 MB 🟢
stream-chat-android-offline 3.44 MB 3.44 MB 0.00 MB 🟢
stream-chat-android-ui-components 10.52 MB 10.52 MB 0.00 MB 🟢
stream-chat-android-compose 12.70 MB 12.70 MB 0.00 MB 🟢

@JcMinarro JcMinarro force-pushed the feature/local-send-enabled branch 2 times, most recently from af586f7 to 700e3d0 Compare September 10, 2025 11:26
@JcMinarro JcMinarro marked this pull request as ready for review September 10, 2025 11:26
@JcMinarro JcMinarro requested a review from a team as a code owner September 10, 2025 11:26
@JcMinarro JcMinarro force-pushed the feature/local-send-enabled branch from 700e3d0 to 37b164b Compare September 11, 2025 14:16
@JcMinarro JcMinarro enabled auto-merge (squash) September 12, 2025 12:26
Copy link

@JcMinarro JcMinarro merged commit d097f9d into develop Sep 12, 2025
13 checks passed
@JcMinarro JcMinarro deleted the feature/local-send-enabled branch September 12, 2025 14:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants