Skip to content

Commit 8891e22

Browse files
authored
Add spacing between composer snackbar and input row (#6423)
* Add 16 dp gap between snackbar and composer input Address the SDK Testing Feedback ticket about snackbar spacing in the fixed-style composer. Override the snackbar lambda at the composer call site to add 16 dp bottom padding around the visible card. Combined with the existing 16 dp padding inside StreamSnackbar, the visible gap above the input row is now 32 dp. Other changes: - StreamSnackbar.modifier now applies to the outer Box instead of the inner Surface (idiomatic Compose; internal-only API). - Replace the hardcoded 4.dp shadow with StreamTokens.elevation3. - The new entry in the api dump is the auto-generated holder for the inline snackbar lambda. * Drop redundant outer padding around composer input row The Row's padding(vertical = spacing2xs) added 8 dp to the composer surface with no Figma backing; the inner padding already provides the spec spacing. Also remove a wrapContentHeight() from the MessageComposer call in ChannelScreen — Column already grants intrinsic vertical sizing to its children, so the modifier had no effect. Re-record MessageComposerTest snapshots. * Expose composer snackbar via ChatComponentFactory Add MessageComposerSnackbar to the factory with a matching MessageComposerSnackbarParams holder, mirroring the pattern used by the audio-recording snackbars. The default keeps the 16 dp bottom padding introduced in the previous commit. Customers can now override the composer-level snackbar appearance the same way they can override other composer slots.
1 parent 9289f7a commit 8891e22

16 files changed

Lines changed: 50 additions & 9 deletions

stream-chat-android-compose/api/stream-chat-android-compose.api

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1957,6 +1957,7 @@ public final class io/getstream/chat/android/compose/ui/messages/composer/Compos
19571957
public final fun getLambda$-1206314464$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
19581958
public final fun getLambda$-1267828661$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
19591959
public final fun getLambda$-1344661276$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
1960+
public final fun getLambda$-1407581416$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function3;
19601961
public final fun getLambda$-173232017$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
19611962
public final fun getLambda$1180759242$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
19621963
public final fun getLambda$1309976052$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
@@ -3446,6 +3447,7 @@ public abstract interface class io/getstream/chat/android/compose/ui/theme/ChatC
34463447
public fun MessageComposerQuotedMessage (Lio/getstream/chat/android/compose/ui/theme/MessageComposerQuotedMessageParams;Landroidx/compose/runtime/Composer;I)V
34473448
public fun MessageComposerSaveButton (Lio/getstream/chat/android/compose/ui/theme/MessageComposerSaveButtonParams;Landroidx/compose/runtime/Composer;I)V
34483449
public fun MessageComposerSendButton (Lio/getstream/chat/android/compose/ui/theme/MessageComposerSendButtonParams;Landroidx/compose/runtime/Composer;I)V
3450+
public fun MessageComposerSnackbar (Lio/getstream/chat/android/compose/ui/theme/MessageComposerSnackbarParams;Landroidx/compose/runtime/Composer;I)V
34493451
public fun MessageComposerTrailingContent (Lio/getstream/chat/android/compose/ui/theme/MessageComposerTrailingContentParams;Landroidx/compose/runtime/Composer;I)V
34503452
public fun MessageComposerUserSuggestionItem (Lio/getstream/chat/android/compose/ui/theme/MessageComposerUserSuggestionItemParams;Landroidx/compose/runtime/Composer;I)V
34513453
public fun MessageComposerUserSuggestionItemCenterContent (Lio/getstream/chat/android/compose/ui/theme/MessageComposerUserSuggestionItemCenterContentParams;Landroidx/compose/runtime/Composer;I)V
@@ -3636,6 +3638,7 @@ public final class io/getstream/chat/android/compose/ui/theme/ChatComponentFacto
36363638
public static fun MessageComposerQuotedMessage (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lio/getstream/chat/android/compose/ui/theme/MessageComposerQuotedMessageParams;Landroidx/compose/runtime/Composer;I)V
36373639
public static fun MessageComposerSaveButton (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lio/getstream/chat/android/compose/ui/theme/MessageComposerSaveButtonParams;Landroidx/compose/runtime/Composer;I)V
36383640
public static fun MessageComposerSendButton (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lio/getstream/chat/android/compose/ui/theme/MessageComposerSendButtonParams;Landroidx/compose/runtime/Composer;I)V
3641+
public static fun MessageComposerSnackbar (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lio/getstream/chat/android/compose/ui/theme/MessageComposerSnackbarParams;Landroidx/compose/runtime/Composer;I)V
36393642
public static fun MessageComposerTrailingContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lio/getstream/chat/android/compose/ui/theme/MessageComposerTrailingContentParams;Landroidx/compose/runtime/Composer;I)V
36403643
public static fun MessageComposerUserSuggestionItem (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lio/getstream/chat/android/compose/ui/theme/MessageComposerUserSuggestionItemParams;Landroidx/compose/runtime/Composer;I)V
36413644
public static fun MessageComposerUserSuggestionItemCenterContent (Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Lio/getstream/chat/android/compose/ui/theme/MessageComposerUserSuggestionItemCenterContentParams;Landroidx/compose/runtime/Composer;I)V
@@ -4835,6 +4838,18 @@ public final class io/getstream/chat/android/compose/ui/theme/MessageComposerSen
48354838
public fun toString ()Ljava/lang/String;
48364839
}
48374840

4841+
public final class io/getstream/chat/android/compose/ui/theme/MessageComposerSnackbarParams {
4842+
public static final field $stable I
4843+
public fun <init> (Landroidx/compose/material3/SnackbarData;)V
4844+
public final fun component1 ()Landroidx/compose/material3/SnackbarData;
4845+
public final fun copy (Landroidx/compose/material3/SnackbarData;)Lio/getstream/chat/android/compose/ui/theme/MessageComposerSnackbarParams;
4846+
public static synthetic fun copy$default (Lio/getstream/chat/android/compose/ui/theme/MessageComposerSnackbarParams;Landroidx/compose/material3/SnackbarData;ILjava/lang/Object;)Lio/getstream/chat/android/compose/ui/theme/MessageComposerSnackbarParams;
4847+
public fun equals (Ljava/lang/Object;)Z
4848+
public final fun getData ()Landroidx/compose/material3/SnackbarData;
4849+
public fun hashCode ()I
4850+
public fun toString ()Ljava/lang/String;
4851+
}
4852+
48384853
public final class io/getstream/chat/android/compose/ui/theme/MessageComposerTrailingContentParams {
48394854
public static final field $stable I
48404855
public fun <init> (Lio/getstream/chat/android/ui/common/state/messages/composer/MessageComposerState;)V

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
3131
import androidx.compose.foundation.layout.ime
3232
import androidx.compose.foundation.layout.padding
3333
import androidx.compose.foundation.layout.safeDrawingPadding
34-
import androidx.compose.foundation.layout.wrapContentHeight
3534
import androidx.compose.material3.MaterialTheme
3635
import androidx.compose.material3.Scaffold
3736
import androidx.compose.material3.SnackbarDuration
@@ -367,9 +366,7 @@ internal fun DefaultBottomBarContent(
367366

368367
Column {
369368
MessageComposer(
370-
modifier = Modifier
371-
.fillMaxWidth()
372-
.wrapContentHeight(),
369+
modifier = Modifier.fillMaxWidth(),
373370
viewModel = composerViewModel,
374371
isAttachmentPickerVisible = attachmentsPickerViewModel.isPickerVisible,
375372
onAttachmentsClick = attachmentsPickerViewModel::togglePickerVisibility,

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import io.getstream.chat.android.compose.ui.theme.LocalChatUiConfig
5757
import io.getstream.chat.android.compose.ui.theme.MessageComposerInputParams
5858
import io.getstream.chat.android.compose.ui.theme.MessageComposerLeadingContentParams
5959
import io.getstream.chat.android.compose.ui.theme.MessageComposerParams
60+
import io.getstream.chat.android.compose.ui.theme.MessageComposerSnackbarParams
6061
import io.getstream.chat.android.compose.ui.theme.MessageComposerTrailingContentParams
6162
import io.getstream.chat.android.compose.ui.theme.StreamTokens
6263
import io.getstream.chat.android.compose.ui.util.SnackbarPopup
@@ -299,7 +300,6 @@ public fun MessageComposer(
299300

300301
Row(
301302
modifier = Modifier
302-
.padding(vertical = StreamTokens.spacing2xs)
303303
.fillMaxWidth()
304304
.padding(
305305
start = StreamTokens.spacingMd,
@@ -330,7 +330,11 @@ public fun MessageComposer(
330330
)
331331

332332
if (snackbarHostState.currentSnackbarData != null) {
333-
SnackbarPopup(hostState = snackbarHostState)
333+
SnackbarPopup(hostState = snackbarHostState) { snackbarData ->
334+
ChatTheme.componentFactory.MessageComposerSnackbar(
335+
params = MessageComposerSnackbarParams(data = snackbarData),
336+
)
337+
}
334338
}
335339
}
336340
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1705,6 +1705,22 @@ public interface ChatComponentFactory {
17051705
StreamSnackbar(snackbarData = params.data)
17061706
}
17071707

1708+
/**
1709+
* The snackbar shown above the message composer for validation errors and command-related
1710+
* events.
1711+
*
1712+
* Override this method to provide a custom snackbar appearance for the composer.
1713+
*
1714+
* @param params Parameters for this component.
1715+
*/
1716+
@Composable
1717+
public fun MessageComposerSnackbar(params: MessageComposerSnackbarParams) {
1718+
StreamSnackbar(
1719+
modifier = Modifier.padding(bottom = StreamTokens.spacingMd),
1720+
snackbarData = params.data,
1721+
)
1722+
}
1723+
17081724
/**
17091725
* The default avatar component that displays an image from a URL or falls back to a placeholder.
17101726
* This component serves as the foundational UI for all avatar types.

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1282,6 +1282,15 @@ public data class MessageComposerAudioRecordingHintParams(
12821282
val data: SnackbarData,
12831283
)
12841284

1285+
/**
1286+
* Parameters for [ChatComponentFactory.MessageComposerSnackbar].
1287+
*
1288+
* @param data The snackbar data containing the message, variant, and optional action.
1289+
*/
1290+
public data class MessageComposerSnackbarParams(
1291+
val data: SnackbarData,
1292+
)
1293+
12851294
/**
12861295
* Parameters for [ChatComponentFactory.Avatar].
12871296
*

stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/util/StreamSnackbar.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ internal data class StreamSnackbarVisuals(
7575
* snackbar's variant), and an optional action button.
7676
*
7777
* @param snackbarData The [SnackbarData] driving the message, variant, and optional action.
78-
* @param modifier Modifier applied to the inner [Surface] (e.g. to control width or padding).
78+
* @param modifier Modifier for styling.
7979
*/
8080
@Composable
8181
internal fun StreamSnackbar(
@@ -85,9 +85,9 @@ internal fun StreamSnackbar(
8585
val actionLabel = snackbarData.visuals.actionLabel
8686
val variant = (snackbarData.visuals as? StreamSnackbarVisuals)?.variant
8787
?: StreamSnackbarVariant.Default
88-
Box(modifier = Modifier.padding(StreamTokens.spacingMd)) {
88+
Box(modifier = modifier.padding(StreamTokens.spacingMd)) {
8989
Surface(
90-
modifier = modifier.shadow(4.dp, shape = SnackbarShape),
90+
modifier = Modifier.shadow(elevation = StreamTokens.elevation3, shape = SnackbarShape),
9191
shape = SnackbarShape,
9292
color = ChatTheme.colors.backgroundCoreInverse,
9393
contentColor = ChatTheme.colors.textOnInverse,
Loading
Loading
Loading
Loading

0 commit comments

Comments
 (0)