fix(creator): 공지 상세 이동을 연결한다
This commit is contained in:
@@ -570,6 +570,50 @@ Expected: 첫 명령 match 0건·exit code 1, 둘째 명령 match 2건, whitespa
|
||||
|
||||
- [x] **REFACTOR:** 신규 상태·helper를 추가하지 않고 기존 `isPaidLocked`만 재사용한다.
|
||||
|
||||
### Regression Task 2.4 공지 구매를 상세 흐름으로 일원화
|
||||
|
||||
**Goal 실행 `P2-R2`:** 홈 공지의 본체·댓글·유료 잠금 영역이 기존 커뮤니티 상세로 이동하고 구매는 상세에서만 시작한다.
|
||||
|
||||
- **리뷰 근거:** `REV-P3-004` — `reviews/phase3-community-item-unification.md`
|
||||
- **시작 조건:** 사용자 후속 요청과 코드 근거 확인, PRD `CCCI-010`·`DEC-014` 반영.
|
||||
- **완료 증거:** 공지 구매 callback 0건, 단일 상세 callback과 홈 `onTapCommunityDetail` 연결, `git diff --check`, Debug build.
|
||||
- **범위 밖:** 공지 카드 외형·오디오 재생 동작, 구매 endpoint·dialog 내부 UI, 신규 helper·test target 추가.
|
||||
|
||||
**Files:**
|
||||
|
||||
- Modify: `SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelNoticeSection.swift`
|
||||
- Modify: `SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift`
|
||||
- Test: 신규 test 파일 없음—focused contract check·Debug build 사용
|
||||
|
||||
**Interfaces:**
|
||||
|
||||
- Consumes: `CreatorChannelHomeView.onTapCommunityDetail`, `CreatorChannelView.showCommunityPostDetail(_:)`, 상세 구매·refresh 흐름.
|
||||
- Produces: 공지 카드의 모든 게시글 진입점이 같은 `postId` 상세 route를 사용하는 동작.
|
||||
|
||||
- [x] **RED:** 공지에 별도 `onTapPurchase`·`onTapNotice`·`onTapComment`가 남고 홈 조립부가 상세 callback을 전달하지 않음을 확인한다.
|
||||
|
||||
```bash
|
||||
rg -n "onTapPurchase|onTapNotice|onTapComment|Button\(action: onTapPurchase\)" SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelNoticeSection.swift
|
||||
rg -n "CreatorChannelNoticeSection\(notices: response\.notices\)" SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift
|
||||
```
|
||||
|
||||
Expected: 두 명령 모두 match·exit code 0.
|
||||
|
||||
- [x] **RED 확인:** 상세 route와 상세 구매 성공 후 상세·홈·커뮤니티 refresh 흐름은 이미 존재함을 확인한다.
|
||||
- [x] **GREEN:** 공지의 세 callback을 단일 `onTapDetail`로 교체하고 잠금 구매 `Button` wrapper를 제거한 뒤 홈의 `onTapCommunityDetail`을 전달한다.
|
||||
- [x] **GREEN 확인:** 기존 공지 callback 0건, 단일 상세 callback·홈 연결 match, `git diff --check`, Debug build가 통과함을 확인한다.
|
||||
|
||||
```bash
|
||||
rg -n "onTapPurchase|onTapNotice|onTapComment|Button\(action: onTapPurchase\)" SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelNoticeSection.swift SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift
|
||||
rg -n "onTapDetail|onTapCommunityDetail" SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelNoticeSection.swift SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift
|
||||
git diff --check
|
||||
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
|
||||
```
|
||||
|
||||
Expected: 첫 명령 match 0건·exit code 1, 둘째 명령 필수 연결 match, whitespace 오류 0건, `** BUILD SUCCEEDED **`.
|
||||
|
||||
- [x] **REFACTOR:** 공지 카드 외형·오디오 재생과 기존 상세·구매·refresh 구현은 변경하지 않는다.
|
||||
|
||||
### Phase 2 Gate
|
||||
|
||||
**Goal 실행 `P2-GATE`:** 홈 재사용·상세·더보기·목록 동기화 구조를 판정한다.
|
||||
@@ -579,10 +623,12 @@ git diff --check
|
||||
rg -n "communityPostItem|CreatorChannelCommunityListItem\(|onTapCommunityMore|onTapCommunityDetail|refreshCommunityFeeds" SodaLive/Sources/V2/CreatorChannel/Home SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift
|
||||
rg -n "CommunityPostCard\(" SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelCommunitySection.swift
|
||||
rg -n -U 'if !isPaidLocked \{\n[[:space:]]+reactionBar' SodaLive/Sources/V2/CreatorChannel/Community/Components/CreatorChannelCommunityListItem.swift SodaLive/Sources/V2/CreatorChannel/Community/Detail/Components/CreatorChannelCommunityPostDetailContentView.swift
|
||||
rg -n "onTapPurchase|onTapNotice|onTapComment" SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelNoticeSection.swift
|
||||
rg -n "onTapDetail|onTapCommunityDetail" SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelNoticeSection.swift SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift
|
||||
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
|
||||
```
|
||||
|
||||
Expected: whitespace 오류 0건, 필수 연결 match, 홈 `CommunityPostCard` match 0건·exit code 1, `** BUILD SUCCEEDED **`.
|
||||
Expected: whitespace 오류 0건, 필수 연결 match, 홈 `CommunityPostCard`·공지 기존 callback match 0건·exit code 1, `** BUILD SUCCEEDED **`.
|
||||
|
||||
## Phase 3: 리뷰·통합 검증·문서 종결
|
||||
|
||||
@@ -620,6 +666,8 @@ Expected: whitespace 오류 0건, 필수 연결 match, 홈 `CommunityPostCard` m
|
||||
rg -n "let (isCommentAvailable|isPinned): Bool" SodaLive/Sources/V2/CreatorChannel/Home/Models/CreatorChannelHomeResponse.swift
|
||||
rg -n "communityPostItem|CreatorChannelCommunityListItem\(|showCommunityPostDetail\(_ postId: Int\)|refreshCommunityFeeds" SodaLive/Sources/V2/CreatorChannel/Home SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift
|
||||
rg -n "onTapPurchase|openPurchaseDialog|isShowPostPurchaseView|selectedPostPrice|purchaseCommunityPost" SodaLive/Sources/V2/CreatorChannel/Community/Components/CreatorChannelCommunityListItem.swift SodaLive/Sources/V2/CreatorChannel/Community/Components/CreatorChannelCommunityGridItem.swift SodaLive/Sources/V2/CreatorChannel/Community/CreatorChannelCommunityTabView.swift SodaLive/Sources/V2/CreatorChannel/Community/CreatorChannelCommunityViewModel.swift SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift
|
||||
rg -n "onTapPurchase|onTapNotice|onTapComment" SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelNoticeSection.swift
|
||||
rg -n "onTapDetail|onTapCommunityDetail" SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelNoticeSection.swift SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift
|
||||
rg -n "Color\.gray800" SodaLive/Sources/V2/CreatorChannel/Community/Components/CreatorChannelCommunityListItem.swift SodaLive/Sources/V2/CreatorChannel/Community/Components/CreatorChannelCommunityGridItem.swift SodaLive/Sources/V2/CreatorChannel/Community/Detail/Components/CreatorChannelCommunityPostDetailContentView.swift
|
||||
git diff --check
|
||||
```
|
||||
@@ -662,12 +710,13 @@ Expected: exit code 0, `** BUILD SUCCEEDED **`.
|
||||
| 5 | `P2-T1` | `P1-GATE` | 아니요 | 홈·탭 모델 매핑 재확인 |
|
||||
| 6 | `P2-T2` | `P2-T1` | 아니요 | mutation 성공 callback 호출처 재확인 |
|
||||
| 7 | `P2-R1` | 사용자 회귀 제보·PRD 반영 | 아니요 | reaction bar 삽입 조건 재확인 |
|
||||
| 8 | `P2-GATE` | Phase 2 Task 전체 | 아니요 | 실패 소유 Task 수정 |
|
||||
| 9 | `P3-T1` | `P2-GATE` | 아니요 | 리뷰 수정 Task 추가 |
|
||||
| 10 | `P3-GATE` | `P3-T1`·`EXT-001` | 아니요 | 백엔드 반영 후 통합 검증 재개 |
|
||||
| 8 | `P2-R2` | 사용자 후속 요청·PRD 반영 | 아니요 | 공지 상세 callback 경계 재확인 |
|
||||
| 9 | `P2-GATE` | Phase 2 Task 전체 | 아니요 | 실패 소유 Task 수정 |
|
||||
| 10 | `P3-T1` | `P2-GATE` | 아니요 | 리뷰 수정 Task 추가 |
|
||||
| 11 | `P3-GATE` | `P3-T1`·`EXT-001` | 아니요 | 백엔드 반영 후 통합 검증 재개 |
|
||||
|
||||
```text
|
||||
P1-T1 → P1-T2 → P1-T3 → P1-GATE → P2-T1 → P2-T2 → P2-R1 → P2-GATE → P3-T1 → P3-GATE
|
||||
P1-T1 → P1-T2 → P1-T3 → P1-GATE → P2-T1 → P2-T2 → P2-R1 → P2-R2 → P2-GATE → P3-T1 → P3-GATE
|
||||
```
|
||||
|
||||
## 변경 금지 항목
|
||||
@@ -749,6 +798,19 @@ P1-T1 → P1-T2 → P1-T3 → P1-GATE → P2-T1 → P2-T2 → P2-R1 → P2-GATE
|
||||
- 남은 항목: 기존 `EXT-001`·부팅된 Simulator 기반 Preview/통합 검증.
|
||||
- 다음 행동: 외부 조건 충족 후 `P3-GATE`를 재개한다.
|
||||
|
||||
### 공지 상세 구매 일원화 — 2026-08-10
|
||||
|
||||
- 상태: `P2-R2` 구현·정적 계약·Debug build 완료
|
||||
- 무엇을: 홈 공지의 별도 구매 callback과 no-op 상세·댓글 callback을 하나의 상세 이동 흐름으로 통일한다.
|
||||
- 왜: 공지도 커뮤니티 게시글이므로 목록에서 구매하지 않고 상세에서만 구매해야 한다.
|
||||
- 어떻게: `REV-P3-004`, `CCCI-010`, `DEC-014`를 연결하고 focused RED/GREEN contract check와 Debug build를 완료 증거로 사용한다.
|
||||
- 결과:
|
||||
- RED: 공지 직접 구매 callback 7건과 상세 callback 미전달 생성부 1건을 확인했다.
|
||||
- GREEN: 기존 공지 callback 0건, 단일 `onTapDetail`과 홈 `onTapCommunityDetail` 연결을 확인했다.
|
||||
- `git diff --check` 오류 0건, `SodaLive-dev` Debug build exit code 0을 확인했다.
|
||||
- 남은 항목: 기존 `EXT-001`·부팅된 Simulator 기반 통합 검증.
|
||||
- 다음 행동: 외부 조건 충족 후 `P3-GATE`를 재개한다.
|
||||
|
||||
## Decision Log
|
||||
|
||||
| 날짜 | ID | 상태 | 결정 | 근거 | 영향 Goal/문서 |
|
||||
@@ -759,6 +821,7 @@ P1-T1 → P1-T2 → P1-T3 → P1-GATE → P2-T1 → P2-T2 → P2-R1 → P2-GATE
|
||||
| 2026-08-10 | `PLAN-DEC-004` | 확정 | 신규 test target 대신 contract check·Preview·Debug build·시뮬레이터를 완료 증거로 사용한다. | 현재 프로젝트에 unit test bundle 없음 | 전체 Task·Gate |
|
||||
| 2026-08-10 | `PLAN-DEC-005` | 확정 | 목록의 기존 구매 상태·API 호출을 상세 View·ViewModel로 옮긴다. | 상세의 현재 `showPurchaseError()`만으로는 사용자 요구인 상세 구매가 불가능함 | `P1-T2`, `P1-T3` |
|
||||
| 2026-08-10 | `PLAN-DEC-006` | 확정 | 하트·댓글이 모두 숨겨지는 경우 높이 보정 대신 reaction bar 전체를 조건부로 제외한다. | 공용 리스트·상세의 빈 고정 높이를 같은 기존 상태로 제거하는 최소 변경 | `P2-R1`, `CCCI-009` |
|
||||
| 2026-08-10 | `PLAN-DEC-007` | 확정 | 공지 카드의 별도 구매·상세·댓글 callback을 단일 상세 callback으로 교체하고 기존 홈 상세 route를 재사용한다. | 공지도 커뮤니티 게시글이며 상세 전용 구매 원칙을 동일하게 적용 | `P2-R2`, `CCCI-010` |
|
||||
|
||||
## 발견된 문제
|
||||
|
||||
@@ -767,6 +830,7 @@ P1-T1 → P1-T2 → P1-T3 → P1-GATE → P2-T1 → P2-T2 → P2-R1 → P2-GATE
|
||||
| `ISSUE-001` | High | 외부 조건 대기 | 백엔드 홈 API 응답에 `isCommentAvailable`·`isPinned`이 없으면 신규 iOS 모델 디코딩에 실패한다. | `P1-T1`, `P3-GATE` | iOS 구현·빌드는 완료했고 `EXT-001` 반영 후 통합 검증한다. |
|
||||
| `ISSUE-002` | High | 환경 대기 | 사용 가능한 Simulator가 모두 `Shutdown`이라 실제 터치·메뉴·구매 검증을 실행하지 못했다. | `P3-T1`, `P3-GATE` | Simulator 부팅 후 수동 검증을 재개한다. |
|
||||
| `ISSUE-003` | Medium | 수정 완료 | 유료 잠금 상태에서 하트·댓글은 숨겨지지만 빈 reaction bar의 고정 24pt 높이가 홈·목록·상세에 남는다. | `P2-R1`, `P3-GATE` | 조건부 삽입 contract check·Debug build 통과. |
|
||||
| `ISSUE-004` | High | 수정 완료 | 홈 공지는 별도 구매 callback이 남고 실제 조립부가 상세 callback을 전달하지 않아 상세 전용 구매 원칙을 충족하지 않는다. | `P2-R2`, `P3-GATE` | 단일 상세 callback 연결·직접 구매 callback 제거·Debug build 통과. |
|
||||
|
||||
## 최종 보고 형식
|
||||
|
||||
|
||||
Reference in New Issue
Block a user