fix: add localUri support for image attachments and optimize optimistic message handling
This commit is contained in:
@@ -911,7 +911,8 @@ val newList = messages + optimisticMessages
|
|||||||
type = attachmentType,
|
type = attachmentType,
|
||||||
preview = attachment.optString("preview", ""),
|
preview = attachment.optString("preview", ""),
|
||||||
width = attachment.optInt("width", 0),
|
width = attachment.optInt("width", 0),
|
||||||
height = attachment.optInt("height", 0)
|
height = attachment.optInt("height", 0),
|
||||||
|
localUri = attachment.optString("localUri", "") // 🔥 Поддержка localUri из БД
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -1487,6 +1488,7 @@ val newList = messages + optimisticMessages
|
|||||||
val messageId = UUID.randomUUID().toString().replace("-", "").take(32)
|
val messageId = UUID.randomUUID().toString().replace("-", "").take(32)
|
||||||
val timestamp = System.currentTimeMillis()
|
val timestamp = System.currentTimeMillis()
|
||||||
val text = caption.trim()
|
val text = caption.trim()
|
||||||
|
val attachmentId = "img_$timestamp"
|
||||||
|
|
||||||
// 1. 🚀 МГНОВЕННО показываем optimistic сообщение с localUri
|
// 1. 🚀 МГНОВЕННО показываем optimistic сообщение с localUri
|
||||||
// Используем URI напрямую для отображения (без конвертации в base64)
|
// Используем URI напрямую для отображения (без конвертации в base64)
|
||||||
@@ -1498,7 +1500,7 @@ val newList = messages + optimisticMessages
|
|||||||
status = MessageStatus.SENDING,
|
status = MessageStatus.SENDING,
|
||||||
attachments = listOf(
|
attachments = listOf(
|
||||||
MessageAttachment(
|
MessageAttachment(
|
||||||
id = "img_$timestamp",
|
id = attachmentId,
|
||||||
blob = "", // Пока пустой, обновим после конвертации
|
blob = "", // Пока пустой, обновим после конвертации
|
||||||
type = AttachmentType.IMAGE,
|
type = AttachmentType.IMAGE,
|
||||||
preview = "", // Пока пустой, обновим после генерации
|
preview = "", // Пока пустой, обновим после генерации
|
||||||
@@ -1511,7 +1513,40 @@ val newList = messages + optimisticMessages
|
|||||||
addMessageSafely(optimisticMessage)
|
addMessageSafely(optimisticMessage)
|
||||||
_inputText.value = ""
|
_inputText.value = ""
|
||||||
|
|
||||||
// 2. 🔄 В ФОНЕ: конвертируем, генерируем blurhash и отправляем
|
// 2. 💾 СРАЗУ сохраняем в БД со статусом SENDING (delivered = 0)
|
||||||
|
// Чтобы при выходе из диалога сообщение не пропадало
|
||||||
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
|
try {
|
||||||
|
// Сохраняем с localUri в attachments для восстановления при возврате в чат
|
||||||
|
val attachmentsJson = JSONArray().apply {
|
||||||
|
put(JSONObject().apply {
|
||||||
|
put("id", attachmentId)
|
||||||
|
put("type", AttachmentType.IMAGE.value)
|
||||||
|
put("preview", "")
|
||||||
|
put("blob", "")
|
||||||
|
put("width", 0)
|
||||||
|
put("height", 0)
|
||||||
|
put("localUri", imageUri.toString()) // 🔥 Сохраняем localUri
|
||||||
|
})
|
||||||
|
}.toString()
|
||||||
|
|
||||||
|
// Сохраняем optimistic сообщение в БД
|
||||||
|
saveMessageToDatabase(
|
||||||
|
messageId = messageId,
|
||||||
|
text = text,
|
||||||
|
encryptedContent = "", // Пустой пока не зашифровали
|
||||||
|
encryptedKey = "",
|
||||||
|
timestamp = timestamp,
|
||||||
|
isFromMe = true,
|
||||||
|
delivered = 0, // SENDING
|
||||||
|
attachmentsJson = attachmentsJson
|
||||||
|
)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
// Игнорируем ошибку - главное что в UI показали
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 🔄 В ФОНЕ: конвертируем, генерируем blurhash и отправляем
|
||||||
viewModelScope.launch(Dispatchers.IO) {
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
try {
|
try {
|
||||||
// Получаем размеры изображения
|
// Получаем размеры изображения
|
||||||
@@ -1529,12 +1564,12 @@ val newList = messages + optimisticMessages
|
|||||||
// Генерируем blurhash
|
// Генерируем blurhash
|
||||||
val blurhash = com.rosetta.messenger.utils.MediaUtils.generateBlurhash(context, imageUri)
|
val blurhash = com.rosetta.messenger.utils.MediaUtils.generateBlurhash(context, imageUri)
|
||||||
|
|
||||||
// 3. 🔄 Обновляем optimistic сообщение с реальными данными
|
// 4. 🔄 Обновляем optimistic сообщение с реальными данными
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
updateOptimisticImageMessage(messageId, imageBase64, blurhash, width, height)
|
updateOptimisticImageMessage(messageId, imageBase64, blurhash, width, height)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. 📤 Отправляем (шифрование + загрузка на сервер)
|
// 5. 📤 Отправляем (шифрование + загрузка на сервер)
|
||||||
sendImageMessageInternal(
|
sendImageMessageInternal(
|
||||||
messageId = messageId,
|
messageId = messageId,
|
||||||
imageBase64 = imageBase64,
|
imageBase64 = imageBase64,
|
||||||
|
|||||||
Reference in New Issue
Block a user