feat: add context menu for chat message #43

Merged
reya merged 4 commits from feat/context-menu into master 2026-07-13 10:56:23 +00:00
Showing only changes of commit 7d2a81ece3 - Show all commits

View File

@@ -39,6 +39,7 @@ import androidx.compose.material3.Badge
import androidx.compose.material3.BadgedBox import androidx.compose.material3.BadgedBox
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.DropdownMenuGroup
import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.FilledTonalButton
@@ -47,6 +48,7 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.LoadingIndicator import androidx.compose.material3.LoadingIndicator
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.MenuDefaults
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.ScaffoldDefaults
import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHost
@@ -479,6 +481,7 @@ fun ChatScreen(
} }
} }
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
private fun ContextMenu(onAction: (String) -> Unit) { private fun ContextMenu(onAction: (String) -> Unit) {
val menuItems = listOf( val menuItems = listOf(
@@ -487,29 +490,31 @@ private fun ContextMenu(onAction: (String) -> Unit) {
Triple("Info", Res.drawable.ic_info, false), Triple("Info", Res.drawable.ic_info, false),
) )
Surface( DropdownMenuGroup(
shape = RoundedCornerShape(24.dp), shapes = MenuDefaults.groupShape(1, 1),
color = MaterialTheme.colorScheme.tertiaryContainer, containerColor = MenuDefaults.groupVibrantContainerColor,
modifier = Modifier.width(220.dp) modifier = Modifier.width(220.dp)
) { ) {
Column(modifier = Modifier.padding(8.dp)) { val itemCount = menuItems.size
menuItems.forEach { (label, icon, hasDivider) ->
DropdownMenuItem( menuItems.forEachIndexed { index, (label, icon, hasDivider) ->
text = { Text(label) }, DropdownMenuItem(
onClick = { onAction(label) }, shapes = MenuDefaults.itemShape(index, itemCount),
leadingIcon = { colors = MenuDefaults.selectableItemVibrantColors(),
Icon( text = { Text(label) },
painter = painterResource(icon), leadingIcon = {
contentDescription = label, Icon(
) painter = painterResource(icon),
} contentDescription = label,
)
if (hasDivider) {
HorizontalDivider(
modifier = Modifier.padding(vertical = 4.dp),
color = MaterialTheme.colorScheme.outlineVariant.copy(alpha = 0.5f)
) )
} },
checked = false,
onCheckedChange = { _ -> onAction(label) },
)
if (hasDivider) {
HorizontalDivider(
modifier = Modifier.padding(vertical = 4.dp),
)
} }
} }
} }