fix: Simplify message selection logic by using only message ID; improve performance and reduce potential errors

This commit is contained in:
k1ngsterr1
2026-01-17 03:38:41 +05:00
parent 3eb841c145
commit 2a16d39e02

View File

@@ -625,7 +625,7 @@ fun ChatDetailScreen(
IconButton( IconButton(
onClick = { onClick = {
val textToCopy = messages val textToCopy = messages
.filter { selectedMessages.contains("${it.id}_${it.timestamp.time}") } .filter { selectedMessages.contains(it.id) }
.sortedBy { it.timestamp } .sortedBy { it.timestamp }
.joinToString("\n\n") { msg -> .joinToString("\n\n") { msg ->
val time = SimpleDateFormat("HH:mm", Locale.getDefault()) val time = SimpleDateFormat("HH:mm", Locale.getDefault())
@@ -648,7 +648,7 @@ fun ChatDetailScreen(
IconButton( IconButton(
onClick = { onClick = {
messages messages
.filter { selectedMessages.contains("${it.id}_${it.timestamp.time}") } .filter { selectedMessages.contains(it.id) }
.forEach { msg -> viewModel.deleteMessage(msg.id) } .forEach { msg -> viewModel.deleteMessage(msg.id) }
selectedMessages = emptySet() selectedMessages = emptySet()
} }
@@ -939,7 +939,7 @@ fun ChatDetailScreen(
.background(PrimaryBlue.copy(alpha = 0.1f)) .background(PrimaryBlue.copy(alpha = 0.1f))
.clickable { .clickable {
val selectedMsgs = messages val selectedMsgs = messages
.filter { selectedMessages.contains("${it.id}_${it.timestamp.time}") } .filter { selectedMessages.contains(it.id) }
.sortedBy { it.timestamp } .sortedBy { it.timestamp }
viewModel.setReplyMessages(selectedMsgs) viewModel.setReplyMessages(selectedMsgs)
selectedMessages = emptySet() selectedMessages = emptySet()
@@ -976,7 +976,7 @@ fun ChatDetailScreen(
.clickable { .clickable {
// 📨 Сохраняем сообщения в ForwardManager и показываем выбор чата // 📨 Сохраняем сообщения в ForwardManager и показываем выбор чата
val selectedMsgs = messages val selectedMsgs = messages
.filter { selectedMessages.contains("${it.id}_${it.timestamp.time}") } .filter { selectedMessages.contains(it.id) }
.sortedBy { it.timestamp } .sortedBy { it.timestamp }
val forwardMessages = selectedMsgs.map { msg -> val forwardMessages = selectedMsgs.map { msg ->
@@ -1167,9 +1167,9 @@ fun ChatDetailScreen(
) { ) {
// Reversed layout: item 0 = самое новое сообщение (внизу экрана) // Reversed layout: item 0 = самое новое сообщение (внизу экрана)
// messagesWithDates уже отсортирован новые->старые // messagesWithDates уже отсортирован новые->старые
// 🔥 Используем уникальный ключ: id + timestamp + index для гарантии уникальности // 🔥 Используем только id как ключ - без index, чтобы избежать прыгания при добавлении новых сообщений
itemsIndexed(messagesWithDates, key = { index, item -> itemsIndexed(messagesWithDates, key = { _, item ->
"${item.first.id}_${item.first.timestamp.time}_$index" item.first.id
}) { }) {
index, index,
(message, showDate) -> (message, showDate) ->
@@ -1188,8 +1188,8 @@ fun ChatDetailScreen(
secondaryTextColor = secondaryTextColor secondaryTextColor = secondaryTextColor
) )
} }
// 🔥 Уникальный ключ для выделения: id + timestamp // 🔥 Ключ для выделения - используем только ID (как и в key списка)
val selectionKey = "${message.id}_${message.timestamp.time}" val selectionKey = message.id
MessageBubble( MessageBubble(
message = message, message = message,
isDarkTheme = isDarkTheme, isDarkTheme = isDarkTheme,