feat(chat): DM 채팅 메시지 매퍼를 추가한다
This commit is contained in:
@@ -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()
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
Reference in New Issue
Block a user