시리즈 전체보기 페이지

This commit is contained in:
Yu Sung
2024-04-29 19:36:53 +09:00
parent ffbdbbaa06
commit 101b04b6a9
9 changed files with 324 additions and 9 deletions

View File

@@ -0,0 +1,51 @@
//
// SeriesApi.swift
// SodaLive
//
// Created by klaus on 4/29/24.
//
import Foundation
import Moya
enum SeriesApi {
case getSeriesList(creatorId: Int, sortType: SeriesListAllViewModel.SeriesSortType, page: Int, size: Int)
}
extension SeriesApi: TargetType {
var baseURL: URL {
return URL(string: BASE_URL)!
}
var path: String {
switch self {
case .getSeriesList:
return "/audio-content/series"
}
}
var method: Moya.Method {
switch self {
case .getSeriesList:
return .get
}
}
var task: Moya.Task {
switch self {
case .getSeriesList(let creatorId, let sortType, let page, let size):
let parameters = [
"creatorId": creatorId,
"sortType": sortType,
"page": page - 1,
"size": size
] as [String : Any]
return .requestParameters(parameters: parameters, encoding: URLEncoding.queryString)
}
}
var headers: [String : String]? {
return ["Authorization": "Bearer \(UserDefaults.string(forKey: UserDefaultsKey.token))"]
}
}

View File

@@ -0,0 +1,57 @@
//
// SeriesListAllView.swift
// SodaLive
//
// Created by klaus on 4/29/24.
//
import SwiftUI
struct SeriesListAllView: View {
@ObservedObject var viewModel = SeriesListAllViewModel()
let creatorId: Int
let columns = [
GridItem(.flexible()),
GridItem(.flexible()),
GridItem(.flexible())
]
var body: some View {
BaseView(isLoading: $viewModel.isLoading) {
VStack(spacing: 0) {
DetailNavigationBar(title: "시리즈 전체보기")
ScrollView(.vertical, showsIndicators: false) {
LazyVGrid(columns: columns, spacing: 13.3) {
ForEach(0..<viewModel.seriesList.count, id: \.self) { index in
let item = viewModel.seriesList[index]
SeriesListItemView(item: item)
.contentShape(Rectangle())
.onTapGesture {
AppState.shared
.setAppStep(step: .seriesDetail(seriesId: item.seriesId))
}
.onAppear {
if index == viewModel.seriesList.count - 1 {
viewModel.getSeriesList()
}
}
}
}
.padding(13.3)
}
}
}
.onAppear {
viewModel.creatorId = creatorId
viewModel.getSeriesList()
}
}
}
#Preview {
SeriesListAllView(creatorId: 0)
}

View File

@@ -0,0 +1,79 @@
//
// SeriesListAllViewModel.swift
// SodaLive
//
// Created by klaus on 4/29/24.
//
import Foundation
import Combine
final class SeriesListAllViewModel: ObservableObject {
private let repository = SeriesRepository()
private var subscription = Set<AnyCancellable>()
enum SeriesSortType: String {
case NEWEST, POPULAR
}
var creatorId: Int = 0
@Published var isLoading = false
@Published var errorMessage = ""
@Published var isShowPopup = false
@Published var seriesList = [SeriesListItem]()
var page = 1
var isLast = false
private let pageSize = 10
func getSeriesList() {
if !isLoading && !isLast {
repository
.getSeriesList(creatorId: creatorId, sortType: .NEWEST, page: page, size: pageSize)
.sink { result in
switch result {
case .finished:
DEBUG_LOG("finish")
case .failure(let error):
ERROR_LOG(error.localizedDescription)
}
} receiveValue: { [unowned self] response in
let responseData = response.data
do {
let jsonDecoder = JSONDecoder()
let decoded = try jsonDecoder.decode(ApiResponse<GetSeriesListResponse>.self, from: responseData)
if let data = decoded.data, decoded.success {
if page == 1 {
self.seriesList.removeAll()
}
if !data.items.isEmpty {
page += 1
self.seriesList.append(contentsOf: data.items)
} else {
isLast = true
}
} else {
if let message = decoded.message {
self.errorMessage = message
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
}
self.isShowPopup = true
}
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.isShowPopup = true
}
self.isLoading = false
}
.store(in: &subscription)
}
}
}

View File

@@ -0,0 +1,19 @@
//
// SeriesRepository.swift
// SodaLive
//
// Created by klaus on 4/29/24.
//
import Foundation
import CombineMoya
import Combine
import Moya
class SeriesRepository {
private let api = MoyaProvider<SeriesApi>()
func getSeriesList(creatorId: Int, sortType: SeriesListAllViewModel.SeriesSortType, page: Int, size: Int) -> AnyPublisher<Response, MoyaError> {
return api.requestPublisher(.getSeriesList(creatorId: creatorId, sortType: sortType, page: page, size: size))
}
}