feat(chat-room): 7.1 로컬 우선 표시 및 오프라인 대체 처리 추가
- 진입 시 로컬 최근 20개 메시지 즉시 표시 - enterChatRoom 응답으로 최신 상태로 전체 갱신 - 네트워크 실패 시 로컬 UI 유지 및 토스트 노출
This commit is contained in:
@@ -366,11 +366,31 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
|
|||||||
// endregion 6.2 Send flow
|
// endregion 6.2 Send flow
|
||||||
|
|
||||||
private fun loadInitialMessages() {
|
private fun loadInitialMessages() {
|
||||||
// 7.1 초기 데이터 로딩 구현: 통합 API 호출 + 로컬 동기화 결과를 UI에 반영
|
// 7.1 보완: 로컬 우선 표시 + 서버 동기화
|
||||||
isLoading = true
|
isLoading = true
|
||||||
val token = "Bearer ${kr.co.vividnext.sodalive.common.SharedPreferenceManager.token}"
|
|
||||||
|
|
||||||
val disposable = chatRepository.enterChatRoom(token = token, roomId = roomId)
|
// 1) 로컬 최근 20개 즉시 표시 (있을 경우)
|
||||||
|
val localDisposable = chatRepository.getRecentMessagesFromLocal(roomId)
|
||||||
|
.observeOn(io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.mainThread())
|
||||||
|
.subscribe({ localList ->
|
||||||
|
if (localList.isNotEmpty() && items.isEmpty()) {
|
||||||
|
val localItems = localList
|
||||||
|
.sortedBy { it.createdAt }
|
||||||
|
.map { msg ->
|
||||||
|
if (msg.mine) ChatListItem.UserMessage(msg)
|
||||||
|
else ChatListItem.AiMessage(msg, characterInfo?.name)
|
||||||
|
}
|
||||||
|
items.clear()
|
||||||
|
items.addAll(localItems)
|
||||||
|
chatAdapter.setItems(items)
|
||||||
|
scrollToBottom()
|
||||||
|
}
|
||||||
|
}, { /* 로컬 로드 실패는 무시하고 서버 로딩 진행 */ })
|
||||||
|
compositeDisposable.add(localDisposable)
|
||||||
|
|
||||||
|
// 2) 서버 통합 API로 동기화 및 UI 갱신
|
||||||
|
val token = "Bearer ${kr.co.vividnext.sodalive.common.SharedPreferenceManager.token}"
|
||||||
|
val networkDisposable = chatRepository.enterChatRoom(token = token, roomId = roomId)
|
||||||
.observeOn(io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.mainThread())
|
.observeOn(io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.mainThread())
|
||||||
.subscribe({ response ->
|
.subscribe({ response ->
|
||||||
// 캐릭터 정보 바인딩
|
// 캐릭터 정보 바인딩
|
||||||
@@ -406,10 +426,10 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
|
|||||||
)
|
)
|
||||||
}, { error ->
|
}, { error ->
|
||||||
isLoading = false
|
isLoading = false
|
||||||
|
// 오프라인/실패 시: 로컬 데이터가 이미 표시되어 있으면 그대로 유지
|
||||||
showToast(error.message ?: "채팅방 데이터를 불러오지 못했습니다.")
|
showToast(error.message ?: "채팅방 데이터를 불러오지 못했습니다.")
|
||||||
})
|
})
|
||||||
|
compositeDisposable.add(networkDisposable)
|
||||||
compositeDisposable.add(disposable)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// region 5.2 helper methods
|
// region 5.2 helper methods
|
||||||
|
|||||||
Reference in New Issue
Block a user