@@ -352,11 +352,33 @@ private fun TypingAnimation() {
352352}
353353
354354@Composable
355- private fun AssistantMessageItem ( message : ChatMessage ) {
355+ private fun CopyableMessageBubble ( text : String , modifier : Modifier = Modifier , content : @Composable () -> Unit ) {
356356 var showMenu by remember { mutableStateOf(false ) }
357357 val clipboard = LocalClipboard .current
358358 val scope = rememberCoroutineScope()
359359
360+ Box (
361+ modifier = modifier
362+ .combinedClickable(onClick = {}, onLongClick = { showMenu = true })
363+ ) {
364+ content()
365+ DropdownMenu (expanded = showMenu, onDismissRequest = { showMenu = false }) {
366+ DropdownMenuItem (
367+ text = { Text (stringResource(R .string.common_copy)) },
368+ onClick = {
369+ scope.launch {
370+ val plainText = ClipData .newPlainText(null , text).toClipEntry()
371+ clipboard.setClipEntry(plainText)
372+ }
373+ showMenu = false
374+ }
375+ )
376+ }
377+ }
378+ }
379+
380+ @Composable
381+ private fun AssistantMessageItem (message : ChatMessage ) {
360382 Box (
361383 modifier = Modifier
362384 .padding(vertical = 12 .dp)
@@ -378,7 +400,8 @@ private fun AssistantMessageItem(message: ChatMessage) {
378400 alignment = Alignment .Center
379401 )
380402 }
381- Box (
403+ CopyableMessageBubble (
404+ text = message.content,
382405 modifier = Modifier
383406 .padding(start = 8 .dp, end = 16 .dp)
384407 .defaultMinSize(minHeight = MIN_CHAT_HEIGHT )
@@ -390,46 +413,23 @@ private fun AssistantMessageItem(message: ChatMessage) {
390413 )
391414 )
392415 .background(color = colorResource(R .color.bg_message_bubble))
393- .combinedClickable(
394- onClick = {},
395- onLongClick = { showMenu = true }
396- )
397416 ) {
398417 MessageTextItem (message)
399- DropdownMenu (
400- expanded = showMenu,
401- onDismissRequest = { showMenu = false }
402- ) {
403- DropdownMenuItem (
404- text = { Text (stringResource(R .string.common_copy)) },
405- onClick = {
406- scope.launch {
407- clipboard.setClipEntry(
408- ClipData .newPlainText(null , message.content).toClipEntry()
409- )
410- }
411- showMenu = false
412- }
413- )
414- }
415418 }
416419 }
417420 }
418421}
419422
420423@Composable
421424private fun UserMessageItem (message : ChatMessage ) {
422- var showMenu by remember { mutableStateOf(false ) }
423- val clipboard = LocalClipboard .current
424- val scope = rememberCoroutineScope()
425-
426425 Box (
427426 modifier = Modifier
428427 .padding(vertical = 12 .dp)
429428 .fillMaxWidth(),
430429 contentAlignment = Alignment .CenterEnd
431430 ) {
432- Box (
431+ CopyableMessageBubble (
432+ text = message.content,
433433 modifier = Modifier
434434 .padding(start = 16 .dp, end = 8 .dp)
435435 .defaultMinSize(minHeight = MIN_CHAT_HEIGHT )
@@ -441,28 +441,8 @@ private fun UserMessageItem(message: ChatMessage) {
441441 )
442442 )
443443 .background(color = colorResource(R .color.bg_message_bubble))
444- .combinedClickable(
445- onClick = {},
446- onLongClick = { showMenu = true }
447- )
448444 ) {
449445 MessageTextItem (message)
450- DropdownMenu (
451- expanded = showMenu,
452- onDismissRequest = { showMenu = false }
453- ) {
454- DropdownMenuItem (
455- text = { Text (stringResource(R .string.common_copy)) },
456- onClick = {
457- scope.launch {
458- clipboard.setClipEntry(
459- ClipData .newPlainText(null , message.content).toClipEntry()
460- )
461- }
462- showMenu = false
463- }
464- )
465- }
466446 }
467447 }
468448}
0 commit comments