feat(creator): 팔로워 목록 이동을 연결한다
This commit is contained in:
@@ -4,6 +4,7 @@ import Kingfisher
|
|||||||
struct CreatorChannelHeaderSection: View {
|
struct CreatorChannelHeaderSection: View {
|
||||||
let creator: CreatorChannelCreatorResponse
|
let creator: CreatorChannelCreatorResponse
|
||||||
let isOwnCreatorChannel: Bool
|
let isOwnCreatorChannel: Bool
|
||||||
|
let onTapFollowerCount: () -> Void
|
||||||
let onTapTalk: () -> Void
|
let onTapTalk: () -> Void
|
||||||
let onTapDm: () -> Void
|
let onTapDm: () -> Void
|
||||||
|
|
||||||
@@ -46,6 +47,7 @@ struct CreatorChannelHeaderSection: View {
|
|||||||
.appFont(size: 16, weight: .medium)
|
.appFont(size: 16, weight: .medium)
|
||||||
.foregroundColor(.white)
|
.foregroundColor(.white)
|
||||||
.multilineTextAlignment(.center)
|
.multilineTextAlignment(.center)
|
||||||
|
.onTapGesture(perform: onTapFollowerCount)
|
||||||
|
|
||||||
Text(creator.nickname)
|
Text(creator.nickname)
|
||||||
.appFont(size: 32, weight: .bold)
|
.appFont(size: 32, weight: .bold)
|
||||||
|
|||||||
@@ -237,6 +237,11 @@ struct CreatorChannelView: View {
|
|||||||
CreatorChannelHeaderSection(
|
CreatorChannelHeaderSection(
|
||||||
creator: creator,
|
creator: creator,
|
||||||
isOwnCreatorChannel: isOwnCreatorChannel,
|
isOwnCreatorChannel: isOwnCreatorChannel,
|
||||||
|
onTapFollowerCount: {
|
||||||
|
if isOwnCreatorChannel {
|
||||||
|
AppState.shared.setAppStep(step: .followerList(userId: creator.creatorId))
|
||||||
|
}
|
||||||
|
},
|
||||||
onTapTalk: handleTalkTap,
|
onTapTalk: handleTalkTap,
|
||||||
onTapDm: handleDmTap
|
onTapDm: handleDmTap
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -817,3 +817,36 @@
|
|||||||
- 기대 결과: `** BUILD SUCCEEDED **`.
|
- 기대 결과: `** BUILD SUCCEEDED **`.
|
||||||
|
|
||||||
- 2026-07-20: Phase 21 구현을 완료했다. `CreatorChannelDonationSection`의 기존 고정 `374pt` 카드 너비를 `374 × min(deviceWidth / 402, 1)` 계산값으로 교체해 `402pt` 이상에서는 기존 너비를 유지하고 작은 디바이스에서만 비례 축소되도록 했다. `swift -module-cache-path /tmp/sodalive-swift-module-cache -e 'import Foundation; let widths = [320.0, 375.0, 402.0, 430.0]; print(widths.map { 374.0 * min($0 / 402.0, 1.0) })'` 실행 결과는 `[297.71144278606965, 348.8805970149254, 374.0, 374.0]`이었다. `rg`로 계산식 적용 위치를 확인했고 `git diff --check`를 통과했다. `xcodebuild -workspace SodaLive.xcworkspace -scheme SodaLive-dev -configuration Debug -destination 'platform=iOS Simulator,id=224FBAAE-B5C7-4A10-9143-3944A3280E48' -derivedDataPath /tmp/sodalive-shell-derived-escalated build`는 `** BUILD SUCCEEDED **`로 완료됐다. 프로젝트에 테스트 번들 타깃이 없어 별도 단위 테스트는 실행하지 않았다.
|
- 2026-07-20: Phase 21 구현을 완료했다. `CreatorChannelDonationSection`의 기존 고정 `374pt` 카드 너비를 `374 × min(deviceWidth / 402, 1)` 계산값으로 교체해 `402pt` 이상에서는 기존 너비를 유지하고 작은 디바이스에서만 비례 축소되도록 했다. `swift -module-cache-path /tmp/sodalive-swift-module-cache -e 'import Foundation; let widths = [320.0, 375.0, 402.0, 430.0]; print(widths.map { 374.0 * min($0 / 402.0, 1.0) })'` 실행 결과는 `[297.71144278606965, 348.8805970149254, 374.0, 374.0]`이었다. `rg`로 계산식 적용 위치를 확인했고 `git diff --check`를 통과했다. `xcodebuild -workspace SodaLive.xcworkspace -scheme SodaLive-dev -configuration Debug -destination 'platform=iOS Simulator,id=224FBAAE-B5C7-4A10-9143-3944A3280E48' -derivedDataPath /tmp/sodalive-shell-derived-escalated build`는 `** BUILD SUCCEEDED **`로 완료됐다. 프로젝트에 테스트 번들 타깃이 없어 별도 단위 테스트는 실행하지 않았다.
|
||||||
|
|
||||||
|
### Phase 22: 내 채널 팔로워 목록 레거시 연결
|
||||||
|
|
||||||
|
- [x] **Task 22.1: 헤더 팔로워 수 탭 라우팅 연결**
|
||||||
|
- 대상 파일:
|
||||||
|
- 수정: `SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelHeaderSection.swift`
|
||||||
|
- 수정: `SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift`
|
||||||
|
- 확인: `SodaLive/Sources/ContentView.swift`
|
||||||
|
- 확인: `SodaLive/Sources/Explorer/Profile/FollowerList/FollowerListView.swift`
|
||||||
|
- 작업 내용:
|
||||||
|
- `CreatorChannelHeaderSection`에 `onTapFollowerCount` closure를 추가한다.
|
||||||
|
- 헤더의 `I18n.CreatorChannelHome.followerCount(creator.followerCount.comma())` 텍스트에 tap gesture를 연결한다.
|
||||||
|
- `CreatorChannelView`에서 내 채널일 때만 `AppState.shared.setAppStep(step: .followerList(userId: creator.creatorId))`를 호출한다.
|
||||||
|
- 새 V2 팔로워 목록 화면, 새 route, 새 API를 만들지 않는다.
|
||||||
|
- 검증 기준:
|
||||||
|
- 실행 명령: `rg -n "onTapFollowerCount|followerList\(userId: creator\.creatorId\)|FollowerListView\(userId:" SodaLive/Sources/V2/CreatorChannel SodaLive/Sources/ContentView.swift`
|
||||||
|
- 기대 결과: 헤더 콜백, 내 채널 레거시 라우팅, 기존 `FollowerListView` destination이 확인된다.
|
||||||
|
|
||||||
|
- [x] **Task 22.2: 정적 검사와 Debug 빌드 검증**
|
||||||
|
- 대상 파일:
|
||||||
|
- 확인: `SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelHeaderSection.swift`
|
||||||
|
- 확인: `SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift`
|
||||||
|
- 작업 내용:
|
||||||
|
- 변경 전 RED로 라우팅 계약 검색이 실패함을 확인한다.
|
||||||
|
- 변경 후 같은 검색이 성공하는지 확인한다.
|
||||||
|
- whitespace 오류를 확인하고 공식 Debug 빌드를 실행한다.
|
||||||
|
- 검증 기준:
|
||||||
|
- 실행 명령: `git diff --check`
|
||||||
|
- 기대 결과: 출력 없이 exit code 0이다.
|
||||||
|
- 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build`
|
||||||
|
- 기대 결과: `** BUILD SUCCEEDED **`.
|
||||||
|
|
||||||
|
- 2026-08-03: Phase 22 구현을 완료했다. RED 확인으로 `rg -n "CreatorChannelHeaderSection\(|onTapFollowerCount|followerList\(userId: creator\.creatorId\)|followerCount\(creator\.followerCount\.comma\(\)\)" "SodaLive/Sources/V2/CreatorChannel"`를 먼저 실행해 헤더 생성과 팔로워 수 표시만 있고 `onTapFollowerCount` 및 `.followerList(userId: creator.creatorId)` 연결이 없음을 확인했다. `CreatorChannelHeaderSection`에는 `onTapFollowerCount` closure와 팔로워 수 텍스트 tap gesture만 추가했고, `CreatorChannelView`에서는 내 채널일 때만 `AppState.shared.setAppStep(step: .followerList(userId: creator.creatorId))`를 호출하도록 연결했다. GREEN 확인으로 `rg -n "onTapFollowerCount|followerList\(userId: creator\.creatorId\)|FollowerListView\(userId:" "SodaLive/Sources/V2/CreatorChannel" "SodaLive/Sources/ContentView.swift"`가 헤더 콜백, 내 채널 라우팅, 기존 `FollowerListView` destination을 모두 찾았다. `git diff --check`는 출력 없이 통과했고, `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build`는 `** BUILD SUCCEEDED **`로 완료됐다. 프로젝트에 테스트 번들 타깃이 없어 XCTest는 추가/실행하지 못했고, 로그인된 내 채널 계정이 필요한 실제 기기 탭 수동 검증은 수행하지 않았다.
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ Figma 전체 화면 기준 공통 shell은 아래를 따른다.
|
|||||||
- 후속 버그(2026-07-20): `.liveReplay`는 다시 듣기 카테고리의 업로드 콘텐츠이고 `targetId`도 콘텐츠 ID이지만, 현재 크리에이터 채널과 메인 스케줄 분기에서는 `.live`와 함께 처리되어 라이브 진입 경로로 잘못 전달된다. `.liveReplay`의 상세 화면은 `.audio`와 동일한 오디오 콘텐츠 상세 화면이다.
|
- 후속 버그(2026-07-20): `.liveReplay`는 다시 듣기 카테고리의 업로드 콘텐츠이고 `targetId`도 콘텐츠 ID이지만, 현재 크리에이터 채널과 메인 스케줄 분기에서는 `.live`와 함께 처리되어 라이브 진입 경로로 잘못 전달된다. `.liveReplay`의 상세 화면은 `.audio`와 동일한 오디오 콘텐츠 상세 화면이다.
|
||||||
- 후속 버그(2026-07-20): `LiveDetailView`가 이미 종료된 라이브의 상세 조회 실패 응답을 받으면 `이미 종료된 라이브 입니다.` 토스트는 표시되지만 `LiveDetailView` overlay가 닫히지 않아 DIM 배경이 화면에 남는다.
|
- 후속 버그(2026-07-20): `LiveDetailView`가 이미 종료된 라이브의 상세 조회 실패 응답을 받으면 `이미 종료된 라이브 입니다.` 토스트는 표시되지만 `LiveDetailView` overlay가 닫히지 않아 DIM 배경이 화면에 남는다.
|
||||||
- 후속 UI 보정(2026-07-20): 채널 홈 후원 섹션의 카드 너비가 `374pt`로 고정되어 있어 디바이스 너비가 `402pt`보다 작은 화면에서는 기준 디자인과 같은 비율을 유지하지 못한다.
|
- 후속 UI 보정(2026-07-20): 채널 홈 후원 섹션의 카드 너비가 `374pt`로 고정되어 있어 디바이스 너비가 `402pt`보다 작은 화면에서는 기준 디자인과 같은 비율을 유지하지 못한다.
|
||||||
|
- 후속 연결(2026-08-03): 내 채널의 헤더 팔로워 수(`팔로워 n명`)는 표시만 되고 있어, 사용자가 자신을 팔로우하는 유저 목록으로 바로 이동할 수 없다.
|
||||||
|
|
||||||
## 3. Goals
|
## 3. Goals
|
||||||
- `creatorId`로 `GET /api/v2/creator-channels/{creatorId}/home`을 호출하고 응답 데이터로 크리에이터 채널 공통 shell과 홈 탭 콘텐츠를 구성한다.
|
- `creatorId`로 `GET /api/v2/creator-channels/{creatorId}/home`을 호출하고 응답 데이터로 크리에이터 채널 공통 shell과 홈 탭 콘텐츠를 구성한다.
|
||||||
@@ -59,6 +60,7 @@ Figma 전체 화면 기준 공통 shell은 아래를 따른다.
|
|||||||
- `.liveReplay` 스케줄 항목을 누르면 `targetId`를 콘텐츠 ID로 사용해 `.audio`와 동일한 기존 오디오 콘텐츠 상세 페이지로 이동한다.
|
- `.liveReplay` 스케줄 항목을 누르면 `targetId`를 콘텐츠 ID로 사용해 `.audio`와 동일한 기존 오디오 콘텐츠 상세 페이지로 이동한다.
|
||||||
- 이미 종료된 라이브의 `LiveDetailView`를 열면 `이미 종료된 라이브 입니다.` 토스트를 표시하고 `LiveDetailView`/DIM overlay를 닫아 진입 전 화면을 유지한다.
|
- 이미 종료된 라이브의 `LiveDetailView`를 열면 `이미 종료된 라이브 입니다.` 토스트를 표시하고 `LiveDetailView`/DIM overlay를 닫아 진입 전 화면을 유지한다.
|
||||||
- 채널 홈 후원 섹션 카드 너비는 디바이스 너비가 `402pt` 이상이면 `374pt`를 유지하고, `402pt` 미만이면 디바이스 너비에 비례해 축소한다.
|
- 채널 홈 후원 섹션 카드 너비는 디바이스 너비가 `402pt` 이상이면 `374pt`를 유지하고, `402pt` 미만이면 디바이스 너비에 비례해 축소한다.
|
||||||
|
- 내 채널에서 헤더의 팔로워 수를 누르면 신규 V2 화면을 만들지 않고 기존 `AppStep.followerList(userId:)` 레거시 화면으로 이동한다.
|
||||||
|
|
||||||
## 4. Non-Goals
|
## 4. Non-Goals
|
||||||
- `화보` 탭과 화보 섹션은 구현하지 않는다.
|
- `화보` 탭과 화보 섹션은 구현하지 않는다.
|
||||||
@@ -423,6 +425,8 @@ Figma 참조:
|
|||||||
- 이미 종료된 라이브 상세 조회 실패 시 `AppState.liveDetailSheet` 또는 각 화면의 `LiveDetailView` 표시 상태가 해제되어 DIM 배경이 남지 않는다.
|
- 이미 종료된 라이브 상세 조회 실패 시 `AppState.liveDetailSheet` 또는 각 화면의 `LiveDetailView` 표시 상태가 해제되어 DIM 배경이 남지 않는다.
|
||||||
- 채널 홈 후원 섹션 카드 너비는 `402pt` 이상의 디바이스에서 `374pt`이고, `402pt` 미만에서는 `374 × deviceWidth / 402`로 계산된다.
|
- 채널 홈 후원 섹션 카드 너비는 `402pt` 이상의 디바이스에서 `374pt`이고, `402pt` 미만에서는 `374 × deviceWidth / 402`로 계산된다.
|
||||||
- 후원 카드의 높이, 내부 콘텐츠, 패딩, 카드 간격 및 후원 탭 세로 목록 레이아웃은 기존 상태를 유지한다.
|
- 후원 카드의 높이, 내부 콘텐츠, 패딩, 카드 간격 및 후원 탭 세로 목록 레이아웃은 기존 상태를 유지한다.
|
||||||
|
- 내 채널의 헤더 팔로워 수를 누르면 `FollowerListView(userId: creatorId)`로 이동한다.
|
||||||
|
- 다른 사람 채널에서는 헤더 팔로워 수 탭으로 팔로워 목록에 이동하지 않는다.
|
||||||
|
|
||||||
## 11. Open Questions
|
## 11. Open Questions
|
||||||
해당 없음.
|
해당 없음.
|
||||||
@@ -444,3 +448,4 @@ Figma 참조:
|
|||||||
- 2026-07-20: 크리에이터 채널 스케줄의 라이브 예약 항목 tap은 `CreatorChannelView.handleScheduleTap`에서 `AppState.setAppStep(.liveDetail)`까지 정상 전달되지만, `LiveDetailView`가 `NavigationStack` 루트 콘텐츠 내부에 있어 destination인 `CreatorChannelView` 뒤에 렌더링되는 표시 계층 버그를 확인했다. 기존 전역 상태와 callback은 유지하고 `ContentView` 외부 overlay로 렌더 호스트만 이동하는 최소 수정안을 확정했다.
|
- 2026-07-20: 크리에이터 채널 스케줄의 라이브 예약 항목 tap은 `CreatorChannelView.handleScheduleTap`에서 `AppState.setAppStep(.liveDetail)`까지 정상 전달되지만, `LiveDetailView`가 `NavigationStack` 루트 콘텐츠 내부에 있어 destination인 `CreatorChannelView` 뒤에 렌더링되는 표시 계층 버그를 확인했다. 기존 전역 상태와 callback은 유지하고 `ContentView` 외부 overlay로 렌더 호스트만 이동하는 최소 수정안을 확정했다.
|
||||||
- 2026-07-20: 사용자 확인에 따라 기존 루트 `ZStack`의 `liveDetailSheet` 분기를 외부 overlay에 복제하지 않고 이동하며, 이동 후 불필요해진 기존 위치의 분기를 제거하는 것으로 범위를 명확히 했다.
|
- 2026-07-20: 사용자 확인에 따라 기존 루트 `ZStack`의 `liveDetailSheet` 분기를 외부 overlay에 복제하지 않고 이동하며, 이동 후 불필요해진 기존 위치의 분기를 제거하는 것으로 범위를 명확히 했다.
|
||||||
- 2026-07-20: 사용자 확인에 따라 `LiveDetailView` 표시 대상은 `.live`로 한정했다. `.liveReplay`는 다시 듣기 카테고리의 업로드 콘텐츠이므로 `.audio`와 동일한 오디오 콘텐츠 상세 화면으로 이동하며, 현재 두 스케줄 handler에서 `.live`와 묶인 분기를 각각 수정 대상으로 추가했다.
|
- 2026-07-20: 사용자 확인에 따라 `LiveDetailView` 표시 대상은 `.live`로 한정했다. `.liveReplay`는 다시 듣기 카테고리의 업로드 콘텐츠이므로 `.audio`와 동일한 오디오 콘텐츠 상세 화면으로 이동하며, 현재 두 스케줄 handler에서 `.live`와 묶인 분기를 각각 수정 대상으로 추가했다.
|
||||||
|
- 2026-08-03: 사용자 요청에 따라 내 채널의 헤더 팔로워 수를 기존 레거시 `FollowerListView`로 연결하는 범위를 추가했다. 요청 문구의 `팔로잉 n명`은 현재 UI와 API 계약상 `팔로워 n명`, 즉 해당 채널을 팔로우하는 사용자 목록으로 해석한다.
|
||||||
|
|||||||
Reference in New Issue
Block a user