Skip to content

Commit 9a865b3

Browse files
committed
feat(assistant): copy content
Signed-off-by: alperozturk96 <alper_ozturk@proton.me>
1 parent 3393948 commit 9a865b3

1 file changed

Lines changed: 59 additions & 0 deletions

File tree

app/src/main/java/com/nextcloud/client/assistant/chat/ChatContent.kt

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
package com.nextcloud.client.assistant.chat
1111

12+
import android.content.ClipData
1213
import androidx.compose.animation.core.LinearEasing
1314
import androidx.compose.animation.core.RepeatMode
1415
import androidx.compose.animation.core.animateFloat
@@ -17,6 +18,7 @@ import androidx.compose.animation.core.rememberInfiniteTransition
1718
import androidx.compose.animation.core.tween
1819
import androidx.compose.foundation.Image
1920
import androidx.compose.foundation.background
21+
import androidx.compose.foundation.combinedClickable
2022
import androidx.compose.foundation.layout.Arrangement
2123
import androidx.compose.foundation.layout.Box
2224
import androidx.compose.foundation.layout.Column
@@ -36,18 +38,26 @@ import androidx.compose.foundation.shape.CircleShape
3638
import androidx.compose.foundation.shape.RoundedCornerShape
3739
import androidx.compose.material3.Button
3840
import androidx.compose.material3.CircularProgressIndicator
41+
import androidx.compose.material3.DropdownMenu
42+
import androidx.compose.material3.DropdownMenuItem
3943
import androidx.compose.material3.Icon
4044
import androidx.compose.material3.MaterialTheme
4145
import androidx.compose.material3.Text
4246
import androidx.compose.runtime.Composable
4347
import androidx.compose.runtime.LaunchedEffect
4448
import androidx.compose.runtime.collectAsState
4549
import androidx.compose.runtime.getValue
50+
import androidx.compose.runtime.mutableStateOf
51+
import androidx.compose.runtime.remember
52+
import androidx.compose.runtime.rememberCoroutineScope
53+
import androidx.compose.runtime.setValue
4654
import androidx.compose.ui.Alignment
4755
import androidx.compose.ui.Modifier
4856
import androidx.compose.ui.draw.clip
4957
import androidx.compose.ui.draw.scale
5058
import androidx.compose.ui.layout.ContentScale
59+
import androidx.compose.ui.platform.LocalClipboard
60+
import androidx.compose.ui.platform.toClipEntry
5161
import androidx.compose.ui.res.colorResource
5262
import androidx.compose.ui.res.painterResource
5363
import androidx.compose.ui.res.stringResource
@@ -60,6 +70,7 @@ import com.nextcloud.utils.TimeConstants
6070
import com.nextcloud.utils.extensions.time
6171
import com.owncloud.android.R
6272
import com.owncloud.android.lib.resources.assistant.chat.model.ChatMessage
73+
import kotlinx.coroutines.launch
6374
import java.time.Instant
6475

6576
private val MIN_CHAT_HEIGHT = 60.dp
@@ -342,6 +353,10 @@ private fun TypingAnimation() {
342353

343354
@Composable
344355
private fun AssistantMessageItem(message: ChatMessage) {
356+
var showMenu by remember { mutableStateOf(false) }
357+
val clipboard = LocalClipboard.current
358+
val scope = rememberCoroutineScope()
359+
345360
Box(
346361
modifier = Modifier
347362
.padding(vertical = 12.dp)
@@ -375,15 +390,39 @@ private fun AssistantMessageItem(message: ChatMessage) {
375390
)
376391
)
377392
.background(color = colorResource(R.color.bg_message_bubble))
393+
.combinedClickable(
394+
onClick = {},
395+
onLongClick = { showMenu = true }
396+
)
378397
) {
379398
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+
}
380415
}
381416
}
382417
}
383418
}
384419

385420
@Composable
386421
private fun UserMessageItem(message: ChatMessage) {
422+
var showMenu by remember { mutableStateOf(false) }
423+
val clipboard = LocalClipboard.current
424+
val scope = rememberCoroutineScope()
425+
387426
Box(
388427
modifier = Modifier
389428
.padding(vertical = 12.dp)
@@ -402,8 +441,28 @@ private fun UserMessageItem(message: ChatMessage) {
402441
)
403442
)
404443
.background(color = colorResource(R.color.bg_message_bubble))
444+
.combinedClickable(
445+
onClick = {},
446+
onLongClick = { showMenu = true }
447+
)
405448
) {
406449
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+
}
407466
}
408467
}
409468
}

0 commit comments

Comments
 (0)