feat(chat): DM 채팅 메시지 매퍼를 추가한다

This commit is contained in:
2026-06-10 17:39:52 +09:00
parent e1ae7df0ee
commit 630f84c3e5
3 changed files with 153 additions and 0 deletions

View File

@@ -0,0 +1,38 @@
package kr.co.vividnext.sodalive.v2.main.chat.dm.model
import kr.co.vividnext.sodalive.v2.main.chat.dm.data.DmChatMessageResponse
private const val MESSAGE_TYPE_TEXT = "TEXT"
fun DmChatMessageResponse.toUiItem(): DmChatMessageUiItem? {
if (!messageType.equals(MESSAGE_TYPE_TEXT, ignoreCase = true) || textMessage == null) return null
return DmChatMessageUiItem(
messageId = messageId,
localId = null,
mine = mine,
textMessage = textMessage,
senderNickname = senderNickname,
senderProfileImageUrl = senderProfileImageUrl,
createdAt = createdAt,
status = DmChatMessageStatus.SENT
)
}
fun List<DmChatMessageResponse>.toUiItems(): List<DmChatMessageUiItem> = mapNotNull { it.toUiItem() }
/** Sorts messages by server creation time, then by messageId for same-time messages. */
fun List<DmChatMessageUiItem>.sortByCreatedAtAndMessageId(): List<DmChatMessageUiItem> =
sortedWith(compareBy<DmChatMessageUiItem> { it.createdAt }.thenBy { it.messageId ?: Long.MAX_VALUE })
/** Merges new messages while keeping the first-arrived item when server messageId duplicates. */
fun List<DmChatMessageUiItem>.mergeByMessageId(
incoming: List<DmChatMessageUiItem>
): List<DmChatMessageUiItem> {
val seenMessageIds = mapNotNull { it.messageId }.toMutableSet()
val newItems = incoming.filter { item ->
val messageId = item.messageId
messageId == null || seenMessageIds.add(messageId)
}
return (this + newItems).sortByCreatedAtAndMessageId()
}

View File

@@ -0,0 +1,18 @@
package kr.co.vividnext.sodalive.v2.main.chat.dm.model
enum class DmChatMessageStatus {
SENDING,
SENT,
FAILED
}
data class DmChatMessageUiItem(
val messageId: Long?,
val localId: String?,
val mine: Boolean,
val textMessage: String,
val senderNickname: String,
val senderProfileImageUrl: String,
val createdAt: Long,
val status: DmChatMessageStatus
)