feat(chat): 回车发送 + 长按气泡复制

输入框 imeAction=Send(回车即发送);长按气泡体复制原文到剪贴板并 Toast 提示。
This commit is contained in:
AskaEth committed 2026-09-08 22:08:52 +08:00
1 parent 0ea41f5815
commit 33770d87a6
3 files changed
+38

No files matched your search

@@ -16,6 +16,8 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
@@ -26,6 +28,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.lifecycle.viewmodel.initializer
@@ -195,6 +198,8 @@ private fun InputBar(
label = "和昔涟说点什么…",
useLabelAsPlaceholder = true,
maxLines = 5,
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Send),
keyboardActions = KeyboardActions(onSend = { onSend() }),
modifier = Modifier.weight(1f),
)
Spacer(Modifier.width(8.dp))
@@ -0,0 +1,32 @@
package top.yeij.cyrene.ui.chat
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.widget.Toast
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext
/**
* 长按复制文本到系统剪贴板,并给一条 Toast 反馈。
* 用框架的 ClipboardManager 而不是 Compose 的 LocalClipboardManager(后者在新版本已弃用)。
*/
@Composable
fun Modifier.copyOnLongPress(text: String): Modifier {
if (text.isBlank()) return this
val context = LocalContext.current
return this.pointerInput(text) {
detectTapGestures(
onLongPress = { copyToClipboard(context, text) },
)
}
}
private fun copyToClipboard(context: Context, text: String) {
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
clipboard.setPrimaryClip(ClipData.newPlainText("Cyrene", text))
Toast.makeText(context, "已复制", Toast.LENGTH_SHORT).show()
}
@@ -143,6 +143,7 @@ private fun BubbleBody(text: String, isUser: Boolean) {
Box(
modifier = Modifier
.widthIn(max = 300.dp)
.copyOnLongPress(text)
.background(
color = if (isUser) {
MiuixTheme.colorScheme.primary