fix(donation): 빈 상태와 캔 표시를 수정한다
This commit is contained in:
@@ -57,7 +57,7 @@ struct CreatorChannelDonationCard: View {
|
|||||||
.scaledToFit()
|
.scaledToFit()
|
||||||
.frame(width: 18, height: 18)
|
.frame(width: 18, height: 18)
|
||||||
|
|
||||||
Text(I18n.LiveChat.canWithUnit(donation.can))
|
Text("\(donation.can)")
|
||||||
.appFont(size: 14, weight: .regular)
|
.appFont(size: 14, weight: .regular)
|
||||||
.foregroundColor(.white)
|
.foregroundColor(.white)
|
||||||
.lineLimit(1)
|
.lineLimit(1)
|
||||||
|
|||||||
@@ -20,7 +20,9 @@ struct CreatorChannelDonationTabView: View {
|
|||||||
|
|
||||||
private var content: some View {
|
private var content: some View {
|
||||||
VStack(spacing: 0) {
|
VStack(spacing: 0) {
|
||||||
CreatorChannelDonationCountBar(donationCount: viewModel.donationCount)
|
if viewModel.donationCount > 0 || viewModel.rankings.isEmpty == false {
|
||||||
|
CreatorChannelDonationCountBar(donationCount: viewModel.donationCount)
|
||||||
|
}
|
||||||
|
|
||||||
if isEmptyState {
|
if isEmptyState {
|
||||||
CreatorChannelDonationEmptyView(
|
CreatorChannelDonationEmptyView(
|
||||||
|
|||||||
@@ -20,12 +20,13 @@
|
|||||||
- 후원 mutation은 기존 `LiveRoomDonationDialogView`와 `ChannelDonationViewModel.postChannelDonation` 흐름을 재사용한다.
|
- 후원 mutation은 기존 `LiveRoomDonationDialogView`와 `ChannelDonationViewModel.postChannelDonation` 흐름을 재사용한다.
|
||||||
- 후원 성공 후 홈 데이터와 후원 탭 첫 페이지를 모두 다시 조회한다.
|
- 후원 성공 후 홈 데이터와 후원 탭 첫 페이지를 모두 다시 조회한다.
|
||||||
- 후원 랭킹은 최대 8명, 한 줄에 4명씩 표시하고 `전체보기`는 기존 `AppStep.userProfileDonationAll(userId:)`로 이동한다.
|
- 후원 랭킹은 최대 8명, 한 줄에 4명씩 표시하고 `전체보기`는 기존 `AppStep.userProfileDonationAll(userId:)`로 이동한다.
|
||||||
- sort-bar는 정렬 없이 `전체 {donationCount}`만 표시한다.
|
- `rankings.isEmpty && donationCount == 0`인 empty 상태에서는 count bar를 숨기고, 그 외에는 sort-bar에 정렬 없이 `전체 {donationCount}`를 표시한다.
|
||||||
- `rankings.isEmpty && donationCount == 0`이면 empty view 내부 후원하기 버튼만 표시하고 하단 고정 후원하기 버튼은 숨긴다.
|
- `rankings.isEmpty && donationCount == 0`이면 empty view 내부 후원하기 버튼만 표시하고 하단 고정 후원하기 버튼은 숨긴다.
|
||||||
- 단, 내 채널인 경우 empty view 내부 후원하기 버튼과 우측하단 후원하기 버튼을 모두 표시하지 않는다.
|
- 단, 내 채널인 경우 empty view 내부 후원하기 버튼과 우측하단 후원하기 버튼을 모두 표시하지 않는다.
|
||||||
- `donationCount != 0 || !rankings.isEmpty`이면 홈 탭 plus button 위치에 `ic_new_donation` icon-only 후원하기 버튼을 표시한다.
|
- `donationCount != 0 || !rankings.isEmpty`이면 홈 탭 plus button 위치에 `ic_new_donation` icon-only 후원하기 버튼을 표시한다.
|
||||||
- `CreatorChannelDonationResponse`는 홈 탭 모델의 기존 타입을 재사용한다.
|
- `CreatorChannelDonationResponse`는 홈 탭 모델의 기존 타입을 재사용한다.
|
||||||
- 후원 item UI는 홈 탭과 후원 탭에서 같은 표시 규칙을 갖도록 공용화한다.
|
- 후원 item UI는 홈 탭과 후원 탭에서 같은 표시 규칙을 갖도록 공용화한다.
|
||||||
|
- 공용 후원 item의 can badge는 홈·후원 탭 모두 기존 can icon과 숫자만 표시하고 단위 문자열은 제거한다.
|
||||||
- 서버 응답에 없는 secret 여부는 클라이언트에서 추론하지 않는다.
|
- 서버 응답에 없는 secret 여부는 클라이언트에서 추론하지 않는다.
|
||||||
|
|
||||||
## 주요 대상 파일
|
## 주요 대상 파일
|
||||||
@@ -314,3 +315,57 @@ xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configurati
|
|||||||
- 2026-08-26: `CreatorChannelDonationRankingSection`, `CreatorChannelDonationCard`와 직접 호출 경로를 점검해 `REV-P3-001`, `REV-P3-002`를 확정하고 `P7-R1`을 추가했다. 사용자 요청에 따라 이번 작업에서는 문서만 작성했으며 Swift·I18n 구현과 Gate 실행은 남겨 두었다.
|
- 2026-08-26: `CreatorChannelDonationRankingSection`, `CreatorChannelDonationCard`와 직접 호출 경로를 점검해 `REV-P3-001`, `REV-P3-002`를 확정하고 `P7-R1`을 추가했다. 사용자 요청에 따라 이번 작업에서는 문서만 작성했으며 Swift·I18n 구현과 Gate 실행은 남겨 두었다.
|
||||||
- 2026-08-26: Phase 7 구현을 완료했다. 랭킹 title·전체보기·can pill은 기존 I18n을 재사용하고, 공용 카드의 빈 메시지 fallback만 ko/en/ja로 추가했다. 변경 전 정적 계약은 두 항목 모두 exit 1, 변경 후 Gate와 `git diff --check`는 exit 0, `SodaLive-dev` Debug 빌드는 `BUILD SUCCEEDED`, 독립 리뷰는 `APPROVED`였다. 사용자 요청에 따라 visual QA는 실행하지 않았으므로 실제 화면 ko/en/ja 수동 검증 두 항목은 미완료로 유지한다.
|
- 2026-08-26: Phase 7 구현을 완료했다. 랭킹 title·전체보기·can pill은 기존 I18n을 재사용하고, 공용 카드의 빈 메시지 fallback만 ko/en/ja로 추가했다. 변경 전 정적 계약은 두 항목 모두 exit 1, 변경 후 Gate와 `git diff --check`는 exit 0, `SodaLive-dev` Debug 빌드는 `BUILD SUCCEEDED`, 독립 리뷰는 `APPROVED`였다. 사용자 요청에 따라 visual QA는 실행하지 않았으므로 실제 화면 ko/en/ja 수동 검증 두 항목은 미완료로 유지한다.
|
||||||
- 2026-08-26: 사용자 수동 테스트 완료 확인에 따라 Phase 7의 ko/en/ja 실제 화면 검증 두 항목을 완료 처리했다.
|
- 2026-08-26: 사용자 수동 테스트 완료 확인에 따라 Phase 7의 ko/en/ja 실제 화면 검증 두 항목을 완료 처리했다.
|
||||||
|
|
||||||
|
### Phase 8: 후원 empty count와 공용 can badge 회귀 수정
|
||||||
|
|
||||||
|
**Phase 결과:** 후원 empty 상태에서는 `전체 0`이 표시되지 않고, 홈·후원 탭의 공용 후원 카드에는 can icon과 숫자만 표시된다.
|
||||||
|
|
||||||
|
**선행조건:** PRD `DEC-DONATION-BUG-001` 확정.
|
||||||
|
|
||||||
|
**Phase 완료 조건:** `P8-T1`, `P8-GATE` 완료와 검증 기록 누적.
|
||||||
|
|
||||||
|
#### Task 8.1 empty count bar와 공용 can badge 수정
|
||||||
|
|
||||||
|
**Goal 실행 `P8-T1`:** 기존 후원 탭과 공용 카드의 표시 코드만 최소 수정한다.
|
||||||
|
|
||||||
|
- **시작 조건:** Phase 8 선행조건 충족.
|
||||||
|
- **완료 증거:** 정적 계약 검사, empty/non-empty 및 홈·후원 카드 수동 확인, Debug 빌드 결과가 기록된다.
|
||||||
|
- **범위 밖:** empty view·랭킹·메시지 fallback·후원 action 변경, 신규 I18n·formatter·dependency, 관련 없는 리팩터링.
|
||||||
|
- **TDD 예외 사유:** 현재 프로젝트에 test bundle target이 없고 변경 대상은 단순 표시 조건과 문자열 보간이다.
|
||||||
|
- **대체 검증 방법:** `rg` 정적 계약 검사, Debug 빌드와 Simulator 수동 확인을 사용한다.
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
|
||||||
|
- Modify: `SodaLive/Sources/V2/CreatorChannel/Donation/CreatorChannelDonationTabView.swift`
|
||||||
|
- Modify: `SodaLive/Sources/V2/CreatorChannel/Donation/Components/CreatorChannelDonationCard.swift`
|
||||||
|
- Verify: `SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelDonationSection.swift`
|
||||||
|
- Verify: `SodaLive/Sources/I18n/I18n.swift`
|
||||||
|
|
||||||
|
- [x] `viewModel.donationCount > 0 || viewModel.rankings.isEmpty == false`일 때만 `CreatorChannelDonationCountBar`를 표시한다.
|
||||||
|
- [x] 공용 `CreatorChannelDonationCard`의 can badge를 `Text("\(donation.can)")`으로 표시한다.
|
||||||
|
- [x] `I18n.CreatorChannelDonation.defaultMessage(_:)`의 메시지 단위 표기는 유지한다.
|
||||||
|
- [x] 홈·후원 탭 모두 기존 공용 카드, tier 색상, 상대 시간과 메시지 표시 규칙을 유지한다.
|
||||||
|
- [x] 아래 Gate 결과를 검증 기록에 누적한다.
|
||||||
|
|
||||||
|
#### Phase 8 Gate
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rg -n 'donationCount > 0|rankings\.isEmpty|CreatorChannelDonationCountBar' SodaLive/Sources/V2/CreatorChannel/Donation/CreatorChannelDonationTabView.swift
|
||||||
|
rg -n 'Text\("\\\(donation\.can\)"\)|I18n\.LiveChat\.canWithUnit|defaultMessage' SodaLive/Sources/V2/CreatorChannel/Donation/Components/CreatorChannelDonationCard.swift
|
||||||
|
rg -n 'CreatorChannelDonationCard' SodaLive/Sources/V2/CreatorChannel/Donation/CreatorChannelDonationTabView.swift SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelDonationSection.swift
|
||||||
|
git diff --check -- SodaLive/Sources/V2/CreatorChannel/Donation/CreatorChannelDonationTabView.swift SodaLive/Sources/V2/CreatorChannel/Donation/Components/CreatorChannelDonationCard.swift docs/20260704_크리에이터_채널_후원_탭/prd.md docs/20260704_크리에이터_채널_후원_탭/plan-task.md
|
||||||
|
xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build
|
||||||
|
```
|
||||||
|
|
||||||
|
**Expected:** empty 상태에서는 count bar가 숨겨지고, 공용 카드의 can badge에는 `I18n.LiveChat.canWithUnit(_:)` 없이 숫자만 표시되며 Debug 빌드가 성공한다.
|
||||||
|
|
||||||
|
수동 검증:
|
||||||
|
|
||||||
|
- [ ] 후원 empty 상태에서 empty view만 표시되고 `전체 0`은 표시되지 않는다.
|
||||||
|
- [ ] 후원 non-empty 상태에서 `전체 {donationCount}`가 표시된다.
|
||||||
|
- [ ] 홈·후원 탭 공용 카드의 can badge가 ko/en/ja 모두 can icon과 숫자만 표시한다.
|
||||||
|
|
||||||
|
- 2026-08-26: 사용자 인터뷰에서 A안을 선택해 공용 can badge 단위 제거를 홈·후원 탭에 함께 적용하기로 확정하고 Phase 8을 추가했다. 이번 작업은 문서만 작성했으며 Swift 구현과 Gate 실행은 수행하지 않았다.
|
||||||
|
- 2026-08-26: Phase 8을 구현해 empty 상태의 count bar를 숨기고 공용 `CreatorChannelDonationCard`의 can badge를 숫자만 표시하도록 수정했다. 홈·후원 탭의 공용 카드 사용과 `I18n.CreatorChannelDonation.defaultMessage(_:)`, tier 색상, 상대 시간, 메시지 규칙은 유지했다.
|
||||||
|
- 2026-08-26: Phase 8의 `rg` 정적 계약, `git diff --check`, `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build`를 실행했고 `** BUILD SUCCEEDED **`를 확인했다. 사양·코드 품질 리뷰는 모두 승인됐으며 `reviews/phase8-donation-empty-can-badge-regression.md`에 기록했다.
|
||||||
|
- 2026-08-26: 사용자 요청에 따라 visual QA와 Simulator 수동 검증은 수행하지 않았다. empty/non-empty 및 홈·후원 ko/en/ja 실제 화면 체크박스 3개는 사용자 확인 전까지 미완료로 유지한다.
|
||||||
|
|||||||
@@ -16,11 +16,13 @@ Figma 참조:
|
|||||||
- 후원 후 홈 탭 후원 섹션은 갱신되지만, 후원 탭이 구현되면 후원 탭 목록도 함께 갱신되어야 한다.
|
- 후원 후 홈 탭 후원 섹션은 갱신되지만, 후원 탭이 구현되면 후원 탭 목록도 함께 갱신되어야 한다.
|
||||||
- 후원 탭 empty 문구와 `후원하기` 버튼이 한국어로 하드코딩되어 앱 언어 설정에 맞게 표시되지 않는다.
|
- 후원 탭 empty 문구와 `후원하기` 버튼이 한국어로 하드코딩되어 앱 언어 설정에 맞게 표시되지 않는다.
|
||||||
- 후원 랭킹 title·전체보기 action과 공용 후원 카드의 can 표기·빈 메시지 fallback이 한국어로 하드코딩되어 영어·일본어 설정에서도 한국어가 노출된다.
|
- 후원 랭킹 title·전체보기 action과 공용 후원 카드의 can 표기·빈 메시지 fallback이 한국어로 하드코딩되어 영어·일본어 설정에서도 한국어가 노출된다.
|
||||||
|
- `rankings.isEmpty && donationCount == 0`인 empty 상태에서도 count bar가 `전체 0`으로 표시된다.
|
||||||
|
- 후원 item 우측 상단 can badge가 icon과 숫자 뒤에 언어별 단위까지 중복 표시한다.
|
||||||
|
|
||||||
## 3. Goals
|
## 3. Goals
|
||||||
- `CreatorChannelTab.donation` 선택 시 후원 탭 API를 호출하고 응답 데이터로 화면을 구성한다.
|
- `CreatorChannelTab.donation` 선택 시 후원 탭 API를 호출하고 응답 데이터로 화면을 구성한다.
|
||||||
- 기본 query는 `page=0`, `size=20`이다.
|
- 기본 query는 `page=0`, `size=20`이다.
|
||||||
- `donationCount`는 sort-bar 좌측에 `전체 {donationCount}` 형식으로 표시한다.
|
- `rankings.isEmpty && donationCount == 0`인 empty 상태에서는 count bar를 숨기고, 그 외에는 sort-bar 좌측에 `전체 {donationCount}`를 표시한다.
|
||||||
- sort-bar에는 정렬 UI를 표시하지 않는다.
|
- sort-bar에는 정렬 UI를 표시하지 않는다.
|
||||||
- `rankings`는 Figma 후원 랭킹 섹션(`290:9097`)처럼 `후원 랭킹` 카드 안에 프로필 그리드로 표시한다.
|
- `rankings`는 Figma 후원 랭킹 섹션(`290:9097`)처럼 `후원 랭킹` 카드 안에 프로필 그리드로 표시한다.
|
||||||
- 후원 랭킹 섹션의 `전체보기`를 터치하면 기존 `UserProfileDonationAllView`로 이동한다.
|
- 후원 랭킹 섹션의 `전체보기`를 터치하면 기존 `UserProfileDonationAllView`로 이동한다.
|
||||||
@@ -32,6 +34,7 @@ Figma 참조:
|
|||||||
- `donationCount != 0 || !rankings.isEmpty`이면 홈 탭 plus button 위치에 icon-only 후원하기 버튼을 표시한다.
|
- `donationCount != 0 || !rankings.isEmpty`이면 홈 탭 plus button 위치에 icon-only 후원하기 버튼을 표시한다.
|
||||||
- 후원 성공 후 후원 탭 데이터와 홈 탭 데이터가 갱신되어야 한다.
|
- 후원 성공 후 후원 탭 데이터와 홈 탭 데이터가 갱신되어야 한다.
|
||||||
- 후원 랭킹과 공용 후원 카드의 고정 UI 문구는 기존 I18n을 우선 재사용하고, 재사용할 수 없는 빈 메시지 fallback만 `I18n.CreatorChannelDonation`에 추가한다.
|
- 후원 랭킹과 공용 후원 카드의 고정 UI 문구는 기존 I18n을 우선 재사용하고, 재사용할 수 없는 빈 메시지 fallback만 `I18n.CreatorChannelDonation`에 추가한다.
|
||||||
|
- 홈·후원 탭 공용 item의 can badge는 기존 can icon과 숫자만 표시하고 숫자 뒤 ko/en/ja 단위 문자열은 제거한다.
|
||||||
|
|
||||||
## 4. Non-Goals
|
## 4. Non-Goals
|
||||||
- 크리에이터 채널 공통 shell, header, sticky tab-bar 동작을 다시 설계하지 않는다.
|
- 크리에이터 채널 공통 shell, header, sticky tab-bar 동작을 다시 설계하지 않는다.
|
||||||
@@ -85,7 +88,8 @@ data class CreatorChannelDonationResponse(
|
|||||||
|
|
||||||
### 5.2 Sort-bar
|
### 5.2 Sort-bar
|
||||||
- 후원 탭 sort-bar는 정렬이 없고 전체 개수만 포함한다.
|
- 후원 탭 sort-bar는 정렬이 없고 전체 개수만 포함한다.
|
||||||
- 좌측에 `전체`과 `donationCount`를 표시한다.
|
- `rankings.isEmpty && donationCount == 0`이 아닐 때만 좌측에 `전체`와 `donationCount`를 표시한다.
|
||||||
|
- `rankings.isEmpty && donationCount == 0`인 empty 상태에서는 `CreatorChannelDonationCountBar` 전체를 표시하지 않는다.
|
||||||
- 우측 정렬 버튼, 정렬 아이콘, 정렬 context popup, BottomSheet는 표시하지 않는다.
|
- 우측 정렬 버튼, 정렬 아이콘, 정렬 context popup, BottomSheet는 표시하지 않는다.
|
||||||
- 기존 `CreatorChannelSortBar`가 정렬 버튼을 필수로 노출하므로, 후원 탭에서는 별도 `CreatorChannelDonationCountBar`를 만들거나 `CreatorChannelSortBar`를 선택적으로 정렬 숨김 처리할 수 있다.
|
- 기존 `CreatorChannelSortBar`가 정렬 버튼을 필수로 노출하므로, 후원 탭에서는 별도 `CreatorChannelDonationCountBar`를 만들거나 `CreatorChannelSortBar`를 선택적으로 정렬 숨김 처리할 수 있다.
|
||||||
|
|
||||||
@@ -111,7 +115,8 @@ data class CreatorChannelDonationResponse(
|
|||||||
- `createdAtUtc` 상대 시간
|
- `createdAtUtc` 상대 시간
|
||||||
- `can`
|
- `can`
|
||||||
- `message`
|
- `message`
|
||||||
- 후원 금액 pill은 기존 can icon과 `I18n.LiveChat.canWithUnit(_:)`을 재사용해 ko/en/ja 단위 표기를 적용한다.
|
- 홈·후원 탭 공용 item의 후원 금액 pill은 기존 can icon과 숫자만 표시하고 `I18n.LiveChat.canWithUnit(_:)`의 ko/en/ja 단위 문자열은 표시하지 않는다.
|
||||||
|
- `CreatorChannelDonationCard`의 기존 공용 구조를 유지해 두 탭에 동일하게 적용한다.
|
||||||
- 카드 상단 배경색은 홈 탭 후원 카드의 `can` 구간 색상을 재사용한다.
|
- 카드 상단 배경색은 홈 탭 후원 카드의 `can` 구간 색상을 재사용한다.
|
||||||
- `1...50`: `#E2E2E2`
|
- `1...50`: `#E2E2E2`
|
||||||
- `51...100`: `#73EE01`
|
- `51...100`: `#73EE01`
|
||||||
@@ -163,14 +168,15 @@ data class CreatorChannelDonationResponse(
|
|||||||
|
|
||||||
## 6. Success Criteria
|
## 6. Success Criteria
|
||||||
- 후원 탭 진입 시 `GET /api/v2/creator-channels/{creatorId}/donations?page=0&size=20`가 호출된다.
|
- 후원 탭 진입 시 `GET /api/v2/creator-channels/{creatorId}/donations?page=0&size=20`가 호출된다.
|
||||||
- sort-bar에는 `전체 {donationCount}`만 표시되고 정렬 버튼/아이콘/popup은 표시되지 않는다.
|
- empty 상태가 아니면 sort-bar에 `전체 {donationCount}`만 표시되고 정렬 버튼/아이콘/popup은 표시되지 않는다.
|
||||||
- `rankings`가 있으면 `후원 랭킹` 카드에 프로필 그리드와 rank number가 표시된다.
|
- `rankings`가 있으면 `후원 랭킹` 카드에 프로필 그리드와 rank number가 표시된다.
|
||||||
- `후원 랭킹` 카드의 `전체보기`를 터치하면 `UserProfileDonationAllView`로 이동한다.
|
- `후원 랭킹` 카드의 `전체보기`를 터치하면 `UserProfileDonationAllView`로 이동한다.
|
||||||
- `donations` 목록은 기존 홈 탭 후원 카드와 같은 후원 금액별 상단 컬러, can pill, 상대 시간, 메시지 표시 규칙을 따른다.
|
- `donations` 목록은 기존 홈 탭 후원 카드와 같은 후원 금액별 상단 컬러, 상대 시간, 메시지 표시 규칙을 따르되, 후원 탭 can pill은 icon과 숫자만 표시한다.
|
||||||
- 앱 언어가 ko/en/ja일 때 후원 랭킹 title·전체보기 action·can pill·빈 메시지 fallback이 해당 언어로 표시된다.
|
- 앱 언어가 ko/en/ja일 때 후원 랭킹 title·전체보기 action·빈 메시지 fallback이 해당 언어로 표시된다.
|
||||||
- 공용 `CreatorChannelDonationCard`를 사용하는 홈 탭과 후원 탭에서 동일한 다국어 결과가 표시된다.
|
- 후원 탭 can pill은 앱 언어와 관계없이 can icon과 숫자만 표시되고 숫자 뒤 단위 문자열은 표시되지 않는다.
|
||||||
|
- 홈 탭의 공용 후원 카드도 can icon과 숫자만 표시되고 숫자 뒤 단위 문자열은 표시되지 않는다.
|
||||||
- 목록 하단 도달 시 `hasNext == true`이면 다음 페이지가 append된다.
|
- 목록 하단 도달 시 `hasNext == true`이면 다음 페이지가 append된다.
|
||||||
- `rankings.isEmpty && donationCount == 0`이면 Figma `290:9009` empty view가 표시되고, 하단 고정 후원하기 버튼은 숨겨진다.
|
- `rankings.isEmpty && donationCount == 0`이면 count bar 없이 Figma `290:9009` empty view가 표시되고, 하단 고정 후원하기 버튼은 숨겨진다.
|
||||||
- Empty 문구가 지정된 ko/en/ja 값과 줄바꿈으로 표시되고, 버튼 문구는 기존 `I18n.ContentDetail.DonationDialog.title`을 사용한다.
|
- Empty 문구가 지정된 ko/en/ja 값과 줄바꿈으로 표시되고, 버튼 문구는 기존 `I18n.ContentDetail.DonationDialog.title`을 사용한다.
|
||||||
- 내 채널인 경우 Empty view의 후원하기 버튼과 우측하단 icon-only 후원하기 버튼이 모두 표시되지 않는다.
|
- 내 채널인 경우 Empty view의 후원하기 버튼과 우측하단 icon-only 후원하기 버튼이 모두 표시되지 않는다.
|
||||||
- Empty view의 후원하기 버튼을 누르면 홈 탭과 동일한 후원 dialog가 열린다.
|
- Empty view의 후원하기 버튼을 누르면 홈 탭과 동일한 후원 dialog가 열린다.
|
||||||
@@ -186,7 +192,8 @@ data class CreatorChannelDonationResponse(
|
|||||||
- 후원 item UI는 기존 홈 탭 구현과 중복을 줄이기 위해 공용 컴포넌트로 추출하거나, 홈/후원 탭 양쪽에서 같은 하위 컴포넌트를 사용하도록 최소 범위로 조정한다.
|
- 후원 item UI는 기존 홈 탭 구현과 중복을 줄이기 위해 공용 컴포넌트로 추출하거나, 홈/후원 탭 양쪽에서 같은 하위 컴포넌트를 사용하도록 최소 범위로 조정한다.
|
||||||
- 신규 문구가 필요하면 `SodaLive/Sources/I18n/I18n.swift`에 ko/en/ja를 추가한다.
|
- 신규 문구가 필요하면 `SodaLive/Sources/I18n/I18n.swift`에 ko/en/ja를 추가한다.
|
||||||
- Empty 문구는 `pick(ko:en:ja:)`로 관리하고, 후원 버튼은 기존 `I18n.ContentDetail.DonationDialog.title`을 재사용한다. 신규 후원 버튼 문구, route, API, dependency는 추가하지 않는다.
|
- Empty 문구는 `pick(ko:en:ja:)`로 관리하고, 후원 버튼은 기존 `I18n.ContentDetail.DonationDialog.title`을 재사용한다. 신규 후원 버튼 문구, route, API, dependency는 추가하지 않는다.
|
||||||
- 랭킹 title은 `I18n.Explorer.donationRankingTitle`, 전체보기는 `I18n.CreatorChannelHome.viewAll`, can pill은 `I18n.LiveChat.canWithUnit(_:)`을 재사용한다.
|
- 랭킹 title은 `I18n.Explorer.donationRankingTitle`, 전체보기는 `I18n.CreatorChannelHome.viewAll`을 재사용한다.
|
||||||
|
- 홈·후원 탭 공용 can pill은 단위 formatter나 신규 I18n을 추가하지 않고 서버의 `can` 숫자를 그대로 표시한다.
|
||||||
- 빈 후원 메시지 fallback만 `I18n.CreatorChannelDonation.defaultMessage(_:)`로 추가하며 신규 dependency나 공용 formatter abstraction은 만들지 않는다.
|
- 빈 후원 메시지 fallback만 `I18n.CreatorChannelDonation.defaultMessage(_:)`로 추가하며 신규 dependency나 공용 formatter abstraction은 만들지 않는다.
|
||||||
- 프로젝트 설정 변경은 신규 Swift 파일 target 등록이 필요한 경우에만 수행한다.
|
- 프로젝트 설정 변경은 신규 Swift 파일 target 등록이 필요한 경우에만 수행한다.
|
||||||
|
|
||||||
@@ -202,6 +209,9 @@ data class CreatorChannelDonationResponse(
|
|||||||
- 2026-08-26: `CreatorChannelDonationRankingSection`, 공용 `CreatorChannelDonationCard`, 두 컴포넌트의 호출 경로를 정적 점검해 런타임 하드코딩 4곳을 확정했다. Preview fixture의 샘플 문구는 런타임 제품 문구가 아니므로 제외했다.
|
- 2026-08-26: `CreatorChannelDonationRankingSection`, 공용 `CreatorChannelDonationCard`, 두 컴포넌트의 호출 경로를 정적 점검해 런타임 하드코딩 4곳을 확정했다. Preview fixture의 샘플 문구는 런타임 제품 문구가 아니므로 제외했다.
|
||||||
- 2026-08-26: 사용자 인터뷰로 랭킹 title은 기존 `I18n.Explorer.donationRankingTitle`을 재사용하고, 빈 후원 메시지는 카드 전용 ko/en/ja 문구를 추가하기로 결정했다. 이번 작업에서는 문서만 갱신하고 Swift·I18n 구현과 빌드는 수행하지 않는다.
|
- 2026-08-26: 사용자 인터뷰로 랭킹 title은 기존 `I18n.Explorer.donationRankingTitle`을 재사용하고, 빈 후원 메시지는 카드 전용 ko/en/ja 문구를 추가하기로 결정했다. 이번 작업에서는 문서만 갱신하고 Swift·I18n 구현과 빌드는 수행하지 않는다.
|
||||||
- 2026-08-26: Phase 7의 다국어 요구사항을 구현했다. `§5.3`, `§5.4`, `§6`, `§7`의 랭킹 title·전체보기·can pill·빈 메시지 fallback과 홈·후원 탭 공용 적용을 정적 계약, Debug 빌드, 독립 리뷰로 확인했다. 이 PRD에는 체크박스 항목이 없으며, 구현 체크 상태는 `plan-task.md` Phase 7에 기록했다. 사용자 요청에 따라 visual QA는 실행하지 않았다.
|
- 2026-08-26: Phase 7의 다국어 요구사항을 구현했다. `§5.3`, `§5.4`, `§6`, `§7`의 랭킹 title·전체보기·can pill·빈 메시지 fallback과 홈·후원 탭 공용 적용을 정적 계약, Debug 빌드, 독립 리뷰로 확인했다. 이 PRD에는 체크박스 항목이 없으며, 구현 체크 상태는 `plan-task.md` Phase 7에 기록했다. 사용자 요청에 따라 visual QA는 실행하지 않았다.
|
||||||
|
- 2026-08-26: `CreatorChannelDonationTabView`, `CreatorChannelDonationCountBar`, 공용 `CreatorChannelDonationCard`와 홈 탭 호출부를 정적 확인했다. empty 상태의 count bar 숨김과 후원 탭 can 단위 제거 요구사항을 문서에 반영했으며, 공용 카드의 홈 탭 영향 범위는 미결로 남겼다. Swift 구현과 빌드는 수행하지 않았다.
|
||||||
|
- 2026-08-26: 사용자 인터뷰에서 A안을 선택해 can badge 단위 제거를 공용 `CreatorChannelDonationCard`를 사용하는 홈·후원 탭에 함께 적용하기로 확정했다. `OQ-DONATION-BUG-001`을 종료했으며 Swift 구현과 빌드는 수행하지 않았다.
|
||||||
|
- 2026-08-26: Phase 8을 구현해 후원 empty count bar를 숨기고 홈·후원 공용 카드의 can badge를 숫자만 표시하도록 수정했다. 정적 계약, `git diff --check`, `SodaLive-dev` Debug 빌드와 독립 사양·품질 리뷰가 통과했다. PRD에는 체크박스가 없으며 `§3`, `§5.2`, `§5.4`, `§5.7`, `§6`, `§7`, `DEC-DONATION-BUG-001`의 구현 누락이 없음을 대조했다. 사용자 요청에 따라 visual QA와 실제 화면 수동 검증은 수행하지 않았다.
|
||||||
|
|
||||||
## 10. Decision Log
|
## 10. Decision Log
|
||||||
|
|
||||||
@@ -209,3 +219,4 @@ data class CreatorChannelDonationResponse(
|
|||||||
|---|---|---|---|---|---|
|
|---|---|---|---|---|---|
|
||||||
| 2026-08-26 | DEC-DONATION-I18N-001 | 확정 | 랭킹 title은 기존 `I18n.Explorer.donationRankingTitle`을 재사용한다. | 사용자 인터뷰에서 기존 `후원랭킹` 표기를 선택했다. | Ranking section |
|
| 2026-08-26 | DEC-DONATION-I18N-001 | 확정 | 랭킹 title은 기존 `I18n.Explorer.donationRankingTitle`을 재사용한다. | 사용자 인터뷰에서 기존 `후원랭킹` 표기를 선택했다. | Ranking section |
|
||||||
| 2026-08-26 | DEC-DONATION-I18N-002 | 확정 | 빈 후원 메시지는 `I18n.CreatorChannelDonation.defaultMessage(_:)` 전용 문구로 관리한다. | 공개 카드에서 `You donated`가 작성자를 오인하게 하므로 사용자 인터뷰에서 전용 문구를 선택했다. | Home·Donation 공용 card |
|
| 2026-08-26 | DEC-DONATION-I18N-002 | 확정 | 빈 후원 메시지는 `I18n.CreatorChannelDonation.defaultMessage(_:)` 전용 문구로 관리한다. | 공개 카드에서 `You donated`가 작성자를 오인하게 하므로 사용자 인터뷰에서 전용 문구를 선택했다. | Home·Donation 공용 card |
|
||||||
|
| 2026-08-26 | DEC-DONATION-BUG-001 | 확정 | 공용 후원 카드의 can badge는 홈·후원 탭 모두 icon과 숫자만 표시하고 단위 문자열은 제거한다. | 사용자 인터뷰 A안 선택 | `§3`, `§5.4`, `§6`, Phase 8 |
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
# Phase 8 후원 empty·can badge 회귀 수정 리뷰
|
||||||
|
|
||||||
|
## 1. 리뷰 정보
|
||||||
|
|
||||||
|
| 항목 | 내용 |
|
||||||
|
|---|---|
|
||||||
|
| 리뷰 대상 | Phase 8 / Task 8.1 |
|
||||||
|
| 기준 commit 또는 working tree | 미커밋 working tree |
|
||||||
|
| 리뷰 일자 | 2026-08-26 |
|
||||||
|
| 리뷰어 | Sisyphus spec reviewer, code quality reviewer |
|
||||||
|
| 기준 문서 | `prd.md`, `plan-task.md` Phase 8 |
|
||||||
|
| 리뷰 상태 | 판정 완료 |
|
||||||
|
|
||||||
|
## 2. 리뷰 목적과 범위
|
||||||
|
|
||||||
|
- 후원 empty count bar와 홈·후원 공용 can badge 수정이 Phase 8 계약을 충족하는지 확인한다.
|
||||||
|
- `CreatorChannelDonationTabView.swift`, `CreatorChannelDonationCard.swift`와 홈 탭 공용 호출부를 검토한다.
|
||||||
|
- 사용자 요청에 따라 visual QA와 Simulator 수동 검증은 제외한다.
|
||||||
|
|
||||||
|
## 3. 판정 기준
|
||||||
|
|
||||||
|
- ranking-only 상태, 공용 카드 호출부, localized fallback, tier·상대 시간·메시지 규칙의 회귀를 차단 항목으로 판정한다.
|
||||||
|
- 관련 없는 리팩터링이나 범위 확장이 없는지 확인한다.
|
||||||
|
|
||||||
|
## 4. 검토한 근거
|
||||||
|
|
||||||
|
| 명령 또는 검증 | 결과 | 핵심 증거 |
|
||||||
|
|---|---|---|
|
||||||
|
| Phase 8 `rg` 정적 계약 | 성공 | non-empty guard, 숫자 can badge, 공용 호출부와 `defaultMessage` 확인 |
|
||||||
|
| `git diff --check` | 성공 | 출력 없음, exit code 0 |
|
||||||
|
| `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` | 성공 | `** BUILD SUCCEEDED **` |
|
||||||
|
| 독립 사양 리뷰 | 승인 | Phase 8 요구사항 및 보존 조건 충족 |
|
||||||
|
| 독립 코드 품질 리뷰 | 승인 | 차단 회귀·품질 문제 없음 |
|
||||||
|
|
||||||
|
## 5. 발견 사항 요약
|
||||||
|
|
||||||
|
확정 발견 사항 없음.
|
||||||
|
|
||||||
|
## 6. 발견 사항 상세
|
||||||
|
|
||||||
|
해당 없음.
|
||||||
|
|
||||||
|
## 7. 확정 항목의 plan·goal 전환
|
||||||
|
|
||||||
|
전환 항목 없음.
|
||||||
|
|
||||||
|
## 8. 리뷰 종료 판정
|
||||||
|
|
||||||
|
| 판정 항목 | 결과 | 근거 |
|
||||||
|
|---|---|---|
|
||||||
|
| 리뷰 범위 전체 확인 | 충족 | 변경 파일 전체와 직접 계약 확인 |
|
||||||
|
| 후보 항목 판정 완료 | 충족 | 후보 및 확정 발견 사항 없음 |
|
||||||
|
| 확정 항목 plan 반영 | 해당 없음 | 확정 발견 사항 없음 |
|
||||||
|
| 검증 명령과 결과 기록 | 충족 | 정적 계약, diff check, Debug 빌드 기록 |
|
||||||
|
|
||||||
|
**최종 결론:** 확정 발견 사항 없음
|
||||||
|
|
||||||
|
**남은 항목:** 사용자 수동 화면 확인 3개
|
||||||
Reference in New Issue
Block a user