From cd4a098bff33fb504aaddd80f3b8788d14ec38d7 Mon Sep 17 00:00:00 2001 From: klaus Date: Fri, 15 Aug 2025 00:45:22 +0900 Subject: [PATCH] =?UTF-8?q?fix(chat):=20=EB=8F=99=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=EB=8C=80=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=A0=95=EB=A0=AC?= =?UTF-8?q?=EC=9D=84=20messageId=20=EC=98=A4=EB=A6=84=EC=B0=A8=EC=88=9C?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=95=88=EC=A0=95=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit createdAt만 사용하던 정렬 로직을 다중 키로 변경하여 동일 시간에 messageId 오름차순이 보장되도록 수정. - 로컬 초기 로드: createdAt -> messageId -> localId asc - 서버 초기/증분 로드: createdAt -> messageId asc --- .../sodalive/chat/talk/room/ChatRoomActivity.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatRoomActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatRoomActivity.kt index 215b19cf..1ecca2bc 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatRoomActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatRoomActivity.kt @@ -429,7 +429,7 @@ class ChatRoomActivity : BaseActivity( .subscribe({ localList -> if (localList.isNotEmpty() && items.isEmpty()) { val localItems = localList - .sortedBy { it.createdAt } + .sortedWith(compareBy { it.createdAt }.thenBy { it.messageId }.thenBy { it.localId ?: "" }) .map { msg -> if (msg.mine) ChatListItem.UserMessage(msg) else ChatListItem.AiMessage(msg, characterInfo?.name) @@ -450,8 +450,8 @@ class ChatRoomActivity : BaseActivity( // 캐릭터 정보 바인딩 setCharacterInfo(response.character) - // 메시지 정렬(오래된 -> 최신) 후 도메인/UI 모델로 변환 - val sorted = response.messages.sortedBy { it.createdAt } + // 메시지 정렬(오래된 -> 최신) + 동시간대는 messageId 오름차순으로 안정화 + val sorted = response.messages.sortedWith(compareBy { it.createdAt }.thenBy { it.messageId }) val chatItems = sorted.map { serverMsg -> val domain = serverMsg.toDomain() if (domain.mine) { @@ -549,8 +549,8 @@ class ChatRoomActivity : BaseActivity( chatRepository.loadMoreMessages(token = token, roomId = roomId, cursor = cursor) .observeOn(io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.mainThread()) .subscribe({ response -> - // 서버에서 받은 메시지(이전 것들)를 오래된 -> 최신 순으로 정렬 - val sorted = response.messages.sortedBy { it.createdAt } + // 서버에서 받은 메시지(이전 것들)를 오래된 -> 최신 + 동시간대는 messageId 오름차순으로 정렬 + val sorted = response.messages.sortedWith(compareBy { it.createdAt }.thenBy { it.messageId }) // 중복 제거: 기존 목록의 messageId 집합과 비교 val existingIds: Set = items.mapNotNull {