fix: keep chat list ordering stable on realtime updates
Some checks failed
Android CI / android (push) Failing after 4m4s
CI / test (push) Has been cancelled
Android Release / release (push) Has been cancelled

- preserve chat sort timestamps when realtime payloads omit timestamps

- use safe fallback timestamps for local chat list updates
This commit is contained in:
2026-04-06 01:04:56 +03:00
parent ee5ff0fa41
commit fbe4bda9ef
2 changed files with 10 additions and 8 deletions

View File

@@ -119,8 +119,8 @@ interface ChatDao {
UPDATE chats
SET last_message_text = :lastMessageText,
last_message_type = :lastMessageType,
last_message_created_at = :lastMessageCreatedAt,
updated_sort_at = :updatedSortAt
last_message_created_at = COALESCE(:lastMessageCreatedAt, last_message_created_at),
updated_sort_at = COALESCE(:updatedSortAt, updated_sort_at, last_message_created_at)
WHERE id = :chatId
"""
)

View File

@@ -49,6 +49,7 @@ class HandleRealtimeEventsUseCase @Inject constructor(
val activeChatId = activeChatTracker.activeChatId.value
val activeUserId = tokenRepository.getActiveUserId()
val isOwnMessage = activeUserId != null && event.senderId == activeUserId
val eventTimestamp = event.createdAt ?: java.time.Instant.now().toString()
val myUsername = activeUserId?.let { userId ->
tokenRepository.getAccounts()
.firstOrNull { it.userId == userId }
@@ -84,7 +85,7 @@ class HandleRealtimeEventsUseCase @Inject constructor(
text = event.text,
status = null,
attachmentWaveformJson = null,
createdAt = event.createdAt ?: java.time.Instant.now().toString(),
createdAt = eventTimestamp,
updatedAt = null,
)
)
@@ -93,8 +94,8 @@ class HandleRealtimeEventsUseCase @Inject constructor(
chatId = event.chatId,
lastMessageText = lastMessagePreview,
lastMessageType = event.type,
lastMessageCreatedAt = event.createdAt,
updatedSortAt = event.createdAt,
lastMessageCreatedAt = eventTimestamp,
updatedSortAt = eventTimestamp,
)
if (activeChatId == event.chatId) {
chatDao.markChatRead(chatId = event.chatId)
@@ -111,17 +112,18 @@ class HandleRealtimeEventsUseCase @Inject constructor(
}
is RealtimeEvent.MessageUpdated -> {
val updateTimestamp = event.updatedAt ?: java.time.Instant.now().toString()
messageDao.updateMessageText(
messageId = event.messageId,
text = event.text,
updatedAt = event.updatedAt,
updatedAt = updateTimestamp,
)
chatDao.updateLastMessage(
chatId = event.chatId,
lastMessageText = event.text?.takeIf { it.isNotBlank() } ?: fallbackMessagePreview(event.type),
lastMessageType = event.type,
lastMessageCreatedAt = event.updatedAt,
updatedSortAt = event.updatedAt,
lastMessageCreatedAt = updateTimestamp,
updatedSortAt = updateTimestamp,
)
if (activeChatTracker.activeChatId.value == event.chatId) {
messageRepository.syncRecentMessages(chatId = event.chatId)