From 1882139facd48919915376c7514ae42a48fd9348 Mon Sep 17 00:00:00 2001 From: klaus Date: Wed, 13 Aug 2025 23:46:45 +0900 Subject: [PATCH] =?UTF-8?q?feat(chat-room):=207.1=20=EB=A1=9C=EC=BB=AC=20?= =?UTF-8?q?=EC=9A=B0=EC=84=A0=20=ED=91=9C=EC=8B=9C=20=EB=B0=8F=20=EC=98=A4?= =?UTF-8?q?=ED=94=84=EB=9D=BC=EC=9D=B8=20=EB=8C=80=EC=B2=B4=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 진입 시 로컬 최근 20개 메시지 즉시 표시 - enterChatRoom 응답으로 최신 상태로 전체 갱신 - 네트워크 실패 시 로컬 UI 유지 및 토스트 노출 --- .../chat/talk/room/ChatRoomActivity.kt | 30 +++++++++++++++---- 1 file changed, 25 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 b03359d7..1d53ef75 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 @@ -366,11 +366,31 @@ class ChatRoomActivity : BaseActivity( // endregion 6.2 Send flow private fun loadInitialMessages() { - // 7.1 초기 데이터 로딩 구현: 통합 API 호출 + 로컬 동기화 결과를 UI에 반영 + // 7.1 보완: 로컬 우선 표시 + 서버 동기화 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()) .subscribe({ response -> // 캐릭터 정보 바인딩 @@ -406,10 +426,10 @@ class ChatRoomActivity : BaseActivity( ) }, { error -> isLoading = false + // 오프라인/실패 시: 로컬 데이터가 이미 표시되어 있으면 그대로 유지 showToast(error.message ?: "채팅방 데이터를 불러오지 못했습니다.") }) - - compositeDisposable.add(disposable) + compositeDisposable.add(networkDisposable) } // region 5.2 helper methods