refactor(chat-room): 페이징 커서 fallback/저장 로직을 createdAt→messageId로 정합성 수정

- 왜: 서버 계약에 따라 cursor 의미가 단독 messageId로 확정됨. createdAt 기반 커서는 페이징 경계에서 중복/누락을 유발할 수 있음
- 무엇: ChatRoomActivity.loadMoreMessages()/loadInitialMessages()에서 cursor 계산 및 nextCursor 대체 저장을 messageId 기준으로 변경. Repository/API 타입은 그대로 유지
This commit is contained in:
2025-08-14 21:27:17 +09:00
parent bd86d1610a
commit 3f87b35816

View File

@@ -423,7 +423,7 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
// 페이지 상태 갱신 // 페이지 상태 갱신
hasMoreMessages = response.hasMoreMessages hasMoreMessages = response.hasMoreMessages
nextCursor = sorted.firstOrNull()?.createdAt nextCursor = sorted.firstOrNull()?.messageId
// 최신 메시지 위치로 // 최신 메시지 위치로
scrollToBottom() scrollToBottom()
@@ -491,15 +491,15 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
isLoading = true isLoading = true
val token = "Bearer ${SharedPreferenceManager.token}" val token = "Bearer ${SharedPreferenceManager.token}"
// 커서: API에서 내려준 nextCursor 우선, 없으면 현재 목록 중 가장 오래된 createdAt // 커서: API에서 내려준 nextCursor 우선, 없으면 현재 목록 중 가장 오래된 messageId
val fallbackOldestCreatedAt: Long? = items.firstOrNull()?.let { val fallbackOldestMessageId: Long? = items.firstOrNull()?.let {
when (it) { when (it) {
is ChatListItem.UserMessage -> it.data.createdAt is ChatListItem.UserMessage -> it.data.messageId
is ChatListItem.AiMessage -> it.data.createdAt is ChatListItem.AiMessage -> it.data.messageId
else -> null else -> null
} }
} }
val cursor: Long? = nextCursor ?: fallbackOldestCreatedAt val cursor: Long? = nextCursor ?: fallbackOldestMessageId
val disposable = val disposable =
chatRepository.loadMoreMessages(token = token, roomId = roomId, cursor = cursor) chatRepository.loadMoreMessages(token = token, roomId = roomId, cursor = cursor)
@@ -532,8 +532,8 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
hasMoreMessages = response.hasMore hasMoreMessages = response.hasMore
nextCursor = response.nextCursor ?: newChatItems.firstOrNull()?.let { nextCursor = response.nextCursor ?: newChatItems.firstOrNull()?.let {
when (it) { when (it) {
is ChatListItem.UserMessage -> it.data.createdAt is ChatListItem.UserMessage -> it.data.messageId
is ChatListItem.AiMessage -> it.data.createdAt is ChatListItem.AiMessage -> it.data.messageId
else -> null else -> null
} }
} }