fix: Simplify message selection logic by using only message ID; improve performance and reduce potential errors
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user