feat(home): 현재 라이브 섹션을 연결한다
This commit is contained in:
@@ -227,16 +227,18 @@
|
||||
|
||||
### Phase 8: 현재 라이브 섹션 UI
|
||||
|
||||
- [ ] **Task 8.1: 현재 라이브 섹션 작성/보완**
|
||||
- [x] **Task 8.1: 현재 라이브 섹션 작성/보완**
|
||||
- 대상 파일:
|
||||
- 생성/보완: `SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeLiveSection.swift`
|
||||
- 작업 내용:
|
||||
- `HomeLiveItem.roomId`, `creatorNickname`, `creatorProfileImage`로 라이브 아이템을 표시한다.
|
||||
- `roomId`는 응답 스펙상 항상 존재하는 값으로 취급한다.
|
||||
- 섹션 제목은 표시하지 않는다.
|
||||
- 데이터가 비어 있으면 섹션 제목과 컨테이너를 표시하지 않는다.
|
||||
- 아이템 터치 이동은 라우팅 규칙이 명확한 경우에만 연결한다.
|
||||
- 아이템 터치 시 기존 `LiveViewModel.enterLiveRoom(roomId:)` 흐름을 재사용해 로그인 guard 이후 입장 전 결제 확인, 비밀방 비밀번호 dialog, `LiveRoomViewV2` 입장을 처리한다.
|
||||
- 검증 기준:
|
||||
- 실행 명령: `rg "MainHomeLiveSection|roomId|creatorNickname|creatorProfileImage" SodaLive/Sources/V2/Main/Home/Recommendation`
|
||||
- 기대 결과: 라이브 섹션이 신규 응답 필드를 기준으로 구성된다.
|
||||
- 실행 명령: `rg "MainHomeLiveSection|roomId|creatorNickname|creatorProfileImage|enterLiveRoom|LivePaymentDialog|LiveRoomPasswordDialog" SodaLive/Sources/V2/Main/Home/Recommendation SodaLive/Sources/V2/Main/MainView.swift`
|
||||
- 기대 결과: 라이브 섹션이 신규 응답 필드를 기준으로 구성되고, 추천 라이브 탭이 기존 라이브 입장 흐름을 재사용한다.
|
||||
|
||||
### Phase 9: 배너 섹션 UI
|
||||
|
||||
@@ -442,6 +444,38 @@
|
||||
|
||||
## 검증 기록
|
||||
|
||||
### 2026-06-29 Phase 8.1 현재 라이브 섹션 구현 완료
|
||||
|
||||
- 목적: V2 Main Home 추천 탭에 현재 라이브 섹션을 API 응답 데이터 기반으로 표시
|
||||
- 수행 내용:
|
||||
- `MainHomeLiveSection`을 `Recommendation/Components` 아래에 추가하고 `HomeLiveItem.roomId`, `creatorNickname`, `creatorProfileImage`를 사용해 렌더링
|
||||
- Figma `24:5518` 라이브 아이템 메타데이터(`70x102`)와 스크린샷을 기준으로 단일 아이템 프레임과 프로필 이미지/라이브 배지 배치를 보정
|
||||
- `MainHomeLiveSection_Previews`에 `Live Item` 고정 크기 Preview와 `Live Section` Preview를 추가해 Xcode Preview에서 확인 가능하도록 구성
|
||||
- 섹션 제목을 제거하고 `roomId`를 non-optional 응답 값으로 반영
|
||||
- 데이터가 비어 있으면 `SectionTitle`과 가로 목록이 렌더링되지 않도록 구성
|
||||
- `MainHomeRecommendationView`에는 Phase 8 현재 라이브 섹션만 조립하고, 아이템 탭 시 `MainView`에서 로그인 guard 후 `LiveViewModel.enterLiveRoom(roomId:)`로 전달되도록 연결
|
||||
- `MainView`에 이미 배치된 `LivePaymentDialog`, `LiveRoomPasswordDialog`, `LiveRoomViewV2` 표시 흐름을 재사용
|
||||
- 신규 Swift 파일을 `SodaLive.xcodeproj/project.pbxproj` 빌드 대상에 포함
|
||||
- 검증:
|
||||
- Figma `24:5518` 메타데이터 확인 결과: `live` 노드 크기 `70x102`, 스크린샷 기준 원형 프로필/하단 `LIVE` 배지/닉네임 말줄임 구성 확인
|
||||
- `rg "MainHomeLiveSection|roomId|creatorNickname|creatorProfileImage|enterLiveRoom|LivePaymentDialog|LiveRoomPasswordDialog" SodaLive/Sources/V2/Main/Home/Recommendation SodaLive/Sources/V2/Main/MainView.swift` 실행, 라이브 섹션 필드와 기존 입장 흐름 재사용 확인
|
||||
- `plutil -lint SodaLive.xcodeproj/project.pbxproj` 실행, `OK` 확인
|
||||
- `git diff --check` 실행, 출력 없이 성공 확인
|
||||
- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 실행, `BUILD SUCCEEDED` 확인
|
||||
|
||||
### 2026-06-29 추천 응답 모델 optionality 정렬
|
||||
|
||||
- 목적: PRD의 "서버 nullable 필드는 Swift optional" 기준에 맞춰 `MainHomeRecommendationResponse.swift` 모델 optionality를 정리
|
||||
- 수행 내용:
|
||||
- PRD 응답 스펙에서 `?`가 없는 필드를 Swift non-optional로 변경
|
||||
- `targetId`, `coverImage`, `profileImage`, `originalWorkTitle`, `creatorProfileImage`, `imageUrl`, `audioUrl` 등 PRD nullable 필드는 optional 유지
|
||||
- `RecommendationBannerResponse`는 상세 PRD 스펙이 별도로 확정되지 않아 기존 optional 선언 유지
|
||||
- `HomeLiveItem.creatorNickname`, `creatorProfileImage`가 non-optional이 되면서 라이브 섹션의 불필요한 nil fallback 제거
|
||||
- 검증:
|
||||
- `rg -n "let (roomId|activityType|activityAt|contentId|isPointAvailable|characterId|totalChatCount|genreName|creators|postId|createdAt|likeCount|commentCount|existOrdered): .*\\?" SodaLive/Sources/V2/Main/Home/Recommendation/Models/MainHomeRecommendationResponse.swift` 실행, 검색 결과 없음 확인 예정
|
||||
- `rg -n "\\?\\? \"\"" SodaLive/Sources/V2/Main/Home/Recommendation/Components/MainHomeLiveSection.swift` 실행, 검색 결과 없음 확인 예정
|
||||
- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` 실행 예정
|
||||
|
||||
### 2026-06-29 Phase 7 중간 빌드 검증 완료
|
||||
|
||||
- 목적: Phase 4~6에서 생성/이동한 데이터 상태, 라우팅, 탭 루트 Swift 파일이 프로젝트 빌드 대상에 포함되어 있는지 중간 검증
|
||||
|
||||
@@ -174,6 +174,7 @@ enum class RecommendedActivityType(val code: String) {
|
||||
- 본인인증 성공 후 `pendingAction`을 실행해 원래 상세 화면으로 이동한다.
|
||||
- 민감 콘텐츠 보기 설정이 꺼져 있으면 `AppState.shared.setPendingContentSettingsGuideMessage(I18n.Settings.adultContentEnableGuide)`로 안내 문구를 예약하고 `AppState.shared.setAppStep(step: .contentViewSettings)`로 이동한다.
|
||||
- 위 조건을 통과한 경우에만 `liveDetail`, `creatorDetail`, `contentDetail`, `characterDetail` 등 실제 상세 이동을 실행한다.
|
||||
- 추천 탭 현재 라이브 아이템은 `roomId`가 항상 존재하는 값으로 취급하고, 아이템 탭 시 상세 화면을 거치지 않고 기존 `LiveViewModel.enterLiveRoom(roomId:)` 흐름을 호출해 방 상세 조회, 입장 전 결제 확인, 비밀방 비밀번호 dialog, `LiveRoomViewV2` 입장을 재사용한다.
|
||||
|
||||
라이브 항목 주의사항:
|
||||
- 기존 홈의 라이브 guard는 `roomId`와 `isAdult`를 함께 받아 성인 여부를 판단한다.
|
||||
|
||||
@@ -33,6 +33,9 @@
|
||||
- 프로퍼티 선언, 비즈니스 로직, 헬퍼 메서드는 공백 줄로 구획한다.
|
||||
- 클로저 체인은 줄바꿈해 가독성을 유지한다.
|
||||
|
||||
## SwiftUI Preview 규칙
|
||||
- Preview에서 이미지 URL 샘플이 필요하면 `https://placehold.co/500`를 사용한다.
|
||||
|
||||
## 타입/상태 관리
|
||||
- ViewModel은 `final class ...: ObservableObject` 패턴을 우선한다.
|
||||
- View가 소유하는 객체는 `@StateObject`, 외부 주입 객체는 `@ObservedObject`를 사용한다.
|
||||
|
||||
Reference in New Issue
Block a user