feat: Enhance message status tracking and logging in MessageRepository and ChatsListViewModel for improved clarity and debugging

This commit is contained in:
k1ngsterr1
2026-01-19 00:32:14 +05:00
parent 8bc1eecf10
commit 19a89ea00e
4 changed files with 111 additions and 30 deletions

View File

@@ -1590,12 +1590,13 @@ fun DialogItemContent(
Spacer(modifier = Modifier.width(4.dp))
} else if (dialog.lastMessageFromMe == 1) {
// Показываем статус только для исходящих сообщений (кроме Saved Messages)
// 🔥 ПРАВИЛЬНАЯ ЛОГИКА:
// - lastMessageRead == 1 → две синие галочки (прочитано собеседником)
// - lastMessageDelivered == 1 && lastMessageRead == 0 → одна галочка (доставлено, но не прочитано)
// - lastMessageDelivered == 0 → одна галочка (отправляется)
when {
dialog.lastMessageDelivered == 2 -> {
// 🔥 ПРАВИЛЬНАЯ ЛОГИКА (синхронизировано с ChatViewModel):
// - lastMessageDelivered == 3 → две синие галочки (прочитано собеседником)
// - lastMessageDelivered == 1 → одна галочка (доставлено)
// - lastMessageDelivered == 0 → часики (отправляется)
// - lastMessageDelivered == 2 → ошибка
when (dialog.lastMessageDelivered) {
2 -> {
// ERROR - показываем иконку ошибки
Icon(
imageVector = Icons.Outlined.ErrorOutline,
@@ -1605,8 +1606,8 @@ fun DialogItemContent(
)
Spacer(modifier = Modifier.width(4.dp))
}
dialog.lastMessageRead == 1 -> {
// ПРОЧИТАНО собеседником - две синие галочки
3 -> {
// READ (delivered=3) - две синие галочки
Icon(
imageVector = Icons.Default.DoneAll,
contentDescription = null,
@@ -1616,7 +1617,7 @@ fun DialogItemContent(
Spacer(modifier = Modifier.width(4.dp))
}
else -> {
// ДОСТАВЛЕНО или ОТПРАВЛЯЕТСЯ - одна серая галочка
// DELIVERED (1) или SENDING (0) - одна серая галочка
Icon(
imageVector = Icons.Default.Done,
contentDescription = null,

View File

@@ -57,6 +57,7 @@ class ChatsListViewModel(application: Application) : AndroidViewModel(applicatio
private val database = RosettaDatabase.getDatabase(application)
private val dialogDao = database.dialogDao()
private val messageDao = database.messageDao() // 🔥 Добавляем для получения статуса последнего сообщения
private var currentAccount: String = ""
private var currentPrivateKey: String? = null
@@ -139,6 +140,16 @@ class ChatsListViewModel(application: Application) : AndroidViewModel(applicatio
dialog.lastMessage // Fallback на зашифрованный текст
}
// 🔥🔥🔥 НОВЫЙ ПОДХОД: Получаем статус НАПРЯМУЮ из таблицы messages
// Это гарантирует синхронизацию с тем что показывается в диалоге
val lastMsgStatus = messageDao.getLastMessageStatus(publicKey, dialog.opponentKey)
val actualFromMe = lastMsgStatus?.fromMe ?: 0
val actualDelivered = if (actualFromMe == 1) (lastMsgStatus?.delivered ?: 0) else 0
val actualRead = if (actualFromMe == 1) (lastMsgStatus?.read ?: 0) else 0
// 🔥 Лог для отладки - показываем и старые и новые значения
android.util.Log.d("ChatsListVM", "📊 Dialog ${dialog.opponentKey.take(16)}... | OLD: fromMe=${dialog.lastMessageFromMe}, del=${dialog.lastMessageDelivered}, read=${dialog.lastMessageRead} | NEW: fromMe=$actualFromMe, del=$actualDelivered, read=$actualRead")
DialogUiModel(
id = dialog.id,
account = dialog.account,
@@ -152,9 +163,9 @@ class ChatsListViewModel(application: Application) : AndroidViewModel(applicatio
lastSeen = dialog.lastSeen,
verified = dialog.verified,
isSavedMessages = isSavedMessages, // 📁 Saved Messages
lastMessageFromMe = dialog.lastMessageFromMe,
lastMessageDelivered = dialog.lastMessageDelivered,
lastMessageRead = dialog.lastMessageRead
lastMessageFromMe = actualFromMe, // 🔥 Используем актуальные данные из messages
lastMessageDelivered = actualDelivered, // 🔥 Используем актуальные данные из messages
lastMessageRead = actualRead // 🔥 Используем актуальные данные из messages
)
}
}