fix: keep chat list ordering stable on realtime updates
- preserve chat sort timestamps when realtime payloads omit timestamps - use safe fallback timestamps for local chat list updates
This commit is contained in:
@@ -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
|
||||
"""
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user