From 3f87b358160c7cb4d693946958a0d089a293db9b Mon Sep 17 00:00:00 2001 From: klaus Date: Thu, 14 Aug 2025 21:27:17 +0900 Subject: [PATCH] =?UTF-8?q?refactor(chat-room):=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=95=20=EC=BB=A4=EC=84=9C=20fallback/=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EC=9D=84=20createdAt=E2=86=92messageId?= =?UTF-8?q?=EB=A1=9C=20=EC=A0=95=ED=95=A9=EC=84=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 왜: 서버 계약에 따라 cursor 의미가 단독 messageId로 확정됨. createdAt 기반 커서는 페이징 경계에서 중복/누락을 유발할 수 있음 - 무엇: ChatRoomActivity.loadMoreMessages()/loadInitialMessages()에서 cursor 계산 및 nextCursor 대체 저장을 messageId 기준으로 변경. Repository/API 타입은 그대로 유지 --- .../sodalive/chat/talk/room/ChatRoomActivity.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 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 19a725c6..8ed0ef70 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 @@ -423,7 +423,7 @@ class ChatRoomActivity : BaseActivity( // 페이지 상태 갱신 hasMoreMessages = response.hasMoreMessages - nextCursor = sorted.firstOrNull()?.createdAt + nextCursor = sorted.firstOrNull()?.messageId // 최신 메시지 위치로 scrollToBottom() @@ -491,15 +491,15 @@ class ChatRoomActivity : BaseActivity( isLoading = true val token = "Bearer ${SharedPreferenceManager.token}" - // 커서: API에서 내려준 nextCursor 우선, 없으면 현재 목록 중 가장 오래된 createdAt - val fallbackOldestCreatedAt: Long? = items.firstOrNull()?.let { + // 커서: API에서 내려준 nextCursor 우선, 없으면 현재 목록 중 가장 오래된 messageId + val fallbackOldestMessageId: Long? = items.firstOrNull()?.let { when (it) { - is ChatListItem.UserMessage -> it.data.createdAt - is ChatListItem.AiMessage -> it.data.createdAt + is ChatListItem.UserMessage -> it.data.messageId + is ChatListItem.AiMessage -> it.data.messageId else -> null } } - val cursor: Long? = nextCursor ?: fallbackOldestCreatedAt + val cursor: Long? = nextCursor ?: fallbackOldestMessageId val disposable = chatRepository.loadMoreMessages(token = token, roomId = roomId, cursor = cursor) @@ -532,8 +532,8 @@ class ChatRoomActivity : BaseActivity( hasMoreMessages = response.hasMore nextCursor = response.nextCursor ?: newChatItems.firstOrNull()?.let { when (it) { - is ChatListItem.UserMessage -> it.data.createdAt - is ChatListItem.AiMessage -> it.data.createdAt + is ChatListItem.UserMessage -> it.data.messageId + is ChatListItem.AiMessage -> it.data.messageId else -> null } }