fix: fix image loading & caching state

This commit is contained in:
k1ngsterr1
2026-02-04 00:37:33 +05:00
parent be80e0eba8
commit 9d7c016b70
2 changed files with 55 additions and 12 deletions

View File

@@ -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)
/**
* Обновить статус прочтения
*/

View File

@@ -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)