diff --git a/docs/20260611_크리에이터_채널_홈_탭/plan-task.md b/docs/20260611_크리에이터_채널_홈_탭/plan-task.md index 1ad50bcc..7ba83337 100644 --- a/docs/20260611_크리에이터_채널_홈_탭/plan-task.md +++ b/docs/20260611_크리에이터_채널_홈_탭/plan-task.md @@ -1103,7 +1103,7 @@ > 2026-06-16 PRD 보강분을 반영하는 Phase다. title-bar sticky 닉네임, tab-bar typography, 더보기 BottomSheet, 팔로우/알림 직접 액션, 본인 페이지 상단 액션 정책을 한 묶음으로 처리한다. -- [ ] **Task 11.1: title-bar sticky 닉네임과 tab-bar typography 보정** +- [x] **Task 11.1: title-bar sticky 닉네임과 tab-bar typography 보정** - 수정: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` - `app/src/main/res/layout/activity_creator_channel.xml` @@ -1121,8 +1121,10 @@ - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` - `./gradlew :app:mergeDebugResources` - `./gradlew :app:compileDebugKotlin` + - 검증 기록: + - 2026-06-16: sticky black title-bar 닉네임과 `CreatorChannelTabText` tab textAppearance 계약을 `CreatorChannelActivitySourceTest`에 추가하고 구현했다. `CreatorChannelActivitySourceTest`, `mergeDebugResources`, `compileDebugKotlin` PASS. -- [ ] **Task 11.2: 더보기 BottomSheet와 팔로우/알림 직접 액션 보정** +- [x] **Task 11.2: 더보기 BottomSheet와 팔로우/알림 직접 액션 보정** - 수정: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelHomeViewModel.kt` @@ -1143,8 +1145,14 @@ - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest"` - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` - `./gradlew :app:compileDebugKotlin` + - 검증 기록: + - 2026-06-16: 더보기 BottomSheet, 차단/사용자 신고/프로필 신고 연결, 팔로우/알림 직접 액션을 구현했다. `CreatorChannelHomeViewModelTest`, `CreatorChannelActivitySourceTest`, `compileDebugKotlin` PASS. + - 2026-06-16: 리뷰에서 `isBlock=true` 상태의 `사용자 차단해제` 메뉴가 실제로는 차단 API를 호출하는 문제가 발견되어, BottomSheet callback을 block/unblock으로 분리하고 `UserRepository.memberUnBlock()` 위임 및 성공 시 `header.isBlock=false` 상태 갱신을 추가했다. + - 2026-06-16: 후속 API 계약 확인 결과 크리에이터 채널 홈에서는 차단된 사용자가 서버 예외 처리로 진입하지 못하므로 `CreatorChannelCreatorResponse.isBlock`, `CreatorChannelHeaderUiModel.isBlock`, BottomSheet 차단해제 분기, `unblockUser()` 경로를 제거했다. 더보기 BottomSheet는 진입 가능한 채널에서 차단/사용자 신고/프로필 신고만 표시한다. + - 2026-06-16: 팔로잉 알림 꺼짐 상태에서 종 아이콘을 다시 누르면 `follow=true`, `notify=!header.isNotify` 조합으로 알림 설정 API가 호출되도록 수정했다. 팔로우 취소 성공 시 `creator_channel_unfollow_success` 다국어 토스트를 표시한다. + - 2026-06-16: 로딩 중 `대화하기`, `DM 보내기`, 팔로우, 더보기 버튼이 먼저 보여 혼란스럽다는 피드백을 반영해 각 버튼의 XML 기본 visibility를 `gone`으로 변경하고, 홈 API 로딩 완료 후 `bindHeader()`/`bindTitleBar()`에서 필요한 버튼만 표시하도록 유지했다. -- [ ] **Task 11.3: 크리에이터 본인 페이지 상단 액션 정책 추가** +- [x] **Task 11.3: 크리에이터 본인 페이지 상단 액션 정책 추가** - 수정: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/data/CreatorChannelHomeModels.kt` - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/model/CreatorChannelHomeUiModels.kt` @@ -1168,8 +1176,11 @@ - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelTitleBarStateTest"` - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` - `./gradlew :app:compileDebugKotlin` + - 검증 기록: + - 2026-06-16: 홈 API DTO에 선택 필드 `isOwner`, `isBlock` 기본값을 추가하고 UI model/mapper로 전달했다. 본인 페이지에서는 title-bar 팔로우 capsule, 알림, 더보기를 숨기고 더보기 진입을 차단하도록 구현했다. `CreatorChannelHomeMapperTest`, `CreatorChannelActivitySourceTest`, `compileDebugKotlin` PASS. + - 2026-06-16: 후속 API 계약 확인 결과 `CreatorChannelCreatorResponse.isOwner`도 서버 응답에 없으므로 DTO 필드를 제거했다. 본인 여부는 `SharedPreferenceManager.userId == creator.creatorId`로 계산하며, `toUiContent(currentMemberId: Long)` 파라미터를 통해 mapper에서 `CreatorChannelHeaderUiModel.isOwner`를 만든다. -- [ ] **Task 11.4: 본인 페이지 `DM 확인하기` 진입 추가** +- [x] **Task 11.4: 본인 페이지 `DM 확인하기` 진입 추가** - 수정: - `app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt` - `app/src/main/java/kr/co/vividnext/sodalive/main/MainActivity.kt` @@ -1191,6 +1202,17 @@ - 검증 명령: - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` - `./gradlew :app:compileDebugKotlin` + - 검증 기록: + - 2026-06-16: 본인 페이지에서 `DM 보내기` 대신 `DM 확인하기`를 표시하고 `MainV2Activity.newChatDmIntent()`로 메인 `대화` 탭 및 `ChatRoomFilter.DM` 초기 선택을 전달하도록 구현했다. 기존 MainV2 인스턴스가 이미 채팅 탭인 경우에도 `ChatMainFragment.selectFilter()`로 DM 필터를 갱신한다. `CreatorChannelActivitySourceTest`, `compileDebugKotlin` PASS. + - 2026-06-16: `creator_channel_dm_check_button`을 ko/en/ja 리소스에 추가해 본인 페이지 `DM 확인하기` 버튼 문구를 다국어 처리했다. + +#### Phase 11 후속 검증 로그 + +- 2026-06-16: `rg -n "isOwner|isBlock|unblockUser|onClickUnblock|newInstance\(isBlocked|toUiContent\(\)" app/src/main/java app/src/test/java`로 크리에이터 채널 범위의 제거 대상 참조를 점검했다. 관련 production 코드에는 `isBlock`/`unblockUser` 잔여 사용이 없고, 테스트 계약은 제거 여부를 검증하도록 갱신했다. +- 2026-06-16: `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeMapperTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` PASS. 중간에 `CreatorChannelMoreBottomSheet.kt`의 `Bundle` import 누락으로 `compileDebugKotlin`이 실패했으나 `android.os.Bundle` import를 추가해 재검증 통과했다. +- 2026-06-16: `./gradlew :app:mergeDebugResources :app:compileDebugKotlin :app:ktlintCheck` PASS, `git diff --check` PASS. 중간에 `CreatorChannelMoreBottomSheet.kt`의 unused `R` import로 `ktlintMainSourceSetCheck`가 실패했으나 import 제거 후 재검증 통과했다. `.editorconfig disabled_rules` deprecation warning과 Gradle deprecation warning은 기존 경고로 이번 변경과 무관하다. +- 2026-06-16: post-implementation review에서 `reportUser()`/`reportProfile()` 실패 시에도 신고 접수 완료 토스트가 표시되는 문제, 차단 성공 토스트 하드코딩, `ChatMainFragmentLayoutTest`의 기존 `loadFirstPage()` source 계약 미갱신이 blocking으로 확인되었다. 신고 API `success=false`/throwable 시 `common_error_unknown` 토스트로 분기하고, 차단 성공 문구를 `creator_channel_block_success` ko/en/ja 리소스로 이동했으며, 채팅 탭 source test를 `viewModel.loadFirstPage(initialFilter ?: ChatRoomFilter.ALL)` 계약으로 갱신했다. +- 2026-06-16: 리뷰 지적 수정 후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeMapperTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModelTest" --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest" --tests "kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragmentLayoutTest"` PASS, `./gradlew :app:mergeDebugResources :app:compileDebugKotlin :app:ktlintCheck` PASS, `git diff --check` PASS. --- @@ -1380,6 +1402,29 @@ --- +### Phase 15: 미사용 활동 요약 문자열 리소스 제거 + +- [x] **Task 15.1: `creator_channel_activity_summary` 제거** + - 수정: + - `app/src/main/res/values/strings.xml` + - `app/src/main/res/values-en/strings.xml` + - `app/src/main/res/values-ja/strings.xml` + - `app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt` + - 작업: + - 현재 활동 섹션은 label/value row와 개별 단위 format resource를 사용하므로, 사용하지 않는 `creator_channel_activity_summary` string resource를 모든 locale에서 제거한다. + - source test에 해당 resource name이 locale string 파일에 남지 않는 계약을 추가한다. + - 검증: + - `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"` + - `./gradlew :app:mergeDebugResources` + - `git diff --check` + - 기대 결과: + - source test와 리소스 병합이 통과하고 `rg -n "creator_channel_activity_summary" app/src/main app/src/test` 결과가 검증 의도 외 참조 없음으로 정리된다. + - 검증 기록: + - 2026-06-16: RED로 `CreatorChannelActivitySourceTest`에 `creator_channel_activity_summary`가 locale string 파일에 남지 않는 assertion을 추가하고 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"`를 실행해 `활동 summary string resource는 label value row 구조에서 사용하지 않는다` 실패를 확인했다. + - 2026-06-16: `values`, `values-en`, `values-ja`의 `creator_channel_activity_summary` 정의를 제거했다. 이후 `./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivitySourceTest"`, `./gradlew :app:mergeDebugResources`, `git diff --check`가 모두 PASS했다. `rg -n "creator_channel_activity_summary" app/src/main app/src/test` 결과는 source test의 검증 문자열 2건만 남았다. + +--- + ## Verification Log - 2026-06-12: `docs/20260611_크리에이터_채널_홈_탭/prd.md`, `docs/agent-guides/work-plan-docs.md`, `docs/agent-guides/build-test-style.md`, `docs/agent-guides/code-style.md`를 확인해 계획 문서 작성 규칙과 검증 명령 규칙을 확인했다. - 2026-06-12: 기존 `HomeRecommendationApi`, `HomeRecommendationModels`, `HomeRecommendationRepository`, `HomeRecommendationViewModel`, `RecommendedActivityType`, `HomeRecommendationMappers`, `HomeRecommendationUiModels`, `AppDI`, `ChatRoomActivity`, `DmChatRoomActivity`를 확인해 신규 크리에이터 채널 홈 구현 계획의 파일 경계와 재사용 지점을 정리했다. diff --git a/docs/20260611_크리에이터_채널_홈_탭/prd.md b/docs/20260611_크리에이터_채널_홈_탭/prd.md index 5b51023f..0da4784e 100644 --- a/docs/20260611_크리에이터_채널_홈_탭/prd.md +++ b/docs/20260611_크리에이터_채널_홈_탭/prd.md @@ -549,6 +549,7 @@ tab-bar는 스크롤 중 title-bar 하단에 고정되는 sticky 영역으로 - 활동 섹션은 Figma `296:15001` 기준 폰트, 색상, 간격을 따른다. - 활동 섹션의 데뷔 값은 `activity.debutDateUtc`를 `yyyy.MM.dd`로 변환하고 `activity.dDay`를 붙여 `2026.06.11(D+1)` 형식으로 표시한다. - `activity.dDay` 값이 있으면 데뷔 날짜 파싱 여부와 무관하게 화면에서 누락되지 않는다. +- 기존 활동 요약 단일 문자열은 현재 활동 섹션의 label/value row 구조에서 사용하지 않으므로 `creator_channel_activity_summary` string resource를 제거한다. - 스크롤 시 tab-bar가 title-bar 영역까지 이동한 뒤 고정된다. - tab-bar 고정 이후 하단 컨텐츠만 스크롤된다. - title-bar와 tab-bar의 실제 거리 및 프로필 이미지가 절반 이상 사라진 상태를 기준으로 title-bar 배경색이 black으로 변경된다.