From 9d7c016b70d0ae59b059da2b566876c56c4f23b1 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Wed, 4 Feb 2026 00:37:33 +0500 Subject: [PATCH] fix: fix image loading & caching state --- .../messenger/database/MessageEntities.kt | 6 ++ .../messenger/ui/chats/ChatViewModel.kt | 61 +++++++++++++++---- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/database/MessageEntities.kt b/app/src/main/java/com/rosetta/messenger/database/MessageEntities.kt index 9ecdfc6..d5d4587 100644 --- a/app/src/main/java/com/rosetta/messenger/database/MessageEntities.kt +++ b/app/src/main/java/com/rosetta/messenger/database/MessageEntities.kt @@ -236,6 +236,12 @@ interface MessageDao { @Query("UPDATE messages SET delivered = :status WHERE account = :account AND message_id = :messageId") suspend fun updateDeliveryStatus(account: String, messageId: String, status: Int) + /** + * 🔄 Обновить статус доставки и attachments (для очистки localUri после отправки) + */ + @Query("UPDATE messages SET delivered = :status, attachments = :attachments WHERE account = :account AND message_id = :messageId") + suspend fun updateDeliveryStatusAndAttachments(account: String, messageId: String, status: Int, attachments: String) + /** * Обновить статус прочтения */ diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt index 1617a74..48a7a4e 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt @@ -385,6 +385,36 @@ if (message.id in currentIds) { _messages.value = _messages.value.map { msg -> if (msg.id == messageId) msg.copy(status = status) else msg } + + // 🔥 Также обновляем кэш! + updateCacheFromCurrentMessages() + } + + /** + * 🔄 Очистить localUri в attachments сообщения (после успешной отправки) + */ + private fun updateMessageAttachments(messageId: String, localUri: String?) { + _messages.value = _messages.value.map { msg -> + if (msg.id == messageId) { + val updatedAttachments = msg.attachments.map { att -> + att.copy(localUri = localUri ?: "") + } + msg.copy(attachments = updatedAttachments) + } else msg + } + + // 🔥 Также обновляем кэш! + updateCacheFromCurrentMessages() + } + + /** + * 🔥 Обновить кэш из текущих сообщений (для синхронизации после изменений) + */ + private fun updateCacheFromCurrentMessages() { + val account = myPublicKey ?: return + val opponent = opponentKey ?: return + val dialogKey = getDialogKey(account, opponent) + updateCacheWithLimit(dialogKey, _messages.value) } /** @@ -398,6 +428,17 @@ if (message.id in currentIds) { } } + /** + * 🔄 Обновить статус и attachments в БД (для очистки localUri после отправки) + */ + private suspend fun updateMessageStatusAndAttachmentsInDb(messageId: String, delivered: Int, attachmentsJson: String) { + val account = myPublicKey ?: return + try { + messageDao.updateDeliveryStatusAndAttachments(account, messageId, delivered, attachmentsJson) + } catch (e: Exception) { + } + } + /** * Установить ключи пользователя */ @@ -1702,24 +1743,20 @@ val newList = messages + optimisticMessages }) }.toString() - saveMessageToDatabase( - messageId = messageId, - text = caption, - encryptedContent = encryptedContent, - encryptedKey = encryptedKey, - timestamp = timestamp, - isFromMe = true, - delivered = if (isSavedMessages) 2 else 0, - attachmentsJson = attachmentsJson - ) + // 🔄 Обновляем статус на SENT и очищаем localUri в attachments + // (сообщение уже существует в БД от optimistic UI, поэтому просто обновляем) + val finalAttachmentsJson = attachmentsJson // Уже без localUri - // Обновляем статус на SENT if (!isSavedMessages) { - updateMessageStatusInDb(messageId, 2) + updateMessageStatusAndAttachmentsInDb(messageId, 2, finalAttachmentsJson) + } else { + updateMessageStatusAndAttachmentsInDb(messageId, 2, finalAttachmentsJson) } withContext(Dispatchers.Main) { updateMessageStatus(messageId, MessageStatus.SENT) + // Также очищаем localUri в UI + updateMessageAttachments(messageId, null) } saveDialog(if (caption.isNotEmpty()) caption else "photo", timestamp)