refactor(chat-room): 페이징 커서 fallback/저장 로직을 createdAt→messageId로 정합성 수정
- 왜: 서버 계약에 따라 cursor 의미가 단독 messageId로 확정됨. createdAt 기반 커서는 페이징 경계에서 중복/누락을 유발할 수 있음 - 무엇: ChatRoomActivity.loadMoreMessages()/loadInitialMessages()에서 cursor 계산 및 nextCursor 대체 저장을 messageId 기준으로 변경. Repository/API 타입은 그대로 유지
This commit is contained in:
		@@ -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
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user