feat: Add support for retrieving and displaying attachment types in chat messages
This commit is contained in:
@@ -359,6 +359,19 @@ interface MessageDao {
|
|||||||
ORDER BY timestamp DESC, id DESC LIMIT 1
|
ORDER BY timestamp DESC, id DESC LIMIT 1
|
||||||
""")
|
""")
|
||||||
suspend fun getLastMessageStatus(account: String, opponent: String): LastMessageStatus?
|
suspend fun getLastMessageStatus(account: String, opponent: String): LastMessageStatus?
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 📎 Получить attachments последнего сообщения для диалога
|
||||||
|
* Возвращает null если сообщений нет или нет attachments
|
||||||
|
*/
|
||||||
|
@Query("""
|
||||||
|
SELECT attachments FROM messages
|
||||||
|
WHERE account = :account
|
||||||
|
AND ((from_public_key = :opponent AND to_public_key = :account)
|
||||||
|
OR (from_public_key = :account AND to_public_key = :opponent))
|
||||||
|
ORDER BY timestamp DESC, id DESC LIMIT 1
|
||||||
|
""")
|
||||||
|
suspend fun getLastMessageAttachments(account: String, opponent: String): String?
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1895,10 +1895,18 @@ fun DialogItemContent(
|
|||||||
if (isTyping) {
|
if (isTyping) {
|
||||||
TypingIndicatorSmall()
|
TypingIndicatorSmall()
|
||||||
} else {
|
} else {
|
||||||
|
// <20> Определяем что показывать - attachment или текст
|
||||||
|
val displayText = when {
|
||||||
|
dialog.lastMessageAttachmentType == "Photo" -> "Photo"
|
||||||
|
dialog.lastMessageAttachmentType == "File" -> "File"
|
||||||
|
dialog.lastMessage.isEmpty() -> "No messages"
|
||||||
|
else -> dialog.lastMessage
|
||||||
|
}
|
||||||
|
|
||||||
// 🔥 Используем AppleEmojiText для отображения эмодзи
|
// 🔥 Используем AppleEmojiText для отображения эмодзи
|
||||||
// Если есть непрочитанные - текст темнее
|
// Если есть непрочитанные - текст темнее
|
||||||
AppleEmojiText(
|
AppleEmojiText(
|
||||||
text = dialog.lastMessage.ifEmpty { "No messages" },
|
text = displayText,
|
||||||
fontSize = 14.sp,
|
fontSize = 14.sp,
|
||||||
color =
|
color =
|
||||||
if (dialog.unreadCount > 0)
|
if (dialog.unreadCount > 0)
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ data class DialogUiModel(
|
|||||||
val isSavedMessages: Boolean = false, // 📁 Флаг для Saved Messages (account == opponentKey)
|
val isSavedMessages: Boolean = false, // 📁 Флаг для Saved Messages (account == opponentKey)
|
||||||
val lastMessageFromMe: Int = 0, // Последнее сообщение от меня (0/1)
|
val lastMessageFromMe: Int = 0, // Последнее сообщение от меня (0/1)
|
||||||
val lastMessageDelivered: Int = 0, // Статус доставки (0=WAITING, 1=DELIVERED, 2=ERROR)
|
val lastMessageDelivered: Int = 0, // Статус доставки (0=WAITING, 1=DELIVERED, 2=ERROR)
|
||||||
val lastMessageRead: Int = 0 // Прочитано (0/1)
|
val lastMessageRead: Int = 0, // Прочитано (0/1)
|
||||||
|
val lastMessageAttachmentType: String? = null // 📎 Тип attachment: "Photo", "File", или null
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -147,8 +148,28 @@ class ChatsListViewModel(application: Application) : AndroidViewModel(applicatio
|
|||||||
val actualDelivered = if (actualFromMe == 1) (lastMsgStatus?.delivered ?: 0) else 0
|
val actualDelivered = if (actualFromMe == 1) (lastMsgStatus?.delivered ?: 0) else 0
|
||||||
val actualRead = if (actualFromMe == 1) (lastMsgStatus?.read ?: 0) else 0
|
val actualRead = if (actualFromMe == 1) (lastMsgStatus?.read ?: 0) else 0
|
||||||
|
|
||||||
|
// <20> Определяем тип attachment последнего сообщения
|
||||||
|
val attachmentType = try {
|
||||||
|
val attachmentsJson = messageDao.getLastMessageAttachments(publicKey, dialog.opponentKey)
|
||||||
|
if (!attachmentsJson.isNullOrEmpty() && attachmentsJson != "[]") {
|
||||||
|
val attachments = org.json.JSONArray(attachmentsJson)
|
||||||
|
if (attachments.length() > 0) {
|
||||||
|
val firstAttachment = attachments.getJSONObject(0)
|
||||||
|
val type = firstAttachment.optInt("type", -1)
|
||||||
|
when (type) {
|
||||||
|
2 -> "Photo" // AttachmentType.IMAGE
|
||||||
|
3 -> "File" // AttachmentType.FILE
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
} else null
|
||||||
|
} else null
|
||||||
|
} catch (e: Exception) {
|
||||||
|
android.util.Log.e("ChatsListVM", "Failed to parse attachments", e)
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
// 🔥 Лог для отладки - показываем и старые и новые значения
|
// 🔥 Лог для отладки - показываем и старые и новые значения
|
||||||
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")
|
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 | attachment=$attachmentType")
|
||||||
|
|
||||||
DialogUiModel(
|
DialogUiModel(
|
||||||
id = dialog.id,
|
id = dialog.id,
|
||||||
@@ -165,7 +186,8 @@ class ChatsListViewModel(application: Application) : AndroidViewModel(applicatio
|
|||||||
isSavedMessages = isSavedMessages, // 📁 Saved Messages
|
isSavedMessages = isSavedMessages, // 📁 Saved Messages
|
||||||
lastMessageFromMe = actualFromMe, // 🔥 Используем актуальные данные из messages
|
lastMessageFromMe = actualFromMe, // 🔥 Используем актуальные данные из messages
|
||||||
lastMessageDelivered = actualDelivered, // 🔥 Используем актуальные данные из messages
|
lastMessageDelivered = actualDelivered, // 🔥 Используем актуальные данные из messages
|
||||||
lastMessageRead = actualRead // 🔥 Используем актуальные данные из messages
|
lastMessageRead = actualRead, // 🔥 Используем актуальные данные из messages
|
||||||
|
lastMessageAttachmentType = attachmentType // 📎 Тип attachment
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -209,6 +231,26 @@ class ChatsListViewModel(application: Application) : AndroidViewModel(applicatio
|
|||||||
dialog.lastMessage
|
dialog.lastMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 📎 Определяем тип attachment последнего сообщения
|
||||||
|
val attachmentType = try {
|
||||||
|
val attachmentsJson = messageDao.getLastMessageAttachments(publicKey, dialog.opponentKey)
|
||||||
|
if (!attachmentsJson.isNullOrEmpty() && attachmentsJson != "[]") {
|
||||||
|
val attachments = org.json.JSONArray(attachmentsJson)
|
||||||
|
if (attachments.length() > 0) {
|
||||||
|
val firstAttachment = attachments.getJSONObject(0)
|
||||||
|
val type = firstAttachment.optInt("type", -1)
|
||||||
|
when (type) {
|
||||||
|
2 -> "Photo" // AttachmentType.IMAGE
|
||||||
|
3 -> "File" // AttachmentType.FILE
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
} else null
|
||||||
|
} else null
|
||||||
|
} catch (e: Exception) {
|
||||||
|
android.util.Log.e("ChatsListVM", "Failed to parse attachments in request", e)
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
DialogUiModel(
|
DialogUiModel(
|
||||||
id = dialog.id,
|
id = dialog.id,
|
||||||
account = dialog.account,
|
account = dialog.account,
|
||||||
@@ -224,7 +266,8 @@ class ChatsListViewModel(application: Application) : AndroidViewModel(applicatio
|
|||||||
isSavedMessages = (dialog.account == dialog.opponentKey), // 📁 Saved Messages
|
isSavedMessages = (dialog.account == dialog.opponentKey), // 📁 Saved Messages
|
||||||
lastMessageFromMe = dialog.lastMessageFromMe,
|
lastMessageFromMe = dialog.lastMessageFromMe,
|
||||||
lastMessageDelivered = dialog.lastMessageDelivered,
|
lastMessageDelivered = dialog.lastMessageDelivered,
|
||||||
lastMessageRead = dialog.lastMessageRead
|
lastMessageRead = dialog.lastMessageRead,
|
||||||
|
lastMessageAttachmentType = attachmentType // 📎 Тип attachment
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user