fix(live): 라이브 상세 표시를 보정한다
This commit is contained in:
@@ -35,6 +35,9 @@ Figma 전체 화면 기준 공통 shell은 아래를 따른다.
|
||||
- tab-bar는 title bar와 붙는 순간 sticky 상태가 되어야 하고, sticky 이후에는 아래 콘텐츠만 스크롤되어야 한다.
|
||||
- `isAiChatAvailable` 값에 따라 대화하기 버튼 노출이 달라지지만, 버튼이 없어도 액션 영역 높이는 유지해야 한다.
|
||||
- 선택된 tab 및 홈 섹션의 `전체보기` 진입 화면은 전체 기능 구현 전에도 placeholder destination이 필요하다.
|
||||
- 후속 버그(2026-07-20): `AppState.liveDetailSheet`는 전역 상태지만 `LiveDetailView`가 `NavigationStack`의 루트 콘텐츠 안에서 렌더링된다. 크리에이터 채널은 navigation destination으로 루트 콘텐츠 위에 표시되므로, 채널 스케줄의 라이브 예약 항목을 눌러도 상세가 현재 화면 위에 나타나지 않고 메인 화면으로 돌아간 뒤에야 보인다.
|
||||
- 후속 버그(2026-07-20): `.liveReplay`는 다시 듣기 카테고리의 업로드 콘텐츠이고 `targetId`도 콘텐츠 ID이지만, 현재 크리에이터 채널과 메인 스케줄 분기에서는 `.live`와 함께 처리되어 라이브 진입 경로로 잘못 전달된다. `.liveReplay`의 상세 화면은 `.audio`와 동일한 오디오 콘텐츠 상세 화면이다.
|
||||
- 후속 버그(2026-07-20): `LiveDetailView`가 이미 종료된 라이브의 상세 조회 실패 응답을 받으면 `이미 종료된 라이브 입니다.` 토스트는 표시되지만 `LiveDetailView` overlay가 닫히지 않아 DIM 배경이 화면에 남는다.
|
||||
|
||||
## 3. Goals
|
||||
- `creatorId`로 `GET /api/v2/creator-channels/{creatorId}/home`을 호출하고 응답 데이터로 크리에이터 채널 공통 shell과 홈 탭 콘텐츠를 구성한다.
|
||||
@@ -51,6 +54,9 @@ Figma 전체 화면 기준 공통 shell은 아래를 따른다.
|
||||
- 홈 tab 외 tab-bar 항목 및 홈 섹션의 전체보기 destination은 placeholder 형태로 먼저 연결한다.
|
||||
- V2 하위의 재사용 가능한 공용 컴포넌트는 우선 재사용한다.
|
||||
- 빈 섹션은 section title과 empty state를 표시하지 않고 숨긴다.
|
||||
- 크리에이터 채널의 라이브 예약 스케줄 항목을 누르면 현재 채널 화면 위에 기존 `LiveDetailView`가 즉시 표시되고, 닫으면 같은 채널 화면으로 돌아온다.
|
||||
- `.liveReplay` 스케줄 항목을 누르면 `targetId`를 콘텐츠 ID로 사용해 `.audio`와 동일한 기존 오디오 콘텐츠 상세 페이지로 이동한다.
|
||||
- 이미 종료된 라이브의 `LiveDetailView`를 열면 `이미 종료된 라이브 입니다.` 토스트를 표시하고 `LiveDetailView`/DIM overlay를 닫아 진입 전 화면을 유지한다.
|
||||
|
||||
## 4. Non-Goals
|
||||
- `화보` 탭과 화보 섹션은 구현하지 않는다.
|
||||
@@ -58,6 +64,8 @@ Figma 전체 화면 기준 공통 shell은 아래를 따른다.
|
||||
- 후원 작성, 댓글/좋아요, 커뮤니티 구매, 콘텐츠 구매의 실제 mutation 구현은 이번 PRD의 필수 범위로 보지 않는다.
|
||||
- DM 버튼 및 DM 보내기 진입은 추후 작업으로 미루고 이번 범위에서 구현하지 않는다.
|
||||
- 라이브룸, 오디오 상세, 시리즈 상세, 커뮤니티 상세, 팬Talk 전체, 후원 전체의 실제 상세 기능을 새로 구현하지 않는다. 기존 진입 흐름이 있으면 연결하고, 없으면 placeholder로 둔다.
|
||||
- `LiveDetailView`, `AppStep.liveDetail`, `LiveDetailSheetState`의 API나 상세 내부 동작은 변경하지 않는다.
|
||||
- 크리에이터 채널 전용 라이브 상세 상태나 중복 `LiveDetailView` 호스트를 추가하지 않는다.
|
||||
- Figma localhost asset URL을 앱 코드에 직접 사용하지 않는다.
|
||||
- `Pods/**`, `generated/**`, `build/**`는 수정하지 않는다.
|
||||
|
||||
@@ -254,7 +262,13 @@ Figma 참조:
|
||||
- `schedules`를 사용해 예정 항목을 표시한다.
|
||||
- 각 item은 `scheduledAtUtc`, `title`, `type`, `targetId`를 사용한다.
|
||||
- `type`은 `LIVE`, `AUDIO`, `COMMUNITY`, `LIVE_REPLAY` 등 기존 `CreatorActivityType` 처리 범위를 따른다.
|
||||
- schedule tap 시 기존 `MainView.handleFollowingScheduleTap(type:targetId:)`와 같은 분기 패턴을 검토해 재사용한다.
|
||||
- `.live`의 `targetId`는 라이브 room ID이며, 크리에이터 채널에서는 기존 `AppState.setAppStep(step: .liveDetail(...))` 흐름으로 전달한다.
|
||||
- `.liveReplay`는 다시 듣기 카테고리의 업로드 콘텐츠이므로 `targetId`를 콘텐츠 ID로 사용해 `.audio`와 동일한 오디오 콘텐츠 상세 화면인 `AppStep.contentDetail(contentId:)`로 이동한다.
|
||||
- `.audio`도 `targetId`를 콘텐츠 ID로 사용해 `AppStep.contentDetail(contentId:)`로 이동한다.
|
||||
- `MainView.handleFollowingScheduleTap(type:targetId:)`와 `CreatorChannelView.handleScheduleTap(type:targetId:)` 모두 `.live`와 `.liveReplay`를 같은 case로 묶지 않고 동일한 타입 의미를 적용한다.
|
||||
- 전역 `liveDetailSheet`의 렌더 호스트는 `NavigationStack`의 destination보다 위인 `ContentView` 외부 overlay에 둔다.
|
||||
- 기존 `NavigationStack` 루트 `ZStack` 안의 `liveDetailSheet` 렌더 분기는 복제하지 않고 외부 overlay로 이동하며, 이동 후 기존 위치의 분기는 제거한다.
|
||||
- overlay 내부 표시 순서는 라이브 상세, 전역 라이브룸, 라이브룸 외부 이동 확인 다이얼로그 순으로 두어 라이브룸과 확인 다이얼로그의 기존 우선순위를 유지한다.
|
||||
- 지원하지 않는 type은 crash 없이 무시하거나 placeholder로 둔다.
|
||||
|
||||
### 7.12 오디오 섹션
|
||||
@@ -363,6 +377,7 @@ Figma 참조:
|
||||
- 프로젝트 설정 변경은 신규 파일이 Xcode project에 자동 포함되지 않는 구조일 때만 수행한다.
|
||||
- Kotlin `Long`으로 정의된 id/count 계열 값은 Swift에서 `Int`로 통일한다.
|
||||
- SNS 섹션 아이콘은 Figma localhost asset이 아니라 프로젝트 asset catalog의 `ic_sns_*` 아이콘을 사용한다.
|
||||
- 라이브 상세 표시 계층 보정은 기존 전역 상태를 재사용하고 `SodaLive/Sources/ContentView.swift` 한 파일의 렌더 위치만 변경한다.
|
||||
|
||||
## 10. Success Criteria
|
||||
- 크리에이터 채널 진입 시 `CreatorChannelView`가 표시되고, 기본 선택 탭은 `홈`이다.
|
||||
@@ -393,6 +408,13 @@ Figma 참조:
|
||||
- 홈 외 tab-bar 항목 선택 시 선택한 탭 제목을 표시하는 placeholder page가 표시된다.
|
||||
- 홈 섹션의 전체보기 action은 기존 화면 또는 placeholder destination으로 이동한다.
|
||||
- 기존 V2 공용 컴포넌트를 재사용 가능한 곳에서 재사용하고, 채널 홈 전용 UI만 전용 `Components`로 분리한다.
|
||||
- 크리에이터 채널 홈 스케줄의 `.live` 항목을 누르면 메인 화면으로 이동하지 않아도 라이브 상세가 현재 채널 위에 즉시 표시된다.
|
||||
- 크리에이터 채널과 메인 스케줄의 `.liveReplay` 항목을 누르면 라이브 상세나 라이브룸이 아니라 `.audio`와 동일한 오디오 콘텐츠 상세 페이지로 이동한다.
|
||||
- `.liveReplay` 처리 중에는 `AppState.liveDetailSheet`를 설정하거나 라이브 입장 함수를 호출하지 않는다.
|
||||
- 라이브 상세를 닫으면 navigation path를 변경하지 않고 기존 크리에이터 채널 화면이 유지된다.
|
||||
- 메인 화면과 다른 navigation destination에서 사용하는 기존 `.liveDetail` 진입도 동일한 전역 호스트에서 한 번만 표시된다.
|
||||
- `ContentView`의 `if let liveDetailSheet` 상태 기반 렌더 분기는 외부 overlay에 하나만 남고 기존 루트 `ZStack`에는 남지 않는다.
|
||||
- 이미 종료된 라이브 상세 조회 실패 시 `AppState.liveDetailSheet` 또는 각 화면의 `LiveDetailView` 표시 상태가 해제되어 DIM 배경이 남지 않는다.
|
||||
|
||||
## 11. Open Questions
|
||||
해당 없음.
|
||||
@@ -411,3 +433,6 @@ Figma 참조:
|
||||
- 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: 사용자 확인 사항을 반영해 HeaderView는 `CreatorChannelHomeResponse.creator` 데이터로 채우고, 별도 프로필 이미지 없이 큰 배경 이미지만 표시하며, title bar는 기본 투명 배경으로 header 위에 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: 사용자 확인에 따라 `LiveDetailView` 표시 대상은 `.live`로 한정했다. `.liveReplay`는 다시 듣기 카테고리의 업로드 콘텐츠이므로 `.audio`와 동일한 오디오 콘텐츠 상세 화면으로 이동하며, 현재 두 스케줄 handler에서 `.live`와 묶인 분기를 각각 수정 대상으로 추가했다.
|
||||
|
||||
Reference in New Issue
Block a user