feat(series-list-all): 완결시리즈 전체보기 페이지 추가

This commit is contained in:
Yu Sung
2025-11-20 17:56:43 +09:00
parent 4d5ac61dbe
commit 001f161fc5
9 changed files with 22 additions and 9 deletions

View File

@@ -128,7 +128,7 @@ enum AppStep {
case seriesDetail(seriesId: Int) case seriesDetail(seriesId: Int)
case seriesAll(creatorId: Int? = nil, creatorNickname: String? = nil, isOriginal: Bool = false) case seriesAll(creatorId: Int? = nil, creatorNickname: String? = nil, isOriginal: Bool = false, isCompleted: Bool = false)
case seriesContentAll(seriesId: Int, seriesTitle: String) case seriesContentAll(seriesId: Int, seriesTitle: String)

View File

@@ -32,6 +32,10 @@ struct SeriesMainHomeView: View {
Text("전체보기") Text("전체보기")
.font(.custom(Font.preRegular.rawValue, size: 14)) .font(.custom(Font.preRegular.rawValue, size: 14))
.foregroundColor(.init(hex: "78909C")) .foregroundColor(.init(hex: "78909C"))
.onTapGesture {
AppState.shared
.setAppStep(step: .seriesAll(isCompleted: true))
}
} }
.padding(.horizontal, 24) .padding(.horizontal, 24)

View File

@@ -92,6 +92,7 @@ struct SeriesMainItemView: View {
.font(.custom(Font.preRegular.rawValue, size: 18)) .font(.custom(Font.preRegular.rawValue, size: 18))
.foregroundColor(Color(hex: "B0BEC5")) .foregroundColor(Color(hex: "B0BEC5"))
.lineLimit(1) .lineLimit(1)
.multilineTextAlignment(.leading)
.padding(.horizontal, 8) .padding(.horizontal, 8)
Text(item.creator.nickname) Text(item.creator.nickname)

View File

@@ -9,7 +9,7 @@ import Foundation
import Moya import Moya
enum SeriesApi { enum SeriesApi {
case getSeriesList(creatorId: Int?, isOriginal: Bool, sortType: SeriesListAllViewModel.SeriesSortType, isAdultContentVisible: Bool, contentType: ContentType, page: Int, size: Int) case getSeriesList(creatorId: Int?, isOriginal: Bool, isCompleted: Bool, sortType: SeriesListAllViewModel.SeriesSortType, isAdultContentVisible: Bool, contentType: ContentType, page: Int, size: Int)
case getSeriesDetail(seriesId: Int, isAdultContentVisible: Bool) case getSeriesDetail(seriesId: Int, isAdultContentVisible: Bool)
case getSeriesContentList(seriesId: Int, isAdultContentVisible: Bool, page: Int, size: Int, sortType: SeriesListAllViewModel.SeriesSortType) case getSeriesContentList(seriesId: Int, isAdultContentVisible: Bool, page: Int, size: Int, sortType: SeriesListAllViewModel.SeriesSortType)
case getRecommendSeriesList(isAdultContentVisible: Bool, contentType: ContentType) case getRecommendSeriesList(isAdultContentVisible: Bool, contentType: ContentType)
@@ -45,12 +45,13 @@ extension SeriesApi: TargetType {
var task: Moya.Task { var task: Moya.Task {
switch self { switch self {
case .getSeriesList(let creatorId, let isOriginal, let sortType, let isAdultContentVisible, let contentType, let page, let size): case .getSeriesList(let creatorId, let isOriginal, let isCompleted, let sortType, let isAdultContentVisible, let contentType, let page, let size):
var parameters = [ var parameters = [
"sortType": sortType, "sortType": sortType,
"isAdultContentVisible": isAdultContentVisible, "isAdultContentVisible": isAdultContentVisible,
"contentType": contentType, "contentType": contentType,
"isOriginal": isOriginal, "isOriginal": isOriginal,
"isCompleted": isCompleted,
"page": page - 1, "page": page - 1,
"size": size "size": size
] as [String : Any] ] as [String : Any]

View File

@@ -15,12 +15,15 @@ struct SeriesListAllView: View {
var creatorNickname: String? = nil var creatorNickname: String? = nil
var isOriginal = false var isOriginal = false
var isCompleted = false
var body: some View { var body: some View {
NavigationView { NavigationView {
BaseView(isLoading: $viewModel.isLoading) { BaseView(isLoading: $viewModel.isLoading) {
VStack(spacing: 0) { VStack(spacing: 0) {
if isOriginal { if isCompleted {
DetailNavigationBar(title: "완결 시리즈")
} else if isOriginal {
DetailNavigationBar(title: "오직 보이스온에서만") DetailNavigationBar(title: "오직 보이스온에서만")
} else { } else {
DetailNavigationBar(title: "\(creatorNickname ?? "") 님의 시리즈 전체보기") DetailNavigationBar(title: "\(creatorNickname ?? "") 님의 시리즈 전체보기")
@@ -66,6 +69,7 @@ struct SeriesListAllView: View {
.onAppear { .onAppear {
viewModel.creatorId = creatorId viewModel.creatorId = creatorId
viewModel.isOriginal = isOriginal viewModel.isOriginal = isOriginal
viewModel.isCompleted = isCompleted
viewModel.getSeriesList() viewModel.getSeriesList()
} }
} }

View File

@@ -18,6 +18,7 @@ final class SeriesListAllViewModel: ObservableObject {
var creatorId: Int? = nil var creatorId: Int? = nil
var isOriginal: Bool = false var isOriginal: Bool = false
var isCompleted: Bool = false
@Published var isLoading = false @Published var isLoading = false
@Published var errorMessage = "" @Published var errorMessage = ""
@@ -26,13 +27,13 @@ final class SeriesListAllViewModel: ObservableObject {
var page = 1 var page = 1
var isLast = false var isLast = false
private let pageSize = 10 private let pageSize = 20
func getSeriesList() { func getSeriesList() {
if !isLoading && !isLast { if !isLoading && !isLast {
isLoading = true isLoading = true
repository repository
.getSeriesList(creatorId: creatorId, isOriginal: isOriginal, sortType: .NEWEST, page: page, size: pageSize) .getSeriesList(creatorId: creatorId, isOriginal: isOriginal, isCompleted: isCompleted, sortType: .NEWEST, page: page, size: pageSize)
.sink { result in .sink { result in
switch result { switch result {
case .finished: case .finished:

View File

@@ -13,11 +13,12 @@ import Moya
class SeriesRepository { class SeriesRepository {
private let api = MoyaProvider<SeriesApi>() private let api = MoyaProvider<SeriesApi>()
func getSeriesList(creatorId: Int?, isOriginal: Bool, sortType: SeriesListAllViewModel.SeriesSortType, page: Int, size: Int) -> AnyPublisher<Response, MoyaError> { func getSeriesList(creatorId: Int?, isOriginal: Bool, isCompleted: Bool, sortType: SeriesListAllViewModel.SeriesSortType, page: Int, size: Int) -> AnyPublisher<Response, MoyaError> {
return api.requestPublisher( return api.requestPublisher(
.getSeriesList( .getSeriesList(
creatorId: creatorId, creatorId: creatorId,
isOriginal: isOriginal, isOriginal: isOriginal,
isCompleted: isCompleted,
sortType: sortType, sortType: sortType,
isAdultContentVisible: UserDefaults.isAdultContentVisible(), isAdultContentVisible: UserDefaults.isAdultContentVisible(),
contentType: ContentType(rawValue: UserDefaults.string(forKey: .contentPreference)) ?? ContentType.ALL, contentType: ContentType(rawValue: UserDefaults.string(forKey: .contentPreference)) ?? ContentType.ALL,

View File

@@ -193,8 +193,8 @@ struct ContentView: View {
case .contentAllByTheme(let themeId): case .contentAllByTheme(let themeId):
ContentAllByThemeView(themeId: themeId) ContentAllByThemeView(themeId: themeId)
case .seriesAll(let creatorId, let creatorNickname, let isOriginal): case .seriesAll(let creatorId, let creatorNickname, let isOriginal, let isCompleted):
SeriesListAllView(creatorId: creatorId, creatorNickname: creatorNickname, isOriginal: isOriginal) SeriesListAllView(creatorId: creatorId, creatorNickname: creatorNickname, isOriginal: isOriginal, isCompleted: isCompleted)
case .seriesDetail(let seriesId): case .seriesDetail(let seriesId):
SeriesDetailView(seriesId: seriesId) SeriesDetailView(seriesId: seriesId)

View File

@@ -59,6 +59,7 @@ struct SeriesListItemView: View {
.font(.custom(Font.preMedium.rawValue, size: 18)) .font(.custom(Font.preMedium.rawValue, size: 18))
.foregroundColor(Color.grayee) .foregroundColor(Color.grayee)
.lineLimit(2) .lineLimit(2)
.multilineTextAlignment(.leading)
.frame(width: itemWidth, alignment: .leading) .frame(width: itemWidth, alignment: .leading)
Text(item.publishedDaysOfWeek) Text(item.publishedDaysOfWeek)