docs(creator): 최종 검증 기록을 갱신한다

This commit is contained in:
Yu Sung
2026-07-03 19:34:24 +09:00
parent b84098b15e
commit ca5432532e
2 changed files with 54 additions and 52 deletions

View File

@@ -15,8 +15,8 @@
- API, Response model, Repository, ViewModel을 먼저 구현한 뒤 UI phase를 진행한다. - API, Response model, Repository, ViewModel을 먼저 구현한 뒤 UI phase를 진행한다.
- 크리에이터 채널 진입점은 `CreatorChannelView`로 두고, 최초 선택 tab은 `.home`으로 둔다. - 크리에이터 채널 진입점은 `CreatorChannelView`로 두고, 최초 선택 tab은 `.home`으로 둔다.
- `CreatorChannelView`는 title bar, 크리에이터 프로필 header, tab-bar, 선택된 tab 상태, 홈 API 호출 상태를 소유한다. - `CreatorChannelView`는 title bar, 크리에이터 프로필 header, tab-bar, 선택된 tab 상태, 홈 API 호출 상태를 소유한다.
- `CreatorChannelHomeView`는 tab-bar 아래 홈 탭 콘텐츠만 렌더링한다. - `CreatorChannelHomeView`는 tab-bar 아래 홈 탭 콘텐츠만 렌더링하며, 대화하기 action은 최신 코드 기준처럼 `CreatorChannelHeaderSection` 내부에서 렌더링한다.
- 홈 API 응답의 `creator` 정보는 공통 shell의 header/title/follow/notification 상태와 홈 탭의 대화하기 action 상태가 공유한다. - 홈 API 응답의 `creator` 정보는 공통 shell의 header/title/follow/notification/대화하기 action 상태가 공유한다.
- 크리에이터 채널 공통 shell 구현은 `SodaLive/Sources/V2/CreatorChannel/**` 아래에 둔다. - 크리에이터 채널 공통 shell 구현은 `SodaLive/Sources/V2/CreatorChannel/**` 아래에 둔다.
- 크리에이터 채널 홈 탭 내부에서만 쓰는 UI는 `SodaLive/Sources/V2/CreatorChannel/Home/Components/**` 아래에 둔다. - 크리에이터 채널 홈 탭 내부에서만 쓰는 UI는 `SodaLive/Sources/V2/CreatorChannel/Home/Components/**` 아래에 둔다.
- 크리에이터 채널 공통 shell 내부에서만 쓰는 UI는 `SodaLive/Sources/V2/CreatorChannel/Components/**` 아래에 둔다. - 크리에이터 채널 공통 shell 내부에서만 쓰는 UI는 `SodaLive/Sources/V2/CreatorChannel/Components/**` 아래에 둔다.
@@ -28,7 +28,7 @@
- `화보` 탭, 화보 섹션, 활동의 화보 row는 구현하지 않는다. - `화보` 탭, 화보 섹션, 활동의 화보 row는 구현하지 않는다.
- DM 버튼과 DM 진입은 구현하지 않는다. - DM 버튼과 DM 진입은 구현하지 않는다.
- Figma localhost asset URL은 앱 코드에 사용하지 않는다. - Figma localhost asset URL은 앱 코드에 사용하지 않는다.
- title bar 아이콘은 `ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_fill` asset을 사용한다. - title bar 아이콘은 `ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_colored` asset을 사용한다.
- SNS 아이콘은 `ic_sns_instagram`, `ic_sns_youtube`, `ic_sns_x`, `ic_sns_kakao`, `ic_sns_fancimm` asset을 사용한다. - SNS 아이콘은 `ic_sns_instagram`, `ic_sns_youtube`, `ic_sns_x`, `ic_sns_kakao`, `ic_sns_fancimm` asset을 사용한다.
- 기존 `AppStep.creatorDetail(userId:)` 진입은 새 크리에이터 채널 화면으로 연결한다. - 기존 `AppStep.creatorDetail(userId:)` 진입은 새 크리에이터 채널 화면으로 연결한다.
@@ -222,9 +222,9 @@
- 기존 `CreatorChannelHomeViewModel`의 홈 API 호출/공통 상태 책임은 `CreatorChannelViewModel`로 이동하고, 남는 책임이 없으면 파일을 제거한다. - 기존 `CreatorChannelHomeViewModel`의 홈 API 호출/공통 상태 책임은 `CreatorChannelViewModel`로 이동하고, 남는 책임이 없으면 파일을 제거한다.
- title bar의 팔로우/팔로우 취소/알림 설정/알림 설정 취소는 기존 `UserProfile` 현재 UI 흐름과 동일하게 `UserRepository.creatorFollow(creatorId:follow:notify:)`를 사용한다. - title bar의 팔로우/팔로우 취소/알림 설정/알림 설정 취소는 기존 `UserProfile` 현재 UI 흐름과 동일하게 `UserRepository.creatorFollow(creatorId:follow:notify:)`를 사용한다.
- 팔로우는 `creatorFollow(follow: true, notify: true)`, 팔로우 취소는 `creatorFollow(follow: false, notify: false)`로 호출한다. - 팔로우는 `creatorFollow(follow: true, notify: true)`, 팔로우 취소는 `creatorFollow(follow: false, notify: false)`로 호출한다.
- `ic_bar_bell` 터치 시 `creatorFollow(follow: true, notify: true)`, `ic_bar_bell_fill` 터치 시 `creatorFollow(follow: true, notify: false)`로 호출한다. - `ic_bar_bell` 터치 시 `creatorFollow(follow: true, notify: true)`, `ic_bar_bell_colored` 터치 시 `creatorFollow(follow: true, notify: false)`로 호출한다.
- `CreatorChannelHomeTab``CreatorChannelTab`으로 이름을 바꾸고 공통 shell 경로로 이동한다. - `CreatorChannelHomeTab``CreatorChannelTab`으로 이름을 바꾸고 공통 shell 경로로 이동한다.
- `CreatorChannelHomeView``CreatorChannelHomeResponse`와 tab 전환 closure를 주입받아 tab-bar 아래 홈 탭 콘텐츠만 렌더링한다. - `CreatorChannelHomeView``CreatorChannelHomeResponse`와 tab 전환 closure를 주입받아 tab-bar 아래 홈 탭 콘텐츠만 렌더링하고, 대화하기 action은 `CreatorChannelHeaderSection`에 유지한다.
- API 실패 placeholder 상태에서는 `CreatorChannelView`가 서버 데이터 없이 가능한 title bar, tab-bar, 선택된 tab placeholder를 유지한다. - API 실패 placeholder 상태에서는 `CreatorChannelView`가 서버 데이터 없이 가능한 title bar, tab-bar, 선택된 tab placeholder를 유지한다.
- 검증 기준: - 검증 기준:
- 실행 명령: `rg "struct CreatorChannelView|final class CreatorChannelViewModel|enum CreatorChannelTab|CreatorChannelView\\(creatorId: userId\\)|CreatorChannelHomeView\\(|selectedTab|fetchHome\\(creatorId:|creatorFollow\\(.*follow: true, notify: true|creatorFollow\\(.*follow: false, notify: false|creatorFollow\\(.*follow: true, notify: false" SodaLive/Sources/V2/CreatorChannel SodaLive/Sources/ContentView.swift` - 실행 명령: `rg "struct CreatorChannelView|final class CreatorChannelViewModel|enum CreatorChannelTab|CreatorChannelView\\(creatorId: userId\\)|CreatorChannelHomeView\\(|selectedTab|fetchHome\\(creatorId:|creatorFollow\\(.*follow: true, notify: true|creatorFollow\\(.*follow: false, notify: false|creatorFollow\\(.*follow: true, notify: false" SodaLive/Sources/V2/CreatorChannel SodaLive/Sources/ContentView.swift`
@@ -243,18 +243,18 @@
- `isFollow == false`이면 `팔로우` capsule을 표시한다. - `isFollow == false`이면 `팔로우` capsule을 표시한다.
- `isFollow == false` 상태의 follow capsule에는 `ic_new_follow` asset을 사용한다. - `isFollow == false` 상태의 follow capsule에는 `ic_new_follow` asset을 사용한다.
- `isFollow == true` 상태의 following capsule에는 `ic_new_following` asset을 사용한다. - `isFollow == true` 상태의 following capsule에는 `ic_new_following` asset을 사용한다.
- `isFollow == true && isNotify == true`이면 팔로잉 상태 capsule과 알림 설정 아이콘 `ic_bar_bell_fill` 표시한다. - `isFollow == true && isNotify == true`이면 팔로잉 상태 capsule과 알림 설정 아이콘 `ic_bar_bell_colored` 표시한다.
- `isFollow == true && isNotify == false`이면 팔로잉 상태 capsule과 알림 해제 아이콘 `ic_bar_bell`을 표시한다. - `isFollow == true && isNotify == false`이면 팔로잉 상태 capsule과 알림 해제 아이콘 `ic_bar_bell`을 표시한다.
- `ic_new_follow` 터치 시 부모의 팔로우 action으로 `creatorFollow(follow: true, notify: true)`가 호출되도록 연결한다. - `ic_new_follow` 터치 시 부모의 팔로우 action으로 `creatorFollow(follow: true, notify: true)`가 호출되도록 연결한다.
- `ic_new_following` 터치 시 부모의 팔로우 취소 action으로 `creatorFollow(follow: false, notify: false)`가 호출되도록 연결한다. - `ic_new_following` 터치 시 부모의 팔로우 취소 action으로 `creatorFollow(follow: false, notify: false)`가 호출되도록 연결한다.
- `ic_bar_bell` 터치 시 부모의 알림 설정 action으로 `creatorFollow(follow: true, notify: true)`가 호출되도록 연결한다. - `ic_bar_bell` 터치 시 부모의 알림 설정 action으로 `creatorFollow(follow: true, notify: true)`가 호출되도록 연결한다.
- `ic_bar_bell_fill` 터치 시 부모의 알림 설정 취소 action으로 `creatorFollow(follow: true, notify: false)`가 호출되도록 연결한다. - `ic_bar_bell_colored` 터치 시 부모의 알림 설정 취소 action으로 `creatorFollow(follow: true, notify: false)`가 호출되도록 연결한다.
- 더보기 버튼은 항상 표시한다. - 더보기 버튼은 항상 표시한다.
- 배경 opacity는 외부에서 전달받는 `backgroundProgress`로 제어한다. - 배경 opacity는 외부에서 전달받는 `backgroundProgress`로 제어한다.
- 구현 기준은 Figma `296:14287`, `296:14288`, `296:14289` 3개 title bar 상태를 따른다. - 구현 기준은 Figma `296:14287`, `296:14288`, `296:14289` 3개 title bar 상태를 따른다.
- title bar 아이콘은 `ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_fill` 외 다른 asset으로 대체하지 않는다. - title bar 아이콘은 `ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_colored` 외 다른 asset으로 대체하지 않는다.
- 검증 기준: - 검증 기준:
- 실행 명령: `rg "struct CreatorChannelTitleBar|isFollow|isNotify|backgroundProgress|onTapBack|onTapFollow|onTapUnfollow|onTapNotify|onTapUnnotify|onTapMore|ic_new_bar_back|ic_new_follow|ic_new_following|ic_new_more|ic_bar_bell|ic_bar_bell_fill|팔로우" SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelTitleBar.swift` - 실행 명령: `rg "struct CreatorChannelTitleBar|isFollow|isNotify|backgroundProgress|onTapBack|onTapFollow|onTapUnfollow|onTapNotify|onTapUnnotify|onTapMore|ic_new_bar_back|ic_new_follow|ic_new_following|ic_new_more|ic_bar_bell|ic_bar_bell_colored|팔로우" SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelTitleBar.swift`
- 기대 결과: Figma 3개 title bar 상태를 표현하는 조건 분기, 지정된 6개 icon asset 사용, 팔로우/팔로우 취소/알림 설정/알림 설정 취소 tap closure가 확인된다. - 기대 결과: Figma 3개 title bar 상태를 표현하는 조건 분기, 지정된 6개 icon asset 사용, 팔로우/팔로우 취소/알림 설정/알림 설정 취소 tap closure가 확인된다.
- [x] **Task 3.2: 크리에이터 이미지/프로필 헤더 생성** - [x] **Task 3.2: 크리에이터 이미지/프로필 헤더 생성**
@@ -551,7 +551,7 @@
- 버튼은 영역 중앙에 배치한다. - 버튼은 영역 중앙에 배치한다.
- 버튼이 없어도 영역 높이와 vertical spacing을 유지한다. - 버튼이 없어도 영역 높이와 vertical spacing을 유지한다.
- `isDmAvailable``ic_new_dm`은 이번 UI에 사용하지 않는다. - `isDmAvailable``ic_new_dm`은 이번 UI에 사용하지 않는다.
- 버튼 tap은 부모에서 주입받은 `onTapTalk` closure로 전달한다. - 버튼 tap은 `CreatorChannelHeaderSection` 부모에서 주입받은 `onTapTalk` closure로 전달한다.
- 검증 기준: - 검증 기준:
- 실행 명령: `rg "struct CreatorChannelTalkActionSection|isAiChatAvailable|ic_new_talk|ic_new_dm|frame\\(height|onTapTalk" SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelTalkActionSection.swift` - 실행 명령: `rg "struct CreatorChannelTalkActionSection|isAiChatAvailable|ic_new_talk|ic_new_dm|frame\\(height|onTapTalk" SodaLive/Sources/V2/CreatorChannel/Home/Components/CreatorChannelTalkActionSection.swift`
- 기대 결과: 대화하기만 조건부 표시되고 DM 버튼 구현이 없다. - 기대 결과: 대화하기만 조건부 표시되고 DM 버튼 구현이 없다.
@@ -561,13 +561,13 @@
- 수정: `SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift` - 수정: `SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift`
- 수정: `SodaLive/Sources/V2/CreatorChannel/CreatorChannelViewModel.swift` - 수정: `SodaLive/Sources/V2/CreatorChannel/CreatorChannelViewModel.swift`
- 수정: `SodaLive/Sources/V2/CreatorChannel/Home/Repository/CreatorChannelHomeRepository.swift` - 수정: `SodaLive/Sources/V2/CreatorChannel/Home/Repository/CreatorChannelHomeRepository.swift`
- 수정: `SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift` - 수정: `SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelHeaderSection.swift`
- 확인: `SodaLive/Sources/Chat/Character/Detail/CharacterDetailView.swift` - 확인: `SodaLive/Sources/Chat/Character/Detail/CharacterDetailView.swift`
- 확인: `SodaLive/Sources/Chat/Character/Detail/CharacterDetailViewModel.swift` - 확인: `SodaLive/Sources/Chat/Character/Detail/CharacterDetailViewModel.swift`
- 확인: `SodaLive/Sources/Chat/ChatTabView.swift` - 확인: `SodaLive/Sources/Chat/ChatTabView.swift`
- 확인: `SodaLive/Sources/App/AppStep.swift` - 확인: `SodaLive/Sources/App/AppStep.swift`
- 작업 내용: - 작업 내용:
- `CreatorChannelView``CreatorChannelHomeView``onTapTalk` closure를 주입한다. - `CreatorChannelView``CreatorChannelHeaderSection``onTapTalk` closure를 주입한다.
- token이 없으면 `.login`으로 이동한다. - token이 없으면 `.login`으로 이동한다.
- 국가 코드를 trim/uppercase 처리하고, 비어 있거나 `KR`이면 한국으로 취급한다. - 국가 코드를 trim/uppercase 처리하고, 비어 있거나 `KR`이면 한국으로 취급한다.
- 한국 사용자는 `auth == false`일 때 기존 본인인증 confirm/fullScreenCover 흐름을 재사용하거나 같은 조건으로 연결한다. - 한국 사용자는 `auth == false`일 때 기존 본인인증 confirm/fullScreenCover 흐름을 재사용하거나 같은 조건으로 연결한다.
@@ -575,14 +575,14 @@
- 본인인증과 콘텐츠 보기 설정 guard를 통과하면 `creator.characterId``TalkApi.createChatRoom`을 호출하고, 성공 응답의 `chatRoomId``.chatRoom(id:)`에 바로 진입한다. - 본인인증과 콘텐츠 보기 설정 guard를 통과하면 `creator.characterId``TalkApi.createChatRoom`을 호출하고, 성공 응답의 `chatRoomId``.chatRoom(id:)`에 바로 진입한다.
- 본인인증 완료 후 실행되는 `pendingAction``.characterDetail(characterId:)`가 아니라 같은 채팅방 생성 후 `.chatRoom(id:)` 진입 helper를 사용한다. - 본인인증 완료 후 실행되는 `pendingAction``.characterDetail(characterId:)`가 아니라 같은 채팅방 생성 후 `.chatRoom(id:)` 진입 helper를 사용한다.
- 검증 기준: - 검증 기준:
- 실행 명령: `rg "onTapTalk|countryCode|uppercased\\(\\)|isKoreanCountry|auth == false|isShowAuthConfirmView|createChatRoom|chatRoom\\(id:|setAppStep\\(step: \\.login\\)" SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift SodaLive/Sources/V2/CreatorChannel/CreatorChannelViewModel.swift SodaLive/Sources/V2/CreatorChannel/Home/Repository/CreatorChannelHomeRepository.swift SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift` - 실행 명령: `rg "onTapTalk|countryCode|uppercased\\(\\)|isKoreanCountry|auth == false|isShowAuthConfirmView|createChatRoom|chatRoom\\(id:|setAppStep\\(step: \\.login\\)" SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift SodaLive/Sources/V2/CreatorChannel/CreatorChannelViewModel.swift SodaLive/Sources/V2/CreatorChannel/Home/Repository/CreatorChannelHomeRepository.swift SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelHeaderSection.swift`
- 기대 결과: 기존 AI 채팅 guard와 동일한 국가/본인인증 분기가 유지되고, guard 통과 후 캐릭터 상세가 아닌 채팅방으로 직접 이동한다. - 기대 결과: 기존 AI 채팅 guard와 동일한 국가/본인인증 분기가 유지되고, guard 통과 후 캐릭터 상세가 아닌 채팅방으로 직접 이동한다.
- 실행 명령: `rg "characterDetail\\(characterId: characterId\\)" SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift` - 실행 명령: `rg "characterDetail\\(characterId: characterId\\)" SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift`
- 기대 결과: 검색 결과가 없다. - 기대 결과: 검색 결과가 없다.
### Phase 18: 최종 조립과 검증 ### Phase 18: 최종 조립과 검증
- [ ] **Task 18.1: 홈 섹션 순서 조립** - [x] **Task 18.1: 홈 섹션 순서 조립**
- 대상 파일: - 대상 파일:
- 수정: `SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift` - 수정: `SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift`
- 수정: `SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift` - 수정: `SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift`
@@ -590,15 +590,16 @@
- `CreatorChannelView`에서 공통 shell 순서를 PRD와 동일하게 조립한다. - `CreatorChannelView`에서 공통 shell 순서를 PRD와 동일하게 조립한다.
- 공통 shell 배치: 크리에이터 이미지 header를 먼저 배치하고, title bar는 header 위에 overlay로 띄우며, 그 아래 tab-bar와 선택된 tab content를 배치한다. - 공통 shell 배치: 크리에이터 이미지 header를 먼저 배치하고, title bar는 header 위에 overlay로 띄우며, 그 아래 tab-bar와 선택된 tab content를 배치한다.
- title bar 기본 배경은 투명이고 scroll progress에 따라 black으로 전환된다. - title bar 기본 배경은 투명이고 scroll progress에 따라 black으로 전환된다.
- `CreatorChannelHomeView`에서 홈 탭 콘텐츠 순서를 PRD와 동일하게 조립한다. - 대화하기 액션은 최신 코드 기준처럼 `CreatorChannelHeaderSection` 내부에 유지한다.
- 홈 탭 콘텐츠 순서: 대화하기, 현재 라이브, 최신 오디오, 채널 후원, 공지, 스케줄, 오디오, 시리즈, 커뮤니티, 팬Talk, 소개, 활동, SNS. - `CreatorChannelHomeView`에서 홈 탭 콘텐츠 순서를 최신 코드 기준과 동일하게 조립한다.
- 홈 탭 콘텐츠 순서: 현재 라이브, 최신 오디오, 채널 후원, 공지, 스케줄, 오디오, 시리즈, 커뮤니티, 팬Talk, 소개, 활동, SNS.
- 각 섹션은 자신의 데이터가 없으면 숨긴다. - 각 섹션은 자신의 데이터가 없으면 숨긴다.
- API 실패 placeholder 상태에서는 데이터 기반 섹션을 표시하지 않는다. - API 실패 placeholder 상태에서는 데이터 기반 섹션을 표시하지 않는다.
- 검증 기준: - 검증 기준:
- 실행 명령: `rg -n "ZStack|overlay|Color\\.clear|backgroundProgress|CreatorChannelTitleBar|CreatorChannelHeaderSection|CreatorChannelTabBar|CreatorChannelHomeView|CreatorChannelTalkActionSection|CreatorChannelCurrentLiveSection|CreatorChannelLatestAudioSection|CreatorChannelDonationSection|CreatorChannelNoticeSection|CreatorChannelScheduleSection|CreatorChannelAudioSection|CreatorChannelSeriesSection|CreatorChannelCommunitySection|CreatorChannelFanTalkSection|CreatorChannelIntroduceSection|CreatorChannelActivitySection|CreatorChannelSnsSection" SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift` - 실행 명령: `rg -n "ZStack|overlay|Color\\.clear|backgroundProgress|CreatorChannelTitleBar|CreatorChannelHeaderSection|CreatorChannelTabBar|CreatorChannelHomeView|CreatorChannelTalkActionSection|CreatorChannelCurrentLiveSection|CreatorChannelLatestAudioSection|CreatorChannelDonationSection|CreatorChannelNoticeSection|CreatorChannelScheduleSection|CreatorChannelAudioSection|CreatorChannelSeriesSection|CreatorChannelCommunitySection|CreatorChannelFanTalkSection|CreatorChannelIntroduceSection|CreatorChannelActivitySection|CreatorChannelSnsSection" SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift SodaLive/Sources/V2/CreatorChannel/Home/CreatorChannelHomeView.swift`
- 기대 결과: PRD의 공통 shell 홈 탭 콘텐츠 순서대로 조립되어 있다. - 기대 결과: 최신 코드 기준의 공통 shell, header 대화하기 액션, 홈 탭 콘텐츠 순서대로 조립되어 있다.
- [ ] **Task 18.2: 프로젝트 파일 포함 여부 확인** - [x] **Task 18.2: 프로젝트 파일 포함 여부 확인**
- 대상 파일: - 대상 파일:
- 확인/필요 시 수정: `SodaLive.xcodeproj/project.pbxproj` - 확인/필요 시 수정: `SodaLive.xcodeproj/project.pbxproj`
- 작업 내용: - 작업 내용:
@@ -609,7 +610,7 @@
- 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` - 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build`
- 기대 결과: 신규 파일 누락으로 인한 compile error가 없다. - 기대 결과: 신규 파일 누락으로 인한 compile error가 없다.
- [ ] **Task 18.3: PRD 성공 기준 회귀 점검** - [x] **Task 18.3: PRD 성공 기준 회귀 점검**
- 대상 파일: - 대상 파일:
- 확인: `docs/20260701_크리에이터_채널_홈/prd.md` - 확인: `docs/20260701_크리에이터_채널_홈/prd.md`
- 확인: `SodaLive/Sources/V2/CreatorChannel/**` - 확인: `SodaLive/Sources/V2/CreatorChannel/**`
@@ -619,10 +620,10 @@
- `화보`, DM 버튼, API 실패 전체 error state가 구현에 들어가지 않았는지 검색한다. - `화보`, DM 버튼, API 실패 전체 error state가 구현에 들어가지 않았는지 검색한다.
- `ic_sns_*`, `ic_new_talk`, title bar icon asset, 기존 `UserProfile` 기준 follow/notify mutation, title bar/header overlay, AI 채팅 guard가 구현에 포함됐는지 검색한다. - `ic_sns_*`, `ic_new_talk`, title bar icon asset, 기존 `UserProfile` 기준 follow/notify mutation, title bar/header overlay, AI 채팅 guard가 구현에 포함됐는지 검색한다.
- 검증 기준: - 검증 기준:
- 실행 명령: `rg -n "화보|photo|ic_new_dm|DM|ic_new_talk|ic_sns_|ic_new_bar_back|ic_new_follow|ic_new_following|ic_new_more|ic_bar_bell|ic_bar_bell_fill|creatorFollow|follow: true, notify: true|follow: false, notify: false|follow: true, notify: false|onTapNotify|onTapUnnotify|ZStack|overlay|Color\\.clear|isApiFailedPlaceholderVisible|countryCode|auth == false" SodaLive/Sources/V2/CreatorChannel SodaLive/Sources/ContentView.swift` - 실행 명령: `rg -n "화보|photo|ic_new_dm|DM|ic_new_talk|ic_sns_|ic_new_bar_back|ic_new_follow|ic_new_following|ic_new_more|ic_bar_bell|ic_bar_bell_colored|creatorFollow|follow: true, notify: true|follow: false, notify: false|follow: true, notify: false|onTapNotify|onTapUnnotify|ZStack|overlay|Color\\.clear|isApiFailedPlaceholderVisible|countryCode|auth == false" SodaLive/Sources/V2/CreatorChannel SodaLive/Sources/ContentView.swift`
- 기대 결과: 제외 범위는 UI 구현에 없고, 필수 요구사항 키워드는 확인된다. - 기대 결과: 제외 범위는 UI 구현에 없고, 필수 요구사항 키워드는 확인된다.
- [ ] **Task 18.4: 빌드 검증** - [x] **Task 18.4: 빌드 검증**
- 대상 파일: - 대상 파일:
- 확인: `docs/agent-guides/build-test-verification.md` - 확인: `docs/agent-guides/build-test-verification.md`
- 작업 내용: - 작업 내용:
@@ -641,18 +642,19 @@
- 2026-07-01: 사용자 요청에 따라 기존 Phase 4 `대화하기 액션 영역`을 Phase 17로 이동하고, 기존 Phase 5~17을 Phase 4~16으로 한 칸씩 당겼다. - 2026-07-01: 사용자 요청에 따라 기존 Phase 4 `대화하기 액션 영역`을 Phase 17로 이동하고, 기존 Phase 5~17을 Phase 4~16으로 한 칸씩 당겼다.
- 2026-07-01: Header, TitleBar, TabBar만으로 sticky 동작을 먼저 확인할 수 있도록 Phase 3에 `CreatorChannelHomeView_Previews` 기반 debug-only sticky scaffold 검증 task를 추가했다. 2026-07-02 구조 변경으로 실제 검증 대상은 `CreatorChannelView_Previews`로 갱신했다. - 2026-07-01: Header, TitleBar, TabBar만으로 sticky 동작을 먼저 확인할 수 있도록 Phase 3에 `CreatorChannelHomeView_Previews` 기반 debug-only sticky scaffold 검증 task를 추가했다. 2026-07-02 구조 변경으로 실제 검증 대상은 `CreatorChannelView_Previews`로 갱신했다.
- 2026-07-01: Phase 1~2 구현을 완료하고 `rg` 체크리스트 및 `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 성공으로 신규 API/상태 모델, 라우팅, 기본 shell, I18n, 프로젝트 파일 포함을 검증했다. - 2026-07-01: Phase 1~2 구현을 완료하고 `rg` 체크리스트 및 `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 성공으로 신규 API/상태 모델, 라우팅, 기본 shell, I18n, 프로젝트 파일 포함을 검증했다.
- 2026-07-02: 사용자 확인 사항을 반영해 title bar, 크리에이터 프로필 header, tab-bar를 `CreatorChannelView` 공통 shell로 분리하고, `CreatorChannelHomeView`는 tab-bar 아래 홈 탭 콘텐츠만 담당하도록 PRD와 계획을 갱신했다. - 2026-07-02: 사용자 확인 사항과 최신 코드 기준을 반영해 title bar, 크리에이터 프로필 header, tab-bar를 `CreatorChannelView` 공통 shell로 분리하고, `CreatorChannelHomeView`는 tab-bar 아래 홈 탭 콘텐츠만 담당하며 대화하기 action은 `CreatorChannelHeaderSection` 내부에 유지하도록 PRD와 계획을 갱신했다.
- 2026-07-02: 이미 완료된 Phase 1~2 기록은 보존하고, 후속 구조 정리를 위해 Task 2.4 `공통 CreatorChannel shell로 구조 정리`를 추가했다. - 2026-07-02: 이미 완료된 Phase 1~2 기록은 보존하고, 후속 구조 정리를 위해 Task 2.4 `공통 CreatorChannel shell로 구조 정리`를 추가했다.
- 2026-07-02: 사용자 확인 사항을 반영해 title bar Figma URL 3종과 사용할 아이콘 asset(`ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_fill`)을 Task 3.1 및 최종 회귀 검색 기준에 추가했다. - 2026-07-02: 사용자 확인 사항과 최신 코드 기준을 반영해 title bar Figma URL 3종과 사용할 아이콘 asset(`ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_colored`)을 Task 3.1 및 최종 회귀 검색 기준에 추가했다.
- 2026-07-03: Phase 5 현재 라이브 섹션을 구현했다. Figma `290:8950` 기준으로 LIVE pill, 시작 시간, 제목, 커버 이미지/placeholder, 유료 캔 배지, 성인 표시를 반영하고 `CreatorChannelHomeView``currentLive` optional 기반으로 연결했다. - 2026-07-03: Phase 5 현재 라이브 섹션을 구현했다. Figma `290:8950` 기준으로 LIVE pill, 시작 시간, 제목, 커버 이미지/placeholder, 유료 캔 배지, 성인 표시를 반영하고 `CreatorChannelHomeView``currentLive` optional 기반으로 연결했다.
- 2026-07-03: Phase 7 채널 후원 섹션을 구현했다. Figma `296:14908`, 후원 아이템 `567:17927` 기준으로 후원 금액별 상단 컬러(`1...50` `#E2E2E2`, `51...100` `#73EE01`, `101...500` `#00EAFF`, `501...` `#FF4C3C`), `ic_new_donation` 후원하기 버튼, `.donation` tab 전체보기 전환, Preview 금액 구간별 샘플을 반영했다. `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 성공으로 신규 파일 target 포함과 컴파일을 검증했다. - 2026-07-03: Phase 7 채널 후원 섹션을 구현했다. Figma `296:14908`, 후원 아이템 `567:17927` 기준으로 후원 금액별 상단 컬러(`1...50` `#E2E2E2`, `51...100` `#73EE01`, `101...500` `#00EAFF`, `501...` `#FF4C3C`), `ic_new_donation` 후원하기 버튼, `.donation` tab 전체보기 전환, Preview 금액 구간별 샘플을 반영했다. `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 성공으로 신규 파일 target 포함과 컴파일을 검증했다.
- 2026-07-03: 사용자 요청에 따라 Phase 7 후원하기 버튼을 기존 `LiveRoomDonationDialogView`/`ChannelDonationViewModel.postChannelDonation` 흐름으로 연결하고, 성공 시 `CreatorChannelViewModel.fetchHome(creatorId:)`로 현재 채널 홈 데이터를 다시 불러와 후원 섹션에 즉시 반영하도록 계획을 갱신했다. 후원 내역이 없는 경우 Figma `290:8820` 기준의 빈 후원 UI를 표시하도록 Task 7.1에 반영했다. - 2026-07-03: 사용자 요청에 따라 Phase 7 후원하기 버튼을 기존 `LiveRoomDonationDialogView`/`ChannelDonationViewModel.postChannelDonation` 흐름으로 연결하고, 성공 시 `CreatorChannelViewModel.fetchHome(creatorId:)`로 현재 채널 홈 데이터를 다시 불러와 후원 섹션에 즉시 반영하도록 계획을 갱신했다. 후원 내역이 없는 경우 Figma `290:8820` 기준의 빈 후원 UI를 표시하도록 Task 7.1에 반영했다.
- 2026-07-03: Phase 6 최신 오디오 콘텐츠 섹션을 구현했다. Figma `296:14898`, tag `567:18272`, `567:18274` 기준으로 88px 썸네일, 상단/하단 tag overlay, `New` label, 제목, 재생시간을 반영하고 `latestAudioContent` optional 기반 숨김 및 `AppStep.contentDetail(contentId:)` 상세 진입을 연결했다. `rg` 체크리스트와 `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 성공으로 검증했다. - 2026-07-03: Phase 6 최신 오디오 콘텐츠 섹션을 구현했다. Figma `296:14898`, tag `567:18272`, `567:18274` 기준으로 88px 썸네일, 상단/하단 tag overlay, `New` label, 제목, 재생시간을 반영하고 `latestAudioContent` optional 기반 숨김 및 `AppStep.contentDetail(contentId:)` 상세 진입을 연결했다. `rg` 체크리스트와 `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 성공으로 검증했다.
- 2026-07-03: Phase 4를 완료해 `CreatorChannelView`에서 홈 탭은 `CreatorChannelHomeView`, 홈 외 탭은 `CreatorChannelPlaceholderTabView(title: selectedTab.title)`로 분기하고, 홈 섹션 전체보기용 tab 선택 closure가 `.audio`, `.series`, `.community`, `.fanTalk`, `.donation`으로 전환되도록 연결했다. - 2026-07-03: Phase 4를 완료해 `CreatorChannelView`에서 홈 탭은 `CreatorChannelHomeView`, 홈 외 탭은 `CreatorChannelPlaceholderTabView(title: selectedTab.title)`로 분기하고, 홈 섹션 전체보기용 tab 선택 closure가 `.audio`, `.series`, `.community`, `.fanTalk`, `.donation`으로 전환되도록 연결했다.
- 2026-07-02: 기존 `UserProfile` 구현을 확인해 title bar 팔로우/팔로우 취소/알림 설정/알림 설정 취소를 `UserRepository.creatorFollow(creatorId:follow:notify:)`로 처리하고, `ic_bar_bell`/`ic_bar_bell_fill` 터치 시 각각 `notify: true`/`notify: false` 호출이 일어나도록 계획에 반영했다. - 2026-07-02: 기존 `UserProfile` 구현과 최신 코드 기준을 확인해 title bar 팔로우/팔로우 취소/알림 설정/알림 설정 취소를 `UserRepository.creatorFollow(creatorId:follow:notify:)`로 처리하고, `ic_bar_bell`/`ic_bar_bell_colored` 터치 시 각각 `notify: true`/`notify: false` 호출이 일어나도록 계획에 반영했다.
- 2026-07-03: Task 3.4 구현을 완료했다. `CreatorChannelView`에서 geometry preference로 tab-bar 위치를 추적하고, sticky 기준을 디바이스 최상단이 아닌 title bar 하단(`safeAreaInsets.top + 56`)으로 계산하도록 변경했다. `rg "PreferenceKey|GeometryReader|ZStack|overlay|backgroundProgress|Color\\.clear|opacity|isTabBarSticky|clamp|safeAreaInsets|CreatorChannelTitleBar|CreatorChannelTabBar" ...` 기준 키워드를 확인했고, `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build``BUILD SUCCEEDED`로 완료됐다. - 2026-07-03: Task 3.4 구현을 완료했다. `CreatorChannelView`에서 geometry preference로 tab-bar 위치를 추적하고, sticky 기준을 디바이스 최상단이 아닌 title bar 하단(`safeAreaInsets.top + 56`)으로 계산하도록 변경했다. `rg "PreferenceKey|GeometryReader|ZStack|overlay|backgroundProgress|Color\\.clear|opacity|isTabBarSticky|clamp|safeAreaInsets|CreatorChannelTitleBar|CreatorChannelTabBar" ...` 기준 키워드를 확인했고, `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build``BUILD SUCCEEDED`로 완료됐다.
- 2026-07-03: Task 3.5 구현을 완료했다. `CreatorChannelTitleBar`에 크리에이터 닉네임 주입값을 추가하고, `backgroundProgress`가 1일 때만 한 줄 말줄임으로 표시되도록 연결했다. 우측 팔로우/알림/더보기 영역은 `layoutPriority`로 우선 노출되도록 처리했다. `rg "nickname|lineLimit\\(1\\)|truncationMode|layoutPriority|backgroundProgress|opacity|CreatorChannelTitleBar\\(" ...` 기준 키워드를 확인했고, `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build``BUILD SUCCEEDED`로 완료됐다. - 2026-07-03: Task 3.5 구현을 완료했다. `CreatorChannelTitleBar`에 크리에이터 닉네임 주입값을 추가하고, `backgroundProgress`가 1일 때만 한 줄 말줄임으로 표시되도록 연결했다. 우측 팔로우/알림/더보기 영역은 `layoutPriority`로 우선 노출되도록 처리했다. `rg "nickname|lineLimit\\(1\\)|truncationMode|layoutPriority|backgroundProgress|opacity|CreatorChannelTitleBar\\(" ...` 기준 키워드를 확인했고, `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build``BUILD SUCCEEDED`로 완료됐다.
- 2026-07-02: Task 3.2 구현을 완료하고 `CreatorChannelHeaderSection`을 공통 shell에 연결했다. `rg "struct CreatorChannelHeaderSection|CreatorChannelCreatorResponse|profileImageUrl|ignoresSafeArea\\(.*top|nickname|followerCount|DownsampledKFImage|KFImage" SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelHeaderSection.swift SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift``xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 성공으로 검증했다. - 2026-07-02: Task 3.2 구현을 완료하고 `CreatorChannelHeaderSection`을 공통 shell에 연결했다. `rg "struct CreatorChannelHeaderSection|CreatorChannelCreatorResponse|profileImageUrl|ignoresSafeArea\\(.*top|nickname|followerCount|DownsampledKFImage|KFImage" SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelHeaderSection.swift SodaLive/Sources/V2/CreatorChannel/CreatorChannelView.swift``xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 성공으로 검증했다.
- 2026-07-02: Task 3.1 title bar 컴포넌트를 `SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelTitleBar.swift`로 생성하고 `CreatorChannelView`의 inline title bar를 교체했다. `rg "struct CreatorChannelTitleBar|isFollow|isNotify|backgroundProgress|onTapBack|onTapFollow|onTapUnfollow|onTapNotify|onTapUnnotify|onTapMore|ic_new_bar_back|ic_new_follow|ic_new_following|ic_new_more|ic_bar_bell|ic_bar_bell_fill|팔로우" SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelTitleBar.swift``xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 성공으로 검증했다. - 2026-07-02: Task 3.1 title bar 컴포넌트를 `SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelTitleBar.swift`로 생성하고 `CreatorChannelView`의 inline title bar를 교체했다. `rg "struct CreatorChannelTitleBar|isFollow|isNotify|backgroundProgress|onTapBack|onTapFollow|onTapUnfollow|onTapNotify|onTapUnnotify|onTapMore|ic_new_bar_back|ic_new_follow|ic_new_following|ic_new_more|ic_bar_bell|ic_bar_bell_colored|팔로우" SodaLive/Sources/V2/CreatorChannel/Components/CreatorChannelTitleBar.swift``xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 성공으로 검증했다.
- 2026-07-02: 사용자 확인 사항을 반영해 HeaderView는 `CreatorChannelHomeResponse.creator` 데이터로 채우고, 별도 프로필 이미지 없이 큰 배경 이미지만 표시하며, title bar는 기본 투명 배경으로 header 위에 overlay되도록 Task 3.2/3.4/3.5와 최종 검증 기준을 갱신했다. - 2026-07-02: 사용자 확인 사항을 반영해 HeaderView는 `CreatorChannelHomeResponse.creator` 데이터로 채우고, 별도 프로필 이미지 없이 큰 배경 이미지만 표시하며, title bar는 기본 투명 배경으로 header 위에 overlay되도록 Task 3.2/3.4/3.5와 최종 검증 기준을 갱신했다.
- 2026-07-03: 사용자 요청에 따라 Task 17.2의 대화하기 액션을 캐릭터 상세 이동이 아니라 기존 Character Detail 하단 `대화하기`와 동일한 `TalkApi.createChatRoom` 호출 후 `.chatRoom(id:)` 직접 진입으로 변경했다. `CreatorChannelView`의 로그인/한국 본인인증/content settings guard는 유지했고, 본인인증 완료 후 `pendingAction`도 같은 `startChat(characterId:)` helper를 사용하도록 연결했다. `rg -n "characterDetail\\(characterId: characterId\\)|startChat\\(characterId:|createChatRoom\\(characterId:|chatRoom\\(id:" "SodaLive/Sources/V2/CreatorChannel"`와 ast-grep `AppState.shared.setAppStep(step: .characterDetail(characterId: $ID))` 검색으로 CreatorChannel 대화하기 경로에 캐릭터 상세 이동이 남지 않았음을 확인했다. 테스트는 `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test` 실행 결과 `Scheme SodaLive-dev is not currently configured for the test action.`으로 RED/GREEN 자동화가 불가했다. 빌드는 `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build``BUILD SUCCEEDED`로 완료됐다. - 2026-07-03: 사용자 요청에 따라 Task 17.2의 대화하기 액션을 캐릭터 상세 이동이 아니라 기존 Character Detail 하단 `대화하기`와 동일한 `TalkApi.createChatRoom` 호출 후 `.chatRoom(id:)` 직접 진입으로 변경했다. `CreatorChannelView`의 로그인/한국 본인인증/content settings guard는 유지했고, 본인인증 완료 후 `pendingAction`도 같은 `startChat(characterId:)` helper를 사용하도록 연결했다. `rg -n "characterDetail\\(characterId: characterId\\)|startChat\\(characterId:|createChatRoom\\(characterId:|chatRoom\\(id:" "SodaLive/Sources/V2/CreatorChannel"`와 ast-grep `AppState.shared.setAppStep(step: .characterDetail(characterId: $ID))` 검색으로 CreatorChannel 대화하기 경로에 캐릭터 상세 이동이 남지 않았음을 확인했다. 테스트는 `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test` 실행 결과 `Scheme SodaLive-dev is not currently configured for the test action.`으로 RED/GREEN 자동화가 불가했다. 빌드는 `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build``BUILD SUCCEEDED`로 완료됐다.
- 2026-07-03: Phase 18 최종 조립과 검증을 완료했다. 최신 코드 기준에 맞춰 대화하기 액션은 `CreatorChannelHeaderSection` 내부에 유지하고, `CreatorChannelHomeView` 홈 콘텐츠 순서는 현재 라이브, 최신 오디오, 채널 후원, 공지, 스케줄, 오디오, 시리즈, 커뮤니티, 팬Talk, 소개, 활동, SNS 순서로 확인했다. title bar 알림 설정 asset은 최신 코드 기준인 `ic_bar_bell_colored`를 유지했다. `rg -n "ZStack|overlay|Color\\.clear|backgroundProgress|CreatorChannelTitleBar|CreatorChannelHeaderSection|CreatorChannelTabBar|CreatorChannelHomeView|CreatorChannelTalkActionSection|CreatorChannelCurrentLiveSection|CreatorChannelLatestAudioSection|CreatorChannelDonationSection|CreatorChannelNoticeSection|CreatorChannelScheduleSection|CreatorChannelAudioSection|CreatorChannelSeriesSection|CreatorChannelCommunitySection|CreatorChannelFanTalkSection|CreatorChannelIntroduceSection|CreatorChannelActivitySection|CreatorChannelSnsSection" ...``rg -n "화보|photo|ic_new_dm|DM|ic_new_talk|ic_sns_|ic_new_bar_back|ic_new_follow|ic_new_following|ic_new_more|ic_bar_bell|ic_bar_bell_colored|creatorFollow|follow: true, notify: true|follow: false, notify: false|follow: true, notify: false|onTapNotify|onTapUnnotify|ZStack|overlay|Color\\.clear|isApiFailedPlaceholderVisible|countryCode|auth == false" ...`로 성공 기준을 회귀 점검했고, 신규 CreatorChannel Swift 파일은 `project.pbxproj`의 Sources phase에 포함되어 있음을 확인했다. `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build``BUILD SUCCEEDED`로 완료됐다.

View File

@@ -1,7 +1,7 @@
# PRD: 크리에이터 채널 홈 탭 # PRD: 크리에이터 채널 홈 탭
## 1. Overview ## 1. Overview
크리에이터 채널 화면은 title bar, 크리에이터 프로필 header, tab-bar를 공통 shell로 유지하고, tab-bar 아래 콘텐츠만 선택된 탭에 따라 교체한다. 채널 최초 진입 시 기본 선택 탭은 `홈`이며, 홈 탭에서는 신규 API `GET /api/v2/creator-channels/{creatorId}/home` 응답을 사용해 현재 라이브, 최신 오디오 콘텐츠, 후원, 공지, 스케줄, 오디오, 시리즈, 커뮤니티, 팬Talk, 소개, 활동, SNS 정보를 표시한다. 크리에이터 채널 화면은 title bar, 크리에이터 프로필 header, tab-bar를 공통 shell로 유지하고, tab-bar 아래 콘텐츠만 선택된 탭에 따라 교체한다. 채널 최초 진입 시 기본 선택 탭은 `홈`이며, 홈 탭에서는 신규 API `GET /api/v2/creator-channels/{creatorId}/home` 응답을 사용해 현재 라이브, 최신 오디오 콘텐츠, 후원, 공지, 스케줄, 오디오, 시리즈, 커뮤니티, 팬Talk, 소개, 활동, SNS 정보를 표시한다. 대화하기 액션은 최신 코드 기준처럼 크리에이터 프로필 header 내부에 표시한다.
API 연동을 먼저 구현하고, UI는 공통 shell과 홈 탭 콘텐츠를 분리한 뒤 API 응답 데이터를 기준으로 Figma 섹션 단위로 나누어 순차 구현한다. API 연동을 먼저 구현하고, UI는 공통 shell과 홈 탭 콘텐츠를 분리한 뒤 API 응답 데이터를 기준으로 Figma 섹션 단위로 나누어 순차 구현한다.
@@ -11,21 +11,20 @@ Figma 전체 화면 기준 공통 shell은 아래를 따른다.
2. 크리에이터 이미지/프로필 header 2. 크리에이터 이미지/프로필 header
3. tab-bar 3. tab-bar
Figma 전체 화면 기준 홈 탭 콘텐츠 순서는 아래를 따른다. 최신 코드 기준 홈 탭 콘텐츠 순서는 아래를 따른다.
1. 대화하기 액션 영역 1. 현재 라이브
2. 현재 라이브 2. 최신 오디오 콘텐츠
3. 최신 오디오 콘텐츠 3. 채널 후원
4. 채널 후원 4. 공지
5. 공지 5. 스케줄
6. 스케줄 6. 오디오
7. 오디오 7. 시리즈
8. 시리즈 8. 커뮤니티
9. 커뮤니티 9. 팬Talk
10. 팬Talk 10. 소개
11. 소개 11. 활동
12. 활동 12. SNS
13. SNS
상단 tab-bar 항목은 `홈`, `라이브`, `오디오`, `시리즈`, `커뮤니티`, `팬Talk`, `후원`으로 구성한다. Figma에는 `화보` 탭과 활동 항목이 보이지만 이번 구현 범위에서는 제외한다. 상단 tab-bar 항목은 `홈`, `라이브`, `오디오`, `시리즈`, `커뮤니티`, `팬Talk`, `후원`으로 구성한다. Figma에는 `화보` 탭과 활동 항목이 보이지만 이번 구현 범위에서는 제외한다.
@@ -42,7 +41,7 @@ Figma 전체 화면 기준 홈 탭 콘텐츠 순서는 아래를 따른다.
- 신규 API, Repository, ViewModel, Response model은 `SodaLive/Sources/V2/**` 하위에 둔다. - 신규 API, Repository, ViewModel, Response model은 `SodaLive/Sources/V2/**` 하위에 둔다.
- API 구현을 UI보다 먼저 완료해 공통 shell과 홈 탭 섹션들이 동일한 response model을 사용하도록 한다. - API 구현을 UI보다 먼저 완료해 공통 shell과 홈 탭 섹션들이 동일한 response model을 사용하도록 한다.
- `CreatorChannelView`는 title bar, header, tab-bar, 선택된 tab 상태, 홈 API 호출 상태를 소유한다. - `CreatorChannelView`는 title bar, header, tab-bar, 선택된 tab 상태, 홈 API 호출 상태를 소유한다.
- `CreatorChannelHomeView`는 tab-bar 아래 홈 탭 콘텐츠만 렌더링한다. - `CreatorChannelHomeView`는 tab-bar 아래 홈 탭 콘텐츠만 렌더링하며, 대화하기 액션은 `CreatorChannelHeaderSection`에서 렌더링한다.
- 홈 API 응답의 `creator` 정보는 공통 shell의 header/title/follow/notification/action 상태에 반영한다. - 홈 API 응답의 `creator` 정보는 공통 shell의 header/title/follow/notification/action 상태에 반영한다.
- Figma 기준 섹션을 이후 `plan-task.md`에서 phase 단위로 나눌 수 있도록 요구사항을 분리한다. - Figma 기준 섹션을 이후 `plan-task.md`에서 phase 단위로 나눌 수 있도록 요구사항을 분리한다.
- 크리에이터 대표 이미지는 화면 최상단에서 OS status bar 영역까지 확장해 표시한다. - 크리에이터 대표 이미지는 화면 최상단에서 OS status bar 영역까지 확장해 표시한다.
@@ -169,16 +168,16 @@ Figma 참조:
- `isFollow == false`이면 `팔로우` capsule 버튼을 표시한다. - `isFollow == false`이면 `팔로우` capsule 버튼을 표시한다.
- `isFollow == false` 상태의 follow capsule에는 `ic_new_follow` asset을 사용한다. - `isFollow == false` 상태의 follow capsule에는 `ic_new_follow` asset을 사용한다.
- `isFollow == true` 상태의 following capsule에는 `ic_new_following` asset을 사용한다. - `isFollow == true` 상태의 following capsule에는 `ic_new_following` asset을 사용한다.
- `isFollow == true && isNotify == true`이면 following capsule과 알림 설정 아이콘 `ic_bar_bell_fill` 표시한다. - `isFollow == true && isNotify == true`이면 following capsule과 알림 설정 아이콘 `ic_bar_bell_colored` 표시한다.
- `isFollow == true && isNotify == false`이면 following capsule과 알림 해제 아이콘 `ic_bar_bell`을 표시한다. - `isFollow == true && isNotify == false`이면 following capsule과 알림 해제 아이콘 `ic_bar_bell`을 표시한다.
- 더보기 버튼은 항상 표시한다. - 더보기 버튼은 항상 표시한다.
- 팔로우/팔로우 취소/알림 설정/알림 설정 취소 mutation은 기존 `UserProfile`에서 사용하는 `UserRepository.creatorFollow(creatorId:follow:notify:)` 흐름을 그대로 사용한다. - 팔로우/팔로우 취소/알림 설정/알림 설정 취소 mutation은 기존 `UserProfile`에서 사용하는 `UserRepository.creatorFollow(creatorId:follow:notify:)` 흐름을 그대로 사용한다.
- 팔로우 action은 `creatorFollow(follow: true, notify: true)`를 호출한다. - 팔로우 action은 `creatorFollow(follow: true, notify: true)`를 호출한다.
- 팔로우 취소 action은 기존 `UserProfile``CreatorFollowNotifyDialog.onClickUnFollow`와 동일하게 `creatorFollow(follow: false, notify: false)`를 호출한다. - 팔로우 취소 action은 기존 `UserProfile``CreatorFollowNotifyDialog.onClickUnFollow`와 동일하게 `creatorFollow(follow: false, notify: false)`를 호출한다.
- `ic_bar_bell` 터치 시 알림 설정 action으로 `creatorFollow(follow: true, notify: true)`를 호출한다. - `ic_bar_bell` 터치 시 알림 설정 action으로 `creatorFollow(follow: true, notify: true)`를 호출한다.
- `ic_bar_bell_fill` 터치 시 알림 설정 취소 action으로 `creatorFollow(follow: true, notify: false)`를 호출한다. - `ic_bar_bell_colored` 터치 시 알림 설정 취소 action으로 `creatorFollow(follow: true, notify: false)`를 호출한다.
- 알림 상태 변경용 신규 API는 만들지 않는다. - 알림 상태 변경용 신규 API는 만들지 않는다.
- title bar에 사용하는 아이콘은 `ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_fill`로 고정하고, 다른 back/follow/more/bell asset으로 대체하지 않는다. - title bar에 사용하는 아이콘은 `ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_colored`로 고정하고, 다른 back/follow/more/bell asset으로 대체하지 않는다.
### 7.4 크리에이터 프로필 헤더 ### 7.4 크리에이터 프로필 헤더
@@ -189,12 +188,13 @@ Figma 참조:
- 큰 배경 이미지 영역은 OS status bar까지 확장되도록 top safe area를 무시한다. - 큰 배경 이미지 영역은 OS status bar까지 확장되도록 top safe area를 무시한다.
- `creator.nickname`, `creator.followerCount`를 Figma 위치와 계층에 맞게 표시한다. - `creator.nickname`, `creator.followerCount`를 Figma 위치와 계층에 맞게 표시한다.
- `creator.characterId`가 있는 경우 캐릭터/AI 대화 연결 여부를 판단하는 데이터로 사용한다. - `creator.characterId`가 있는 경우 캐릭터/AI 대화 연결 여부를 판단하는 데이터로 사용한다.
- 대화하기 액션 영역은 최신 코드 기준처럼 `CreatorChannelHeaderSection` 내부에 속한다.
- 이미지 로드 실패 시 기존 프로젝트의 이미지 placeholder 패턴을 따른다. - 이미지 로드 실패 시 기존 프로젝트의 이미지 placeholder 패턴을 따른다.
- 텍스트가 길어도 이미지/버튼/탭 영역과 겹치지 않도록 한 줄 말줄임 또는 기존 nickname 표시 관례를 따른다. - 텍스트가 길어도 이미지/버튼/탭 영역과 겹치지 않도록 한 줄 말줄임 또는 기존 nickname 표시 관례를 따른다.
### 7.5 대화하기 액션 영역 ### 7.5 대화하기 액션 영역
- 대화하기 액션 영역은 tab-bar 아래 홈 탭 콘텐츠에 속한다. - 대화하기 액션 영역은 최신 코드 기준처럼 크리에이터 프로필 header 내부에 속한다.
- `creator.isAiChatAvailable == true`이면 대화하기 버튼을 표시한다. - `creator.isAiChatAvailable == true`이면 대화하기 버튼을 표시한다.
- 대화하기 아이콘은 `ic_new_talk` asset을 사용한다. - 대화하기 아이콘은 `ic_new_talk` asset을 사용한다.
- 대화하기 버튼은 영역 중앙에 배치한다. - 대화하기 버튼은 영역 중앙에 배치한다.
@@ -319,7 +319,7 @@ Figma 참조:
- scroll progress에 따라 black으로 변하는 overlay title bar - scroll progress에 따라 black으로 변하는 overlay title bar
- 팔로우/알림 상태별 title bar - 팔로우/알림 상태별 title bar
- sticky horizontal tab-bar - sticky horizontal tab-bar
- 공통 shell 아래 홈 탭의 대화하기 액션 영역 - 크리에이터 프로필 header 내부의 대화하기 액션 영역
- 홈 탭의 섹션별 summary UI - 홈 탭의 섹션별 summary UI
- 홈 외 탭의 placeholder page - 홈 외 탭의 placeholder page
- 홈 섹션 전체보기 placeholder destination - 홈 섹션 전체보기 placeholder destination
@@ -349,7 +349,7 @@ Figma 참조:
- `SodaLive/Sources/V2/Component/SectionTitle.swift`, `AudioContentCard.swift`, `CommunityPostCard.swift`, `CapsuleTabBar.swift` 등 기존 V2 컴포넌트 재사용 가능성을 먼저 검토한다. - `SodaLive/Sources/V2/Component/SectionTitle.swift`, `AudioContentCard.swift`, `CommunityPostCard.swift`, `CapsuleTabBar.swift` 등 기존 V2 컴포넌트 재사용 가능성을 먼저 검토한다.
- `CreatorActivityType`은 중복 선언하지 않고 기존 enum 재사용 또는 공용 위치 이동을 검토한다. - `CreatorActivityType`은 중복 선언하지 않고 기존 enum 재사용 또는 공용 위치 이동을 검토한다.
- 신규 asset은 프로젝트 asset catalog에 이미 존재하는 `ic_new_talk`을 사용한다. `ic_new_dm`은 추후 DM 버튼 작업에서 사용한다. - 신규 asset은 프로젝트 asset catalog에 이미 존재하는 `ic_new_talk`을 사용한다. `ic_new_dm`은 추후 DM 버튼 작업에서 사용한다.
- title bar 아이콘은 프로젝트 asset catalog의 `ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_fill` 사용한다. - title bar 아이콘은 프로젝트 asset catalog의 `ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_colored` 사용한다.
- 신규 문구가 다국어 대상이면 `SodaLive/Sources/I18n/I18n.swift`에 추가한다. - 신규 문구가 다국어 대상이면 `SodaLive/Sources/I18n/I18n.swift`에 추가한다.
- Figma에서 제공되는 localhost asset URL은 앱 코드에 넣지 않는다. - Figma에서 제공되는 localhost asset URL은 앱 코드에 넣지 않는다.
- 프로젝트 설정 변경은 신규 파일이 Xcode project에 자동 포함되지 않는 구조일 때만 수행한다. - 프로젝트 설정 변경은 신규 파일이 Xcode project에 자동 포함되지 않는 구조일 때만 수행한다.
@@ -370,15 +370,15 @@ Figma 참조:
- sticky 상태에서 OS status bar 영역도 title bar와 동일한 black 배경으로 보인다. - sticky 상태에서 OS status bar 영역도 title bar와 동일한 black 배경으로 보인다.
- `isFollow`, `isNotify` 조합에 따라 title bar의 팔로우/알림 상태가 Figma 3개 상태와 일치한다. - `isFollow`, `isNotify` 조합에 따라 title bar의 팔로우/알림 상태가 Figma 3개 상태와 일치한다.
- title bar 배경 opacity가 1일 때 크리에이터 닉네임이 한 줄 말줄임으로 표시되고, 긴 닉네임이어도 우측 팔로우/알림/더보기 영역이 우선 노출된다. - title bar 배경 opacity가 1일 때 크리에이터 닉네임이 한 줄 말줄임으로 표시되고, 긴 닉네임이어도 우측 팔로우/알림/더보기 영역이 우선 노출된다.
- title bar는 `ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_fill` asset만 사용한다. - title bar는 `ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_colored` asset만 사용한다.
- 팔로우/팔로우 취소/알림 설정/알림 설정 취소 action은 기존 `UserProfile`과 동일하게 `UserRepository.creatorFollow(creatorId:follow:notify:)`를 호출한다. - 팔로우/팔로우 취소/알림 설정/알림 설정 취소 action은 기존 `UserProfile`과 동일하게 `UserRepository.creatorFollow(creatorId:follow:notify:)`를 호출한다.
- `ic_bar_bell` 터치 시 `creatorFollow(follow: true, notify: true)`, `ic_bar_bell_fill` 터치 시 `creatorFollow(follow: true, notify: false)`가 호출된다. - `ic_bar_bell` 터치 시 `creatorFollow(follow: true, notify: true)`, `ic_bar_bell_colored` 터치 시 `creatorFollow(follow: true, notify: false)`가 호출된다.
- `isAiChatAvailable`에 따라 대화하기 버튼이 조건부 표시된다. - `isAiChatAvailable`에 따라 대화하기 버튼이 조건부 표시된다.
- 대화하기 버튼은 기존 AI 채팅방 페이지로 이동하고, 기존 본인인증 guard와 비한국 국가 분기 guard를 적용한다. - 대화하기 버튼은 기존 AI 채팅방 페이지로 이동하고, 기존 본인인증 guard와 비한국 국가 분기 guard를 적용한다.
- 대화하기 버튼이 없어도 액션 영역 높이는 유지된다. - 대화하기 버튼이 없어도 액션 영역 높이는 유지된다.
- DM 버튼은 표시되지 않는다. - DM 버튼은 표시되지 않는다.
- tab-bar 아래 콘텐츠는 선택된 tab에 따라 교체된다. - tab-bar 아래 콘텐츠는 선택된 tab에 따라 교체된다.
- 홈 tab에는 대화하기, 현재 라이브, 최신 오디오 콘텐츠, 채널 후원, 공지, 스케줄, 오디오, 시리즈, 커뮤니티, 팬Talk, 소개, 활동, SNS 섹션이 API 데이터 기반으로 표시된다. - 홈 tab에는 현재 라이브, 최신 오디오 콘텐츠, 채널 후원, 공지, 스케줄, 오디오, 시리즈, 커뮤니티, 팬Talk, 소개, 활동, SNS 섹션이 API 데이터 기반으로 표시된다.
- SNS 섹션은 `ic_sns_*` asset 아이콘과 유효한 SNS URL만 사용해 표시된다. - SNS 섹션은 `ic_sns_*` asset 아이콘과 유효한 SNS URL만 사용해 표시된다.
- 데이터가 비어 있는 섹션은 표시되지 않는다. - 데이터가 비어 있는 섹션은 표시되지 않는다.
- `화보` 탭, 화보 섹션, 활동의 화보 row가 표시되지 않는다. - `화보` 탭, 화보 섹션, 활동의 화보 row가 표시되지 않는다.
@@ -399,7 +399,7 @@ Figma 참조:
- 사용자 확인 사항을 반영해 `creator.profileImageUrl`을 헤더 큰 이미지로 사용, 빈 섹션 숨김, 기존 `UserProfile` follow/notify API 사용, 대화하기의 기존 AI 채팅방 및 본인인증 guard 적용, DM 버튼 추후 작업, 홈 외 탭 제목 placeholder, 팬Talk 전체보기의 팬Talk 탭 이동, Swift `Int` 통일 정책을 확정 요구사항으로 이동했다. - 사용자 확인 사항을 반영해 `creator.profileImageUrl`을 헤더 큰 이미지로 사용, 빈 섹션 숨김, 기존 `UserProfile` follow/notify API 사용, 대화하기의 기존 AI 채팅방 및 본인인증 guard 적용, DM 버튼 추후 작업, 홈 외 탭 제목 placeholder, 팬Talk 전체보기의 팬Talk 탭 이동, Swift `Int` 통일 정책을 확정 요구사항으로 이동했다.
- 사용자 확인 사항을 반영해 API 실패 시 placeholder 기반으로 일부 UI를 유지하고, SNS 섹션 아이콘은 `ic_sns_*` asset을 사용하도록 확정 요구사항으로 이동했다. - 사용자 확인 사항을 반영해 API 실패 시 placeholder 기반으로 일부 UI를 유지하고, SNS 섹션 아이콘은 `ic_sns_*` asset을 사용하도록 확정 요구사항으로 이동했다.
- 저장소의 `ic_sns_fancimm`, `fancimmUrl`, `I18n.ProfileUpdate.fancimm`을 확인해 Figma의 Fansim 표기를 `Fancimm(팬심M)` 기준으로 정리했다. - 저장소의 `ic_sns_fancimm`, `fancimmUrl`, `I18n.ProfileUpdate.fancimm`을 확인해 Figma의 Fansim 표기를 `Fancimm(팬심M)` 기준으로 정리했다.
- 2026-07-02: 사용자 확인 사항을 반영해 title bar, 크리에이터 프로필 header, tab-bar를 `CreatorChannelView` 공통 shell로 두고, tab-bar 아래 홈 탭 콘텐츠 `CreatorChannelHomeView`가 담당하도록 구조를 변경했다. - 2026-07-02: 사용자 확인 사항과 최신 코드 기준을 반영해 title bar, 크리에이터 프로필 header, tab-bar를 `CreatorChannelView` 공통 shell로 두고, tab-bar 아래 홈 탭 콘텐츠 `CreatorChannelHomeView`가 담당하며 대화하기 액션은 `CreatorChannelHeaderSection` 내부에 유지하도록 구조를 정리했다.
- 2026-07-02: 사용자 확인 사항을 반영해 title bar Figma URL 3종과 사용할 아이콘 asset(`ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_fill`)을 확정 요구사항으로 추가했다. - 2026-07-02: 사용자 확인 사항과 최신 코드 기준을 반영해 title bar Figma URL 3종과 사용할 아이콘 asset(`ic_new_bar_back`, `ic_new_follow`, `ic_new_following`, `ic_new_more`, `ic_bar_bell`, `ic_bar_bell_colored`)을 확정 요구사항으로 추가했다.
- 2026-07-02: 기존 `UserProfile` 동작을 확인해 title bar의 팔로우/팔로우 취소/알림 설정/알림 설정 취소를 `UserRepository.creatorFollow(creatorId:follow:notify:)`로 처리하도록 확정했다. - 2026-07-02: 기존 `UserProfile` 동작을 확인해 title bar의 팔로우/팔로우 취소/알림 설정/알림 설정 취소를 `UserRepository.creatorFollow(creatorId:follow:notify:)`로 처리하도록 확정했다.
- 2026-07-02: 사용자 확인 사항을 반영해 HeaderView는 `CreatorChannelHomeResponse.creator` 데이터로 채우고, 별도 프로필 이미지 없이 큰 배경 이미지만 표시하며, title bar는 기본 투명 배경으로 header 위에 overlay되도록 요구사항을 정리했다. - 2026-07-02: 사용자 확인 사항을 반영해 HeaderView는 `CreatorChannelHomeResponse.creator` 데이터로 채우고, 별도 프로필 이미지 없이 큰 배경 이미지만 표시하며, title bar는 기본 투명 배경으로 header 위에 overlay되도록 요구사항을 정리했다.