From 0c111aaf4767b0d1bcd09119f1c79d43514b595b Mon Sep 17 00:00:00 2001 From: klaus Date: Sat, 11 Jul 2026 22:01:56 +0900 Subject: [PATCH] =?UTF-8?q?docs(chat):=20empty=20state=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=EB=A5=BC=20=EA=B8=B0=EB=A1=9D=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/20260609_채팅_탭_페이지/plan-task.md | 21 +++++++++++++++++++++ docs/20260609_채팅_탭_페이지/prd.md | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/docs/20260609_채팅_탭_페이지/plan-task.md b/docs/20260609_채팅_탭_페이지/plan-task.md index a3cf1fa2..3210cfab 100644 --- a/docs/20260609_채팅_탭_페이지/plan-task.md +++ b/docs/20260609_채팅_탭_페이지/plan-task.md @@ -485,6 +485,26 @@ - 실패가 있었다면 실패 원인과 후속 조치 - 검증: 기존 Verification Log를 삭제하거나 덮어쓰지 않고 하단에 새 항목으로 누적한다. +### Phase 11: 채팅 탭 empty state 문구 표시 +- [x] **Task 11.1: 탭별 empty state 문구 요구사항 반영** + - Files: + - Modify: `docs/20260609_채팅_탭_페이지/prd.md` + - Modify: `app/src/main/res/layout/fragment_v2_main_chat.xml` + - Modify: `app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragment.kt` + - Modify: `app/src/main/res/values/strings.xml` + - Modify: `app/src/main/res/values-en/strings.xml` + - Modify: `app/src/main/res/values-ja/strings.xml` + - Modify: `app/src/test/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragmentLayoutTest.kt` + - 작업: + - `ChatRoomListUiState.Empty` 수신 시 검은 빈 화면 대신 현재 선택된 탭에 맞는 empty 문구를 표시한다. + - Content/Loading/Error 상태에서는 empty 문구를 숨기고 기존 목록/오류 처리 정책을 유지한다. + - 검증: + - Run: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragmentLayoutTest" --max-workers=1` + - Expected: empty placeholder layout과 탭별 문구 source 계약 검증이 PASS. + - 검증 기록: + - 2026-07-11: `ChatMainFragmentLayoutTest`에 empty placeholder layout과 탭별 문구 source 계약 검증을 추가하고, `ChatMainFragment`에서 `ChatRoomListUiState.Empty` 수신 시 현재 filter별 empty 문구를 표시하도록 보정했다. 회귀 검증으로 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.main.chat.dm.DmChatRoomViewModelTest" --max-workers=1`, `./gradlew :app:compileDebugKotlin --max-workers=1`, `./gradlew :app:ktlintCheck --max-workers=1`, `git diff --check` PASS를 확인했다. `ktlintCheck`에서는 기존 `.editorconfig`의 `disabled_rules` deprecation warning이 출력됐지만 실패는 없었다. + + --- ## 구현 제외 체크리스트 @@ -536,5 +556,6 @@ - 2026-06-10: 사용자 피드백에 따라 통합 검증 Phase가 마지막에 오도록 Plan-Task 순서를 정리했다. 기존 Phase 9(탭 전환/첫 페이지 로딩 시 스크롤 최상단 이동 처리)를 Phase 8로, 기존 Phase 10(채팅 타이틀바 우측 액션 메뉴 이미지 간격 조정)을 Phase 9로 한 단계씩 당기고, 기존 Phase 8(통합 검증과 문서 기록)을 마지막 Phase 10으로 이동했다. 문서 순서 정정만 수행했으며 빌드/테스트는 실행하지 않았다. - 2026-06-10: Phase 10 통합 검증을 완료했다. `./gradlew :app:mergeDebugResources`는 `BUILD SUCCESSFUL in 1s`, `./gradlew :app:compileDebugKotlin`은 `BUILD SUCCESSFUL in 1s`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.*"`는 `BUILD SUCCESSFUL in 9s`, `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.widget.*CapsuleTab*"`는 `BUILD SUCCESSFUL in 5s`, `./gradlew :app:ktlintCheck`는 `BUILD SUCCESSFUL in 3s`로 통과했다. ktlint의 `.editorconfig disabled_rules` deprecation warning과 Gradle deprecation warning은 기존 경고로 남아 있다. - 2026-06-10: 구현 제외 체크리스트를 확인했다. `ChatMainFragment.kt`는 `chatType=AI`가 아닌 item 클릭 시 즉시 return하고 floating button은 빈 listener만 유지한다. `fragment_v2_main_chat.xml`에는 `BottomNavigationView`가 없고, `item_v2_chat_room.xml`에는 unread dot view/binding이 없다. `rg`와 직접 파일 확인으로 WebSocket/SSE, pull-to-refresh, skeleton/shimmer 추가가 없고 `ChatRoomModels.kt`의 API schema 필드명도 `roomId`, `chatType`, `targetName`, `targetImageUrl`, `lastMessage`, `lastMessageAt`, `rooms`, `hasMore`, `nextCursor` 계약을 유지함을 확인했다. +- 2026-07-11: Phase 11 empty state 보정 완료. 전체/AI 채팅/DM 탭별 empty 문구를 `values`, `values-en`, `values-ja`에 추가하고 `fragment_v2_main_chat.xml`의 empty `TextView`, `ChatRoomFilter.emptyMessageResId()`, `ChatMainFragment.bindChatRooms(items, showEmpty)`로 빈 목록 표시를 연결했다. `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragmentLayoutTest" --tests "kr.co.vividnext.sodalive.v2.main.chat.dm.DmChatRoomViewModelTest" --max-workers=1`, `./gradlew :app:compileDebugKotlin --max-workers=1`, `./gradlew :app:ktlintCheck --max-workers=1`, `git diff --check` PASS를 확인했다. `ktlintCheck`에서는 기존 `.editorconfig`의 `disabled_rules` deprecation warning이 출력됐지만 실패는 없었다. --- diff --git a/docs/20260609_채팅_탭_페이지/prd.md b/docs/20260609_채팅_탭_페이지/prd.md index eb7efea0..9b607e39 100644 --- a/docs/20260609_채팅_탭_페이지/prd.md +++ b/docs/20260609_채팅_탭_페이지/prd.md @@ -80,7 +80,7 @@ #### Edge Cases - API 요청 `filter`는 `ALL`, `AI`, `DM` 중 하나만 사용한다. - `chatType`은 `AI`, `DM` 문자열만 사용한다. -- 탭 전환 후 표시할 item이 없으면 목록을 비운다. 별도 empty placeholder는 추가하지 않는다. +- 탭 전환 후 표시할 item이 없으면 탭별 empty placeholder를 표시한다. 전체 탭은 `아직 나눈 대화가 없어요.\n크리에이터와 이야기를 시작해 보세요.`, AI 채팅 탭은 `아직 나눈 대화가 없어요.\nAI 크리에이터와 대화를 시작해 보세요.`, DM 탭은 `아직 나눈 대화가 없어요.\n좋아하는 크리에이터에게 메세지를 보내보세요.`를 표시한다. - 탭 전환 시점 또는 첫 번째 페이지 로드 시(isAppending = false인 상태) 목록의 스크롤을 최상단으로 이동시킨다. ### Chat Room List