// // HomeTabViewModel.swift // SodaLive // // Created by klaus on 7/10/25. // import Foundation import Combine enum SeriesPublishedDaysOfWeek: String, Encodable { case SUN, MON, TUE, WED, THU, FRI, SAT, RANDOM } final class HomeTabViewModel: ObservableObject { private let repository = HomeTabRepository() private var subscription = Set() @Published var errorMessage = "" @Published var isShowPopup = false @Published var isLoading = false @Published var liveList: [GetRoomListResponse] = [] @Published var creatorRanking: [GetExplorerSectionCreatorResponse] = [] @Published var latestContentThemeList: [String] = [] @Published var latestContentList: [AudioContentMainItem] = [] @Published var eventBannerList: [GetAudioContentBannerResponse] = [] @Published var originalAudioDramaList: [SeriesListItem] = [] @Published var auditionList: [GetAuditionListItem] = [] @Published var dayOfWeekSeriesList: [SeriesListItem] = [] @Published var contentRanking: [GetAudioContentRankingItem] = [] @Published var recommendChannelList: [RecommendChannelResponse] = [] @Published var freeContentList: [AudioContentMainItem] = [] @Published var curationList: [GetContentCurationResponse] = [] func fetchData() { isLoading = true repository.fetchData() .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.liveList = data.liveList self.creatorRanking = data.creatorRanking self.latestContentThemeList = ["전체"] + data.latestContentThemeList self.latestContentList = data.latestContentList self.eventBannerList = data.bannerList self.originalAudioDramaList = data.originalAudioDramaList self.auditionList = data.auditionList self.dayOfWeekSeriesList = data.dayOfWeekSeriesList self.contentRanking = data.contentRanking self.recommendChannelList = data.recommendChannelList self.freeContentList = data.freeContentList 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 getLatestContentByTheme(theme: String) { isLoading = true repository.getLatestContentByTheme(theme: theme == "전체" ? "" : theme) .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<[AudioContentMainItem]>.self, from: responseData) if let data = decoded.data, decoded.success { self.latestContentList = 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 getDayOfWeekSeriesList(dayOfWeek: SeriesPublishedDaysOfWeek) { isLoading = true repository.getDayOfWeekSeriesList(dayOfWeek: dayOfWeek) .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.dayOfWeekSeriesList = 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) } }