@@ -15,6 +15,7 @@ import androidx.compose.foundation.horizontalScroll
1515import androidx.compose.foundation.layout.Arrangement
1616import androidx.compose.foundation.layout.Box
1717import androidx.compose.foundation.layout.BoxScope
18+ import androidx.compose.foundation.layout.BoxWithConstraints
1819import androidx.compose.foundation.layout.Column
1920import androidx.compose.foundation.layout.ColumnScope
2021import androidx.compose.foundation.layout.Row
@@ -57,6 +58,7 @@ import androidx.compose.ui.text.font.FontWeight
5758import androidx.compose.ui.text.style.TextAlign
5859import androidx.compose.ui.text.style.TextOverflow
5960import androidx.compose.ui.tooling.preview.Preview
61+ import androidx.compose.ui.unit.Dp
6062import androidx.compose.ui.unit.dp
6163import androidx.compose.ui.unit.sp
6264import androidx.core.graphics.ColorUtils
@@ -81,6 +83,7 @@ private const val SINGLE_EMOJI_SIZE_MULTIPLIER = 2.5f
8183private const val HALF_OPACITY = 127
8284private const val MESSAGE_LENGTH_THRESHOLD = 25
8385private const val ANIMATED_BLINK = 500
86+ private const val MESSAGE_BUBBLE_MAX_WIDTH_FRACTION = 0.8f
8487
8588private val bubbleRadiusBig = 10 .dp
8689private val bubbleRadiusSmall = 2 .dp
@@ -222,28 +225,33 @@ fun MessageScaffold(
222225 }
223226 }
224227
225- Row (
226- modifier = Modifier .fillMaxWidth(),
227- horizontalArrangement = if (incoming) Arrangement .Start else Arrangement .End
228- ) {
229- MessageLeadingDecoration (
230- uiMessage = uiMessage,
231- isOneToOneConversation = isOneToOneConversation
232- )
233- MessageBubbleWithReactions (
234- uiMessage = uiMessage,
235- incoming = incoming,
236- includePadding = includePadding,
237- isOneToOneConversation = isOneToOneConversation,
238- conversationThreadId = conversationThreadId,
239- shape = shape,
240- resolvedBubbleColor = resolvedBubbleColor,
241- metadataLayoutMode = metadataLayoutMode,
242- captionText = captionText,
243- showInlineMetadata = showInlineMetadata,
244- showQuote = showQuote,
245- content = content
246- )
228+ BoxWithConstraints (modifier = Modifier .fillMaxWidth()) {
229+ val messageBubbleMaxWidth = maxWidth * MESSAGE_BUBBLE_MAX_WIDTH_FRACTION
230+
231+ Row (
232+ modifier = Modifier .fillMaxWidth(),
233+ horizontalArrangement = if (incoming) Arrangement .Start else Arrangement .End
234+ ) {
235+ MessageLeadingDecoration (
236+ uiMessage = uiMessage,
237+ isOneToOneConversation = isOneToOneConversation
238+ )
239+ MessageBubbleWithReactions (
240+ uiMessage = uiMessage,
241+ incoming = incoming,
242+ includePadding = includePadding,
243+ isOneToOneConversation = isOneToOneConversation,
244+ conversationThreadId = conversationThreadId,
245+ maxBubbleWidth = messageBubbleMaxWidth,
246+ shape = shape,
247+ resolvedBubbleColor = resolvedBubbleColor,
248+ metadataLayoutMode = metadataLayoutMode,
249+ captionText = captionText,
250+ showInlineMetadata = showInlineMetadata,
251+ showQuote = showQuote,
252+ content = content
253+ )
254+ }
247255 }
248256}
249257
@@ -282,6 +290,7 @@ private fun MessageBubbleWithReactions(
282290 includePadding : Boolean ,
283291 isOneToOneConversation : Boolean ,
284292 conversationThreadId : Long? ,
293+ maxBubbleWidth : Dp ,
285294 shape : RoundedCornerShape ,
286295 resolvedBubbleColor : Color ,
287296 metadataLayoutMode : MetadataLayoutMode ,
@@ -292,7 +301,7 @@ private fun MessageBubbleWithReactions(
292301) {
293302 val bubbleModifier = Modifier
294303 .defaultMinSize(60 .dp, 40 .dp)
295- .widthIn(60 .dp, 280 .dp )
304+ .widthIn(60 .dp, maxBubbleWidth )
296305
297306 val hasReactionsOrThread = uiMessage.reactions.isNotEmpty() ||
298307 isFirstMessageOfThreadInNormalChat(uiMessage, conversationThreadId)
0 commit comments