feat(content): 전체 탭을 추가한다
This commit is contained in:
97
docs/20260706_메인_콘텐츠_내부_전체_탭/plan-task.md
Normal file
97
docs/20260706_메인_콘텐츠_내부_전체_탭/plan-task.md
Normal file
@@ -0,0 +1,97 @@
|
||||
# 메인 콘텐츠 탭 내부 전체 탭 구현 계획
|
||||
|
||||
## 기준 문서
|
||||
|
||||
- PRD: `docs/20260706_메인_콘텐츠_내부_전체_탭/prd.md`
|
||||
- 문서 정책: `docs/agent-guides/documentation-policy.md`
|
||||
- 코드 스타일: `docs/agent-guides/code-style.md`
|
||||
- 빌드/검증: `docs/agent-guides/build-test-verification.md`
|
||||
|
||||
## 구현할 UI의 Figma URL
|
||||
|
||||
- 오디오 선택 상태: `https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=35-5857&m=dev`
|
||||
- 시리즈 선택 상태: `https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=24-6909&m=dev`
|
||||
- 오리지널 선택 상태: `https://www.figma.com/design/HmN1yNdJ3EIpqknFL0Hkab/-%EA%B3%B5%EC%9C%A0%EC%9A%A9-%EB%B3%B4%EC%9D%B4%EC%8A%A4%EC%98%A8-UI-UX-%EA%B8%B0%ED%9A%8D%EB%AC%B8%EC%84%9C?node-id=24-9105&m=dev`
|
||||
|
||||
## 확정 요구사항 요약
|
||||
|
||||
- API endpoint는 `GET /api/v2/audio/contents`를 사용한다.
|
||||
- 기본 query는 `type=AUDIO`, `sort=LATEST`, `page=0`, `size=20`이다.
|
||||
- `dayOfWeek`는 `type == SERIES`일 때만 전송한다.
|
||||
- Figma 타입 chip의 `전체`는 구현하지 않는다.
|
||||
- Figma sort menu의 `추천순`은 구현하지 않는다.
|
||||
- `FREE` 타입의 sort menu는 `최신순`, `인기순`만 제공한다.
|
||||
- response의 `totalCount`는 UI에 표시하지 않는다.
|
||||
- 내부 `추천/랭킹/전체` 탭 전환 시 `전체` 탭 상태를 유지한다.
|
||||
|
||||
## TASK 체크리스트
|
||||
|
||||
### Phase 1: 전체 탭 기준 구조와 API 모델
|
||||
|
||||
- [x] **Task 1.1: 내부 전체 탭 진입 구조와 상태 유지 설계**
|
||||
- 대상 파일:
|
||||
- 수정: `SodaLive/Sources/V2/Main/Content/MainContentTab.swift`
|
||||
- 수정: `SodaLive/Sources/V2/Main/Content/MainContentView.swift`
|
||||
- 검증 기준:
|
||||
- 내부 `전체` 탭이 추가되고, `추천/랭킹/전체` 탭 전환 시 `전체` 탭 상태가 유지된다.
|
||||
|
||||
- [x] **Task 1.2: API 모델과 repository 추가**
|
||||
- 대상 파일:
|
||||
- 생성: `SodaLive/Sources/V2/Main/Content/All/Models/MainContentAllTabResponse.swift`
|
||||
- 생성: `SodaLive/Sources/V2/Main/Content/All/Repository/MainContentAllApi.swift`
|
||||
- 생성: `SodaLive/Sources/V2/Main/Content/All/Repository/MainContentAllRepository.swift`
|
||||
- 검증 기준:
|
||||
- `GET /api/v2/audio/contents`와 query parameter 기본값, `SERIES` 전용 `dayOfWeek` 전송 조건이 반영된다.
|
||||
|
||||
### Phase 2: 필터, 정렬, 페이징
|
||||
|
||||
- [x] **Task 2.1: 타입 chip, 요일 필터, sort menu 구현**
|
||||
- 대상 파일:
|
||||
- 생성: `SodaLive/Sources/V2/Main/Content/All/MainContentAllView.swift`
|
||||
- 생성: `SodaLive/Sources/V2/Main/Content/All/MainContentAllViewModel.swift`
|
||||
- 수정: `SodaLive/Sources/I18n/I18n.swift`
|
||||
- 검증 기준:
|
||||
- 타입 chip에 `전체`가 없고, `추천순` sort가 없으며, `FREE` 타입은 `LATEST`, `POPULAR`만 제공한다.
|
||||
- `기타` 요일은 en `OTHER`, ja `その他`로 표시된다.
|
||||
|
||||
- [x] **Task 2.2: 스크롤 페이징 구현**
|
||||
- 대상 파일:
|
||||
- 수정: `SodaLive/Sources/V2/Main/Content/All/MainContentAllViewModel.swift`
|
||||
- 수정: `SodaLive/Sources/V2/Main/Content/All/MainContentAllView.swift`
|
||||
- 검증 기준:
|
||||
- `hasNext == true`일 때 다음 page가 append되고, 타입/정렬/요일 변경 시 page 0부터 다시 로드된다.
|
||||
|
||||
### Phase 3: 콘텐츠 grid와 navigation
|
||||
|
||||
- [x] **Task 3.1: 오디오/무료/포인트 grid 구현**
|
||||
- 대상 파일:
|
||||
- 확인/수정: `SodaLive/Sources/V2/Component/AudioContent/AudioContentThumbnailCard.swift`
|
||||
- 수정: `SodaLive/Sources/V2/Main/Content/All/MainContentAllView.swift`
|
||||
- 검증 기준:
|
||||
- `AUDIO`, `FREE`, `POINT`는 response `audios`를 표시하고 `totalCount`는 노출하지 않는다.
|
||||
|
||||
- [x] **Task 3.2: 시리즈/오리지널 grid 구현**
|
||||
- 대상 파일:
|
||||
- 생성: `SodaLive/Sources/V2/Main/Content/All/Components/MainContentSeriesThumbnailCard.swift`
|
||||
- 수정: `SodaLive/Sources/V2/Main/Content/All/MainContentAllView.swift`
|
||||
- 검증 기준:
|
||||
- `SERIES`, `ORIGINAL`은 response `series`를 표시하고, `SERIES`에서만 요일 필터와 `dayOfWeek` 요청이 동작한다.
|
||||
|
||||
- [x] **Task 3.3: 상세 이동 연결**
|
||||
- 대상 파일:
|
||||
- 수정: `SodaLive/Sources/V2/Main/Content/All/MainContentAllView.swift`
|
||||
- 수정: `SodaLive/Sources/V2/Main/MainView.swift`
|
||||
- 검증 기준:
|
||||
- 오디오는 `audioContentId`로 오디오 상세, 시리즈는 `seriesId`로 시리즈 상세에 진입한다.
|
||||
|
||||
## 검증 기록
|
||||
|
||||
- 2026-07-06: 사용자 요청에 따라 구현 대상 Figma URL을 본 문서에 기록했다.
|
||||
- 2026-07-06: `MainContentTab`에 `추천/랭킹/전체` 탭을 구성하고 `MainContentView`가 `MainContentAllViewModel`을 `@StateObject`로 보유하도록 구현해 `전체` 탭 상태 유지 구조를 반영했다.
|
||||
- 2026-07-06: `MainContentAllTabResponse`, `MainContentAllApi`, `MainContentAllRepository`를 추가해 `GET /api/v2/audio/contents`와 `SERIES` 전용 `dayOfWeek` query 전송 조건을 반영했다.
|
||||
- 2026-07-06: `MainContentAllViewModel`과 `MainContentAllView`에 타입 chip, `SERIES` 전용 요일 필터, sort menu, page 0 reload, `hasNext` 기반 append paging을 구현했다.
|
||||
- 2026-07-06: `AudioContentThumbnailCardItem(mainContentAudio:)` adapter와 `MainContentSeriesThumbnailCard`를 추가해 `AUDIO/FREE/POINT`는 `audios`, `SERIES/ORIGINAL`은 `series` grid를 표시하도록 구현했다.
|
||||
- 2026-07-06: 오디오/시리즈 상세 이동은 기존 `MainContentView` callback과 `MainView`의 기존 handler를 재사용해 연결했으므로 `MainView.swift` 직접 수정은 발생하지 않았다.
|
||||
- 2026-07-06: `I18n.MainContentAll`/`I18n.MainContentRanking` 문자열을 추가했고, `RANDOM` 짧은 요일 표기는 en `OTHER`, ja `その他`로 반영했다.
|
||||
- 2026-07-06: `xcodebuild -workspace "SodaLive.xcworkspace" -list`로 테스트 타깃이 별도 노출되지 않음을 확인했다.
|
||||
- 2026-07-06: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug -sdk iphonesimulator build` 실행 결과 `** BUILD SUCCEEDED **`를 확인했다.
|
||||
Reference in New Issue
Block a user