import Foundation import Combine final class MainHomeFollowingViewModel: ObservableObject { private let repository = MainHomeFollowingRepository() private var subscription = Set() @Published var isLoading = false @Published var response: HomeFollowingTabResponse? @Published var isLoginRequired = false @Published var message = "" @Published var hasLoaded = false func fetchFollowing() { isLoading = true message = "" repository.getFollowing() .sink { [weak self] result in guard let self else { return } switch result { case .finished: DEBUG_LOG("finish") case .failure(let error): ERROR_LOG(error.localizedDescription) self.response = nil self.isLoginRequired = false self.message = I18n.HomeFollowing.loadFailedMessage self.hasLoaded = true self.isLoading = false } } receiveValue: { [weak self] response in guard let self else { return } 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.isLoginRequired = data.isLoginRequired self.response = data.isLoginRequired ? nil : data self.message = data.isLoginRequired || data.hasContent ? "" : I18n.HomeFollowing.emptyStateMessage } else { self.response = nil self.isLoginRequired = false self.message = I18n.HomeFollowing.loadFailedMessage } } catch { ERROR_LOG(error.localizedDescription) self.response = nil self.isLoginRequired = false self.message = I18n.HomeFollowing.loadFailedMessage } self.hasLoaded = true self.isLoading = false } .store(in: &subscription) } } private extension HomeFollowingTabResponse { var hasContent: Bool { !followingCreators.isEmpty || !onAirLives.isEmpty || !recentChats.isEmpty || !monthlySchedules.isEmpty || !recentNews.isEmpty } }