feat: Enhance logging in scrollToMessage function for better debugging of message IDs and lengths
This commit is contained in:
@@ -198,6 +198,27 @@ interface MessageDao {
|
|||||||
@Query("DELETE FROM messages WHERE account = :account AND message_id = :messageId")
|
@Query("DELETE FROM messages WHERE account = :account AND message_id = :messageId")
|
||||||
suspend fun deleteMessage(account: String, messageId: String)
|
suspend fun deleteMessage(account: String, messageId: String)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Найти сообщение по публичному ключу отправителя и timestamp (для reply)
|
||||||
|
* Ищет с допуском по времени для учета возможных рассинхронизаций
|
||||||
|
*/
|
||||||
|
@Query("""
|
||||||
|
SELECT * FROM messages
|
||||||
|
WHERE account = :account
|
||||||
|
AND dialog_key = :dialogKey
|
||||||
|
AND from_public_key = :fromPublicKey
|
||||||
|
AND timestamp BETWEEN :timestampFrom AND :timestampTo
|
||||||
|
ORDER BY timestamp ASC
|
||||||
|
LIMIT 1
|
||||||
|
""")
|
||||||
|
suspend fun findMessageByContent(
|
||||||
|
account: String,
|
||||||
|
dialogKey: String,
|
||||||
|
fromPublicKey: String,
|
||||||
|
timestampFrom: Long,
|
||||||
|
timestampTo: Long
|
||||||
|
): MessageEntity?
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Получить количество непрочитанных сообщений для диалога
|
* Получить количество непрочитанных сообщений для диалога
|
||||||
* Считает только входящие сообщения (from_me = 0) которые не прочитаны (read = 0)
|
* Считает только входящие сообщения (from_me = 0) которые не прочитаны (read = 0)
|
||||||
|
|||||||
@@ -445,8 +445,15 @@ fun ChatDetailScreen(
|
|||||||
|
|
||||||
// 🔥 Функция для скролла к сообщению с подсветкой
|
// 🔥 Функция для скролла к сообщению с подсветкой
|
||||||
val scrollToMessage: (String) -> Unit = { messageId ->
|
val scrollToMessage: (String) -> Unit = { messageId ->
|
||||||
android.util.Log.d("ChatDetail", "🔍 scrollToMessage called for: $messageId")
|
android.util.Log.d("ChatDetail", "🔍 scrollToMessage called for: '$messageId'")
|
||||||
|
android.util.Log.d("ChatDetail", " - messageId length: ${messageId.length}")
|
||||||
android.util.Log.d("ChatDetail", " - Total messages: ${messagesWithDates.size}")
|
android.util.Log.d("ChatDetail", " - Total messages: ${messagesWithDates.size}")
|
||||||
|
|
||||||
|
// Логируем все ID сообщений для отладки
|
||||||
|
messagesWithDates.forEachIndexed { index, pair ->
|
||||||
|
android.util.Log.d("ChatDetail", " - [$index] id='${pair.first.id}', text='${pair.first.text.take(20)}...'")
|
||||||
|
}
|
||||||
|
|
||||||
scope.launch {
|
scope.launch {
|
||||||
// 🔥 Сбрасываем текущую подсветку перед новым скроллом
|
// 🔥 Сбрасываем текущую подсветку перед новым скроллом
|
||||||
highlightedMessageId = null
|
highlightedMessageId = null
|
||||||
|
|||||||
@@ -884,24 +884,45 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
|
|||||||
val replyMessage = messagesArray.getJSONObject(0)
|
val replyMessage = messagesArray.getJSONObject(0)
|
||||||
val replyPublicKey = replyMessage.optString("publicKey", "")
|
val replyPublicKey = replyMessage.optString("publicKey", "")
|
||||||
val replyText = replyMessage.optString("message", "")
|
val replyText = replyMessage.optString("message", "")
|
||||||
val replyMessageId = replyMessage.optString("message_id", "")
|
val replyMessageIdFromJson = replyMessage.optString("message_id", "")
|
||||||
|
val replyTimestamp = replyMessage.optLong("timestamp", 0L)
|
||||||
|
|
||||||
android.util.Log.d("ReplyDebug", " - replyMessageId: $replyMessageId")
|
android.util.Log.d("ReplyDebug", " - replyMessageId from JSON: $replyMessageIdFromJson")
|
||||||
android.util.Log.d("ReplyDebug", " - replyPublicKey: ${replyPublicKey.take(20)}...")
|
android.util.Log.d("ReplyDebug", " - replyPublicKey: ${replyPublicKey.take(20)}...")
|
||||||
android.util.Log.d("ReplyDebug", " - replyText: ${replyText.take(50)}")
|
android.util.Log.d("ReplyDebug", " - replyText: ${replyText.take(50)}")
|
||||||
android.util.Log.d("ReplyDebug", " - myPublicKey: ${myPublicKey?.take(20)}...")
|
android.util.Log.d("ReplyDebug", " - replyTimestamp: $replyTimestamp")
|
||||||
|
|
||||||
|
// 🔥 ВАЖНО: message_id из JSON может не совпадать с messageId в Android БД!
|
||||||
|
// Пытаемся найти реальный messageId в текущих сообщениях по тексту и timestamp
|
||||||
|
val account = myPublicKey ?: return null
|
||||||
|
val dialogKey = getDialogKey(account, opponentKey ?: "")
|
||||||
|
val realMessageId = try {
|
||||||
|
// Ищем сообщение в БД по публичному ключу, тексту и timestamp (с допуском ±5 секунд)
|
||||||
|
messageDao.findMessageByContent(
|
||||||
|
account = account,
|
||||||
|
dialogKey = dialogKey,
|
||||||
|
fromPublicKey = replyPublicKey,
|
||||||
|
timestampFrom = replyTimestamp - 5000,
|
||||||
|
timestampTo = replyTimestamp + 5000
|
||||||
|
)?.messageId ?: replyMessageIdFromJson
|
||||||
|
} catch (e: Exception) {
|
||||||
|
android.util.Log.w("ReplyDebug", " - ⚠️ Could not find real messageId, using JSON id")
|
||||||
|
replyMessageIdFromJson
|
||||||
|
}
|
||||||
|
|
||||||
|
android.util.Log.d("ReplyDebug", " - Real messageId: $realMessageId")
|
||||||
|
|
||||||
// Определяем, кто автор цитируемого сообщения
|
// Определяем, кто автор цитируемого сообщения
|
||||||
val isReplyFromMe = replyPublicKey == myPublicKey
|
val isReplyFromMe = replyPublicKey == myPublicKey
|
||||||
android.util.Log.d("ReplyDebug", " - isReplyFromMe: $isReplyFromMe")
|
android.util.Log.d("ReplyDebug", " - isReplyFromMe: $isReplyFromMe")
|
||||||
|
|
||||||
val result = ReplyData(
|
val result = ReplyData(
|
||||||
messageId = replyMessageId,
|
messageId = realMessageId,
|
||||||
senderName = if (isReplyFromMe) "You" else opponentTitle.ifEmpty { opponentUsername.ifEmpty { "User" } },
|
senderName = if (isReplyFromMe) "You" else opponentTitle.ifEmpty { opponentUsername.ifEmpty { "User" } },
|
||||||
text = replyText,
|
text = replyText,
|
||||||
isFromMe = isReplyFromMe
|
isFromMe = isReplyFromMe
|
||||||
)
|
)
|
||||||
android.util.Log.d("ReplyDebug", " - ✅ Created ReplyData: senderName=${result.senderName}, text=${result.text.take(30)}")
|
android.util.Log.d("ReplyDebug", " - ✅ Created ReplyData: senderName=${result.senderName}, messageId=${result.messageId}")
|
||||||
android.util.Log.d("ReplyDebug", "✅ [DB LOAD] Reply data parsed successfully from DB - RETURNING")
|
android.util.Log.d("ReplyDebug", "✅ [DB LOAD] Reply data parsed successfully from DB - RETURNING")
|
||||||
return result
|
return result
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user