// // ContentMainTabSeriesViewModel.swift // SodaLive // // Created by klaus on 2/20/25. // import Foundation import Combine final class ContentMainTabSeriesViewModel: ObservableObject { private let repository = ContentMainTabSeriesRepository() private let contentRepository = ContentRepository() private var subscription = Set() @Published var errorMessage = "" @Published var isShowPopup = false @Published var isLoading = false @Published var bannerList: [GetAudioContentBannerResponse] = [] @Published var originalAudioDramaList: [SeriesListItem] = [] @Published var rankSeriesList: [SeriesListItem] = [] @Published var genreList: [GetSeriesGenreListResponse] = [] @Published var recommendSeriesList: [SeriesListItem] = [] @Published var newSeriesList: [GetRecommendSeriesListResponse] = [] @Published var rankCompleteSeriesList: [SeriesListItem] = [] @Published var seriesRankCreatorList: [ContentCreatorResponse] = [] @Published var recommendSeriesByChannel: [SeriesListItem] = [] @Published var eventBannerList: [EventItem] = [] @Published var curationList: [GetSeriesCurationResponse] = [] func fetchData() { isLoading = true repository.getContentMainSeries() .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.self, from: responseData) if let data = decoded.data, decoded.success { self.bannerList = data.contentBannerList self.originalAudioDramaList = data.originalAudioDrama self.rankSeriesList = data.rankSeriesList self.genreList = data.genreList self.recommendSeriesList = data.recommendSeriesList self.newSeriesList = data.newSeriesList self.rankCompleteSeriesList = data.rankCompleteSeriesList self.seriesRankCreatorList = data.seriesRankCreatorList self.recommendSeriesByChannel = data.recommendSeriesByChannel self.eventBannerList = data.eventBannerList.eventList self.curationList = data.curationList } 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) } func getRecommendSeriesListByGenre(genreId: Int) { isLoading = true repository.getRecommendSeriesListByGenre(genreId: genreId) .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<[SeriesListItem]>.self, from: responseData) if let data = decoded.data, decoded.success { self.recommendSeriesList = data } 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) } func getRecommendSeriesByCreator(creatorId: Int) { recommendSeriesByChannel = [] isLoading = true repository.getRecommendSeriesByCreator(creatorId: creatorId) .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<[SeriesListItem]>.self, from: responseData) if let data = decoded.data, decoded.success { self.recommendSeriesByChannel = data } 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) } }