update message position

This commit is contained in:
2026-07-13 09:55:35 +07:00
parent 6beaf05f1c
commit 2e290cce0c
2 changed files with 32 additions and 21 deletions

View File

@@ -107,7 +107,11 @@ fun rememberMessageUiModel(
}
@Composable
fun ChatMessage(model: MessageUiModel, onLongClick: (Rect) -> Unit = {}) {
fun ChatMessage(
model: MessageUiModel,
modifier: Modifier = Modifier,
onLongClick: (Rect) -> Unit = {}
) {
var isMessageClicked by remember { mutableStateOf(false) }
var layoutCoordinates by remember { mutableStateOf<LayoutCoordinates?>(null) }
@@ -124,10 +128,10 @@ fun ChatMessage(model: MessageUiModel, onLongClick: (Rect) -> Unit = {}) {
if (!model.isMine) MaterialTheme.colorScheme.onSurface else MaterialTheme.colorScheme.onPrimaryContainer
Box(
modifier = Modifier
modifier = modifier
.onGloballyPositioned { layoutCoordinates = it }
.fillMaxWidth()
.padding(vertical = 4.dp)
.onGloballyPositioned { layoutCoordinates = it },
.padding(vertical = 4.dp),
contentAlignment = if (model.isMine) Alignment.CenterEnd else Alignment.CenterStart
) {
Column(

View File

@@ -64,6 +64,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.blur
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalWindowInfo
@@ -277,8 +278,14 @@ fun ChatScreen(
currentUserPublicKey = currentUser?.publicKey,
contentColor = if (isMine) mineColor else otherColor
)
val isHighlighted =
selectedMessage?.first?.id == uiModel.id
ChatMessage(
model = uiModel,
modifier = Modifier.graphicsLayer {
alpha = if (isHighlighted) 0f else 1f
},
onLongClick = { rect ->
selectedMessage = uiModel to rect
}
@@ -419,27 +426,27 @@ fun ChatScreen(
val contentBottomDp = with(density) { (bounds.bottom + totalExtraHeightPx).toDp() }
Spacer(modifier = Modifier.height(contentBottomDp + 200.dp))
Column(
ChatMessage(
model = model,
modifier = Modifier
.offset {
IntOffset(
0,
if (showAbove) (bounds.top - totalExtraHeightPx).toInt()
.coerceAtLeast(0) else bounds.top.toInt()
.offset { IntOffset(0, bounds.top.toInt()) }
.padding(horizontal = 16.dp)
)
val menuOffset = if (showAbove) {
bounds.top - totalExtraHeightPx
} else {
bounds.bottom + with(density) { 12.dp.toPx() } // 12dp spacing below
}
Box(
modifier = Modifier
.offset { IntOffset(0, menuOffset.toInt().coerceAtLeast(0)) }
.fillMaxWidth()
.padding(horizontal = 16.dp),
horizontalAlignment = if (model.isMine) Alignment.End else Alignment.Start,
verticalArrangement = Arrangement.spacedBy(12.dp)
contentAlignment = if (model.isMine) Alignment.CenterEnd else Alignment.CenterStart
) {
if (showAbove) {
ContextMenu { selectedMessage = null }
ChatMessage(model = model)
} else {
ChatMessage(model = model)
ContextMenu { selectedMessage = null }
}
}
}
}