slightly increase padding (#295)

* slightly increase padding

* better colors

* add copy to bottom sheet

* increase font size

* base font size

* anchor chat at the bottom
This commit is contained in:
callebtc
2025-08-23 14:14:42 +02:00
committed by GitHub
parent 26520991cf
commit a7604d9026
10 changed files with 185 additions and 144 deletions
@@ -11,7 +11,11 @@ import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.bitchat.android.ui.theme.BASE_FONT_SIZE
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.text.AnnotatedString
import kotlinx.coroutines.launch
import com.bitchat.android.model.BitchatMessage
/**
* User Action Sheet for selecting actions on a specific user (slap, hug, block)
@@ -23,10 +27,12 @@ fun ChatUserSheet(
isPresented: Boolean,
onDismiss: () -> Unit,
targetNickname: String,
selectedMessage: BitchatMessage? = null,
viewModel: ChatViewModel,
modifier: Modifier = Modifier
) {
val coroutineScope = rememberCoroutineScope()
val clipboardManager = LocalClipboardManager.current
// Bottom sheet state
val sheetState = rememberModalBottomSheetState(
@@ -39,6 +45,7 @@ fun ChatUserSheet(
val standardGreen = if (isDark) Color(0xFF32D74B) else Color(0xFF248A3D) // iOS green
val standardBlue = Color(0xFF007AFF) // iOS blue
val standardRed = Color(0xFFFF3B30) // iOS red
val standardGrey = if (isDark) Color(0xFF8E8E93) else Color(0xFF6D6D70) // iOS grey
if (isPresented) {
ModalBottomSheet(
@@ -62,7 +69,7 @@ fun ChatUserSheet(
)
Text(
text = "choose an action for this user",
text = if (selectedMessage != null) "choose an action for this message or user" else "choose an action for this user",
fontSize = 12.sp,
fontFamily = FontFamily.Monospace,
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.7f)
@@ -72,53 +79,72 @@ fun ChatUserSheet(
LazyColumn(
modifier = Modifier.fillMaxWidth()
) {
// Slap action
item {
UserActionRow(
title = "slap $targetNickname",
subtitle = "send a playful slap message",
titleColor = standardBlue,
onClick = {
// Send slap command
viewModel.sendMessage("/slap $targetNickname")
onDismiss()
}
)
}
// Hug action
item {
UserActionRow(
title = "hug $targetNickname",
subtitle = "send a friendly hug message",
titleColor = standardGreen,
onClick = {
// Send hug command
viewModel.sendMessage("/hug $targetNickname")
onDismiss()
}
)
}
// Block action
item {
UserActionRow(
title = "block $targetNickname",
subtitle = "block all messages from this user",
titleColor = standardRed,
onClick = {
// Check if we're in a geohash channel
val selectedLocationChannel = viewModel.selectedLocationChannel.value
if (selectedLocationChannel is com.bitchat.android.geohash.ChannelID.Location) {
// Get user's nostr public key and add to geohash block list
viewModel.blockUserInGeohash(targetNickname)
} else {
// Regular mesh blocking
viewModel.sendMessage("/block $targetNickname")
// Copy message action (only show if we have a message)
selectedMessage?.let { message ->
item {
UserActionRow(
title = "copy message",
subtitle = "copy this message to clipboard",
titleColor = standardGrey,
onClick = {
// Copy the message content to clipboard
clipboardManager.setText(AnnotatedString(message.content))
onDismiss()
}
onDismiss()
}
)
)
}
}
// Only show user actions for other users' messages or when no message is selected
if (selectedMessage?.sender != viewModel.nickname.value) {
// Slap action
item {
UserActionRow(
title = "slap $targetNickname",
subtitle = "send a playful slap message",
titleColor = standardBlue,
onClick = {
// Send slap command
viewModel.sendMessage("/slap $targetNickname")
onDismiss()
}
)
}
// Hug action
item {
UserActionRow(
title = "hug $targetNickname",
subtitle = "send a friendly hug message",
titleColor = standardGreen,
onClick = {
// Send hug command
viewModel.sendMessage("/hug $targetNickname")
onDismiss()
}
)
}
// Block action
item {
UserActionRow(
title = "block $targetNickname",
subtitle = "block all messages from this user",
titleColor = standardRed,
onClick = {
// Check if we're in a geohash channel
val selectedLocationChannel = viewModel.selectedLocationChannel.value
if (selectedLocationChannel is com.bitchat.android.geohash.ChannelID.Location) {
// Get user's nostr public key and add to geohash block list
viewModel.blockUserInGeohash(targetNickname)
} else {
// Regular mesh blocking
viewModel.sendMessage("/block $targetNickname")
}
onDismiss()
}
)
}
}
}
@@ -133,7 +159,7 @@ fun ChatUserSheet(
) {
Text(
text = "cancel",
fontSize = 14.sp,
fontSize = BASE_FONT_SIZE.sp,
fontFamily = FontFamily.Monospace
)
}
@@ -164,7 +190,7 @@ private fun UserActionRow(
) {
Text(
text = title,
fontSize = 14.sp,
fontSize = BASE_FONT_SIZE.sp,
fontFamily = FontFamily.Monospace,
fontWeight = FontWeight.Medium,
color = titleColor