import Foundation import Combine final class MainHomeRankingViewModel: ObservableObject { private let repository = MainHomeRankingRepository() private var subscription = Set() @Published var isLoading = false @Published var items = [MainHomeCreatorRankingItem]() @Published var showRankChange = false @Published var emptyMessage = "" @Published var hasLoaded = false func fetchRankings() { isLoading = true emptyMessage = "" repository.getCreatorRankings() .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.items = [] self.showRankChange = false self.emptyMessage = I18n.HomeRanking.emptyStateMessage 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, !data.items.isEmpty { self.items = Array(data.items.prefix(20)) self.showRankChange = data.showRankChange self.emptyMessage = "" } else { self.items = [] self.showRankChange = false self.emptyMessage = I18n.HomeRanking.emptyStateMessage } } catch { ERROR_LOG(error.localizedDescription) self.items = [] self.showRankChange = false self.emptyMessage = I18n.HomeRanking.emptyStateMessage } self.hasLoaded = true self.isLoading = false } .store(in: &subscription) } }