feat(home): 팔로잉 전체 버튼을 고정한다

This commit is contained in:
Yu Sung
2026-08-18 13:59:03 +09:00
parent 9339a22a7d
commit b1cdbfe013
4 changed files with 199 additions and 33 deletions

View File

@@ -20,6 +20,7 @@
- 팔로잉 탭 전체 empty 문구는 `팔로잉 소식이 아직 없어요.\n관심 있는 크리에이터를 팔로우해 보세요.`를 사용하고 `I18n.HomeFollowing.emptyStateMessage`로 다국어 처리한다.
- API 실패 문구는 `팔로잉 정보를 불러오지 못했습니다.\n잠시 후 다시 시도해 주세요.`를 사용한다.
- 섹션별 배열이 비어 있으면 해당 섹션은 숨긴다. 팔로잉 크리에이터 섹션도 예외 없이 `followingCreators`가 비어 있으면 `전체` 버튼까지 함께 숨긴다.
- 팔로잉 크리에이터 목록만 가로로 스크롤하고 `전체` 버튼은 추천 탭 현재 라이브 섹션과 동일한 배치와 스타일로 오른쪽 끝에 고정한다.
- 모든 뷰의 루트 container와 섹션 container에는 불필요한 고정 숫자 width/height를 사용하지 않는다.
- 프로필 이미지, 썸네일, 아이콘, tag, 최소 터치 영역처럼 UI 의미상 크기가 정해진 요소에만 고정 크기를 사용한다.
- 외부 라이브러리는 추가하지 않는다.
@@ -532,6 +533,54 @@
- 실행 명령: `rg "if !response\\.followingCreators\\.isEmpty|MainHomeFollowingCreatorSection" SodaLive/Sources/V2/Main/Home/Following/MainHomeFollowingView.swift`
- 기대 결과: empty 문구의 ko/en/ja 다국어 처리와 팔로잉 크리에이터 빈 배열 시 섹션 렌더링 차단이 확인된다.
### Phase 15: 팔로잉 크리에이터 전체 아이템 고정 및 스타일 통일
**Phase 결과:** 팔로잉 크리에이터 목록만 가로로 스크롤하고 `전체` 아이템은 추천 탭 현재 라이브 섹션과 동일한 배치와 스타일로 오른쪽 끝에 고정된다.
**선행조건:** `DEC-015` 확정 및 Phase 14 완료.
#### Task 15.1: 전체 아이템 배치와 스타일 통일
**Goal 실행 `P15-T1`:** 팔로잉 크리에이터 `전체` 아이템을 추천 라이브 `전체` 아이템과 동일하게 고정 표시한다.
- **시작 조건:** PRD §7.3, §12와 `DEC-015` 확인.
- **완료 증거:** 정적 구조 확인, 시뮬레이터 빌드 성공, 수동 스크롤 확인.
- **범위 밖:** 크리에이터 아이템 스타일, 전체 목록 라우팅, 추천 라이브 섹션 수정, 공용 컴포넌트 추출.
- **TDD 예외 사유:** 테스트 타깃이 없는 SwiftUI 단일 레이아웃·스타일 변경이다.
- **대체 검증 방법:** 소스 구조 검색, 시뮬레이터 빌드, 팔로잉 크리에이터 목록 스크롤 전후 화면 확인을 사용한다.
**Files:**
- Modify: `SodaLive/Sources/V2/Main/Home/Following/Components/MainHomeFollowingCreatorSection.swift`
- Reference: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeLiveSection.swift`
- [x] 루트에 `HStack(alignment: .top, spacing: SodaSpacing.s12)`을 두고 가로 `ScrollView``전체` 버튼을 형제로 분리한다.
- [x] 가로 `ScrollView``LazyHStack`에는 `followingCreators` 아이템만 두고 `.padding(.leading, SodaSpacing.s20)``.frame(maxWidth: .infinity, alignment: .leading)`을 적용한다.
- [x] `전체` 버튼은 스크롤 밖에서 `.appFont(.body5)`, `Color.soda400`, `.frame(width: 70, height: 102, alignment: .center)`, `.buttonStyle(.plain)`을 사용한다.
- [x] `전체` 버튼에 별도 오른쪽 padding을 두지 않고 기존 `onTapAll()` 및 크리에이터 `onTapCreator` 동작을 유지한다.
- [x] `followingCreators`가 비어 있을 때 섹션 전체가 숨겨지는 상위 분기와 `.followingList` 라우팅을 변경하지 않는다.
검증 기준:
```bash
rg -n "HStack\(alignment: \.top, spacing: SodaSpacing\.s12\)|ScrollView\(\.horizontal|padding\(\.leading, SodaSpacing\.s20\)|frame\(maxWidth: \.infinity, alignment: \.leading\)|appFont\(\.body5\)|frame\(width: 70, height: 102, alignment: \.center\)|buttonStyle\(\.plain\)" SodaLive/Sources/V2/Main/Home/Following/Components/MainHomeFollowingCreatorSection.swift
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug -destination "generic/platform=iOS Simulator" CODE_SIGNING_ALLOWED=NO build
```
**Expected:** 정적 검색에서 추천 라이브와 동일한 분리 배치 및 `전체` 스타일이 확인되고 빌드가 성공한다.
수동 검증:
- [x] 크리에이터 목록을 좌우로 스크롤해도 `전체` 아이템이 화면 오른쪽 끝에 유지된다.
- [x] `전체` 아이템의 글꼴, 색상, 크기, 중앙 정렬과 우측 여백이 추천 탭 현재 라이브 섹션과 동일하다.
- [x] 크리에이터와 `전체` 아이템 탭 동작이 기존과 동일하다.
### Phase 15 완료 조건
- [x] `P15-T1` 체크박스와 완료 증거가 모두 충족됐다.
- [x] PRD §7.3, §12 및 `DEC-015`와 구현 차이가 없다.
- [x] 검증 결과가 아래 검증 기록에 누적됐다.
## 검증 기록
- 2026-06-30: `docs/agent-guides/documentation-policy.md`, `build-test-verification.md`, `code-style.md`를 확인해 계획 문서 경로, Phase/checklist 형식, 검증 명령 기준을 반영했다.
@@ -632,3 +681,11 @@
- 2026-07-13: PRD와 plan-task의 기존 “크리에이터가 없어도 `전체` 버튼 표시” 요구사항을 “크리에이터가 있을 때만 섹션과 `전체` 버튼 표시”로 갱신했다.
- 2026-07-13: `git diff --check -- SodaLive/Sources/V2/Main/Home/Following/MainHomeFollowingView.swift docs/20260630_메인_홈_팔로잉_탭/prd.md docs/20260630_메인_홈_팔로잉_탭/plan-task.md` 실행 결과 출력 없이 종료되어 변경 파일 공백 오류가 없음을 확인했다.
- 2026-07-13: 샌드박스 안의 `xcodebuild`는 Xcode/CoreSimulator/DerivedData/SwiftPM 캐시 접근 제한으로 실패했으나, 승인 후 샌드박스 밖에서 `xcodebuild -workspace SodaLive.xcworkspace -scheme SodaLive -configuration Debug -destination generic/platform=iOS\ Simulator -derivedDataPath /private/tmp/SodaLiveDerivedDataFollowingEmpty CODE_SIGNING_ALLOWED=NO build`를 실행해 `BUILD SUCCEEDED`를 확인했다. 기존 duplicate build file/dependency scan warning과 `LiveRoomViewModel`의 unused variable warning은 남아 있으나 컴파일 오류는 없었다.
- 2026-08-18: 사용자 인터뷰로 팔로잉 크리에이터 `전체` 아이템의 배치와 스타일을 추천 탭 현재 라이브 섹션과 모두 통일하기로 확정하고 Phase 15를 추가했다. 이번 작업은 문서 작성만 수행하며 `P15-T1` 구현 체크박스는 미완료로 유지한다.
- 2026-08-18: `git diff --check -- docs/20260630_메인_홈_팔로잉_탭/prd.md docs/20260630_메인_홈_팔로잉_탭/plan-task.md`는 출력 없이 성공했고, `git diff --name-only`에서 위 두 문서만 변경된 것을 확인했다.
- 2026-08-18: `P15-T1` 구현으로 `MainHomeFollowingCreatorSection`의 가로 `ScrollView`에는 크리에이터 아이템만 남기고, `전체` 버튼을 루트 `HStack`의 우측 형제로 분리했다. `전체` 스타일은 추천 라이브와 동일한 `.body5`, `Color.soda400`, `70x102pt`, 중앙 정렬, 별도 우측 여백 없음으로 변경했다.
- 2026-08-18: Phase 15 정적 `rg` 검증에서 `HStack`, 가로 `ScrollView`, leading 20pt, 최대 너비, `.body5`, `70x102pt`, plain button 패턴을 모두 확인했고 `git diff --check`는 출력 없이 성공했다.
- 2026-08-18: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug -destination "generic/platform=iOS Simulator" CODE_SIGNING_ALLOWED=NO build`를 실행해 `BUILD SUCCEEDED`를 확인했다. 기존 Crashlytics dSYM, AppIntents metadata, Alamofire dependency scan warning은 남아 있으나 컴파일 오류는 없었다.
- 2026-08-18: 사용자 요청에 따라 visual-qa는 수행하지 않았다. 크리에이터 목록 스크롤 중 `전체` 고정, 추천 라이브와의 스타일 일치, 크리에이터/전체 탭 동작은 사용자 수동 검증 대기로 남긴다.
- 2026-08-18: `reviews/phase15-following-creator-all-item.md`에 Phase 15 리뷰 결과를 기록했다. 1차 리뷰의 PRD 이전 표현 3곳을 정정하고 Oracle 재검토 승인을 받았으며, 남은 항목은 사용자 수동 UI 검증이다.
- 2026-08-18: 사용자가 Phase 15 수동 테스트 완료를 확인했다. 스크롤 중 `전체` 우측 고정, 추천 라이브와의 스타일 일치, 크리에이터/`전체` 탭 동작 확인 항목을 완료 처리하고 `P15-T1` 및 Phase 15 완료 조건을 충족 상태로 갱신했다.