docs(home): 제외 섹션 문서를 정리한다
This commit is contained in:
@@ -7,10 +7,9 @@
|
||||
|
||||
## 2. Problem
|
||||
- 추천 탭 전용 데이터가 기존 홈 API와 섞이면 응답/화면 책임이 커지고 회귀 위험이 커진다.
|
||||
- Figma 추천 탭은 라이브, 배너, 최근 활동, 최근 데뷔, 첫 오디오, AI 캐릭터, 장르 크리에이터, 응원 크리에이터, 인기 커뮤니티, 사업자 정보 등 여러 독립 섹션으로 구성된다.
|
||||
- Figma 추천 탭은 라이브, 배너, 최근 활동, 최근 데뷔, AI 캐릭터, 장르 크리에이터, 응원 크리에이터, 인기 커뮤니티, 사업자 정보 등 여러 독립 섹션으로 구성된다.
|
||||
- 섹션별 UI가 많으므로 한 화면 파일에 직접 구현하면 유지보수와 검증이 어려워진다.
|
||||
- `FeedCommunityView`는 추천 탭 요구에 맞춰 키워드 영역 제거, 이미지 표시, 유료/구매 상태 UI가 필요하다.
|
||||
- `AudioContentCardView`는 첫 오디오 콘텐츠 응답의 `isPointAvailable`와 콘텐츠 상태에 따라 태그 표시 조건을 명확히 분기해야 한다.
|
||||
- 사업자 정보는 외부 라이브러리 없이 최대 3줄 말줄임표, 더보기, 접기 동작을 제공해야 한다.
|
||||
|
||||
## 3. Goals
|
||||
@@ -24,7 +23,6 @@
|
||||
- 빈 데이터 섹션은 제목과 컨테이너를 표시하지 않는다.
|
||||
- 사업자 정보 섹션은 화면 width를 채우고, 기본 3줄 말줄임표와 더보기/접기 전환을 지원한다.
|
||||
- `FeedCommunityView`는 추천 탭 요구에 맞게 이미지와 유료 커뮤니티 포스트 UI를 지원한다.
|
||||
- `AudioContentCardView`는 point/original/free/FIRST 시각요소를 조건에 맞게 표시하고 그 외 상태는 숨긴다.
|
||||
|
||||
## 4. Non-Goals
|
||||
- `추천 필모그래피` 섹션은 만들지 않는다.
|
||||
@@ -44,7 +42,6 @@
|
||||
- 사용자는 홈 `추천` 탭에서 현재 라이브 중인 크리에이터와 추천 콘텐츠를 한 화면에서 보고 싶다.
|
||||
- 사용자는 최근 활동한 크리에이터의 활동 타입을 `라이브`, `오디오`, `커뮤니티`처럼 이해 가능한 문구로 보고 싶다.
|
||||
- 사용자는 이미지가 포함된 커뮤니티 포스트와 유료/구매 상태를 카드에서 구분하고 싶다.
|
||||
- 사용자는 첫 오디오 콘텐츠 카드에서 포인트 가능 여부, 오리지널 작품, 무료 여부, 첫 콘텐츠 여부를 시각적으로 구분하고 싶다.
|
||||
- 사용자는 사업자 정보를 기본적으로 짧게 보고, 필요할 때 더보기/접기로 전환하고 싶다.
|
||||
- 사용자는 로그인이 필요하거나 민감 콘텐츠 제한이 필요한 상세 화면에 진입할 때 기존 홈과 같은 로그인/본인인증/콘텐츠 보기 설정 안내를 받고 싶다.
|
||||
|
||||
@@ -66,7 +63,6 @@ data class HomeRecommendationResponse(
|
||||
val banners: List<RecommendationBannerResponse>,
|
||||
val recentlyActiveCreators: List<HomeActiveCreatorItem>,
|
||||
val recentDebutCreators: List<HomeCreatorItem>,
|
||||
val firstAudioContents: List<HomeFirstAudioContentItem>,
|
||||
val aiCharacters: List<HomeAiCharacterItem>,
|
||||
val genreCreators: List<HomeGenreCreatorGroupItem>,
|
||||
val cheerCreators: List<HomeCreatorItem>,
|
||||
@@ -93,18 +89,6 @@ data class HomeCreatorItem(
|
||||
val creatorProfileImage: String
|
||||
)
|
||||
|
||||
data class HomeFirstAudioContentItem(
|
||||
val contentId: Long,
|
||||
val creatorId: Long,
|
||||
val creatorNickname: String,
|
||||
val creatorProfileImage: String,
|
||||
val title: String,
|
||||
val price: Int,
|
||||
val coverImage: String?,
|
||||
@JsonProperty("isPointAvailable")
|
||||
val isPointAvailable: Boolean
|
||||
)
|
||||
|
||||
data class HomeAiCharacterItem(
|
||||
val characterId: Long,
|
||||
val creatorId: Long,
|
||||
@@ -216,21 +200,7 @@ enum class RecommendedActivityType(val code: String) {
|
||||
- 작성자, 본문, 생성 시간, 좋아요 수, 댓글 수를 표시한다.
|
||||
- `audioUrl`은 이번 추천 탭 카드에서 표시 대상이 확정되지 않았으므로 재생 UI를 추가하지 않는다.
|
||||
|
||||
### 7.5 AudioContentCardView
|
||||
|
||||
`HomeFirstAudioContentItem` 기반 표시 조건:
|
||||
- `isPointAvailable == true`이면 `ic_content_tag_point`를 쓰는 `ImageView`를 표시한다.
|
||||
- 오리지널 작품이면 `ic_content_tag_original`를 쓰는 `ImageView`를 표시한다.
|
||||
- `price == 0`이면 `무료` `TextView`를 표시한다.
|
||||
- 크리에이터의 첫 번째 콘텐츠이면 `FIRST` 글자를 포함하는 `LinearLayout`을 표시한다.
|
||||
- 위 조건에 해당하지 않는 시각요소는 모두 `GONE` 처리한다.
|
||||
|
||||
구현 메모:
|
||||
- iOS 구현 시 기존 `AudioContentCard` 또는 `AudioContentCardView`가 있으면 우선 재사용/확장한다.
|
||||
- Android 용어인 `ImageView`, `TextView`, `LinearLayout`, `GONE`은 iOS에서는 각각 SwiftUI `Image`, `Text`, 컨테이너 View, 조건부 미렌더링으로 해석한다.
|
||||
- 오리지널 작품/첫 번째 콘텐츠 여부가 현재 응답에 명시되어 있지 않으면 서버 필드 확인 전까지 임의 추정하지 않는다.
|
||||
|
||||
### 7.6 사업자 정보 더보기/접기
|
||||
### 7.5 사업자 정보 더보기/접기
|
||||
|
||||
요구사항:
|
||||
- UI 가장 마지막에 사업자 정보 섹션을 배치한다.
|
||||
@@ -269,7 +239,6 @@ MainHomeView
|
||||
│ ├─ 배너 섹션
|
||||
│ ├─ 최근 활동 크리에이터 섹션
|
||||
│ ├─ 최근 데뷔한 크리에이터 섹션
|
||||
│ ├─ 처음 만나는 오디오 섹션
|
||||
│ ├─ AI 캐릭터 섹션
|
||||
│ ├─ 장르의 크리에이터 섹션
|
||||
│ ├─ 최근 응원이 많은 크리에이터 섹션
|
||||
@@ -283,7 +252,6 @@ MainHomeView
|
||||
### 8.3 재사용 컴포넌트 후보
|
||||
- `SodaLive/Sources/V2/Component/HomeTitleBar.swift`
|
||||
- `SodaLive/Sources/V2/Component/SectionTitle.swift`
|
||||
- `SodaLive/Sources/V2/Component/AudioContentCard.swift`
|
||||
- `SodaLive/Sources/V2/Component/Banner/BannerCarousel.swift`
|
||||
- `SodaLive/Sources/V2/Component/Card/AiCharacterCard.swift`
|
||||
- `SodaLive/Sources/V2/Component/Card/CommunityPostCard.swift`
|
||||
@@ -323,7 +291,6 @@ MainHomeView
|
||||
- `LIVE`, `LIVE_REPLAY`, `AUDIO`, `COMMUNITY` 활동 타입이 I18n 문구로 표시된다.
|
||||
- `FeedCommunityView`에서 키워드 영역이 제거되고, 이미지/유료 미구매/유료 구매함 또는 무료 상태가 조건에 맞게 표시된다.
|
||||
- `FeedCommunityView`에 `구매완료` 버튼이 표시되지 않는다.
|
||||
- `AudioContentCardView`에서 point/original/free/FIRST 시각요소가 조건에 맞게 표시되고 그 외에는 숨겨진다.
|
||||
- 사업자 정보는 마지막 섹션에서 화면 width를 채우고, 기본 3줄 말줄임표, 더보기, 전체 표시, 접기 전환이 동작한다.
|
||||
- 상세 진입 탭 액션은 기존 홈과 같은 로그인, 한국 사용자 본인인증, 민감 콘텐츠 보기 설정 guard를 통과한 뒤에만 실행된다.
|
||||
- `MainHomeView`는 추천/랭킹/팔로잉 탭 shell 역할만 하고, 추천 탭 섹션 조립은 `MainHomeRecommendationView`에 분리되어 있다.
|
||||
@@ -333,13 +300,12 @@ MainHomeView
|
||||
## 11. Open Questions
|
||||
- `RecommendationBannerResponse`는 변경된 백엔드 스펙 기준으로 `eventItem`, `creatorId`, `seriesId`, `link` 순서의 이동 규칙을 사용한다.
|
||||
- 각 섹션별 최대 표시 개수와 가로/세로 스크롤 정책이 Figma 기준 그대로인지, 서버 응답 전체를 모두 표시해야 하는지 확인이 필요하다.
|
||||
- `HomeFirstAudioContentItem`에서 오리지널 작품 여부와 크리에이터의 첫 번째 콘텐츠 여부를 판단할 서버 필드가 추가되는지 확인이 필요하다.
|
||||
- `HomeLiveItem`에 민감/성인 라이브 여부를 판단할 `isAdult` 또는 동등한 필드가 추가되는지, 아니면 서버에서 추천 라이브를 사전 필터링하는지 확인이 필요하다.
|
||||
- 커뮤니티 `audioUrl`을 추천 탭 카드에서 표시/재생해야 하는지 확인이 필요하다.
|
||||
- 각 카드 터치 시 상세 이동 대상이 모두 정의되어 있는지 확인이 필요하다.
|
||||
|
||||
## 12. Verification Plan
|
||||
- 문서 검증: API URL, 응답 모델, 제외 섹션, FeedCommunityView, AudioContentCardView, 사업자 정보 요구가 PRD와 계획 문서에 반영되었는지 확인한다.
|
||||
- 문서 검증: API URL, 응답 모델, 제외 섹션, FeedCommunityView, 사업자 정보 요구가 PRD와 계획 문서에 반영되었는지 확인한다.
|
||||
- 정적 검증: 신규 추천 API가 기존 `HomeApi`에 추가되지 않았고, Figma URL이 앱 코드에 직접 포함되지 않았는지 확인한다.
|
||||
- 빌드 검증: `docs/agent-guides/build-test-verification.md` 기준으로 가능한 iOS 빌드 또는 최소 정적 검증을 실행한다.
|
||||
- 기능 검증: 추천 API 성공/실패, 빈 섹션, 활동 타입 I18n, 상세 진입 guard, 커뮤니티 카드 상태, 오디오 카드 태그 상태, 사업자 정보 더보기/접기를 확인한다.
|
||||
- 기능 검증: 추천 API 성공/실패, 빈 섹션, 활동 타입 I18n, 상세 진입 guard, 커뮤니티 카드 상태, 사업자 정보 더보기/접기를 확인한다.
|
||||
|
||||
Reference in New Issue
Block a user