diff --git a/Frameworks/Feed/Bundle/Sources/Logic/View Models/FeedListViewModel.swift b/Frameworks/Feed/Bundle/Sources/Logic/View Models/FeedListViewModel.swift index a36237a..4ece55b 100644 --- a/Frameworks/Feed/Bundle/Sources/Logic/View Models/FeedListViewModel.swift +++ b/Frameworks/Feed/Bundle/Sources/Logic/View Models/FeedListViewModel.swift @@ -18,6 +18,9 @@ extension FeedListViewController { // MARK: Constants private let configuration: Configuration + + private let filterWords: FilterWordsUseCase = .init() + private let topWords: TopWordsUseCase = .init() // MARK: Properties @Published var filter: FilterOption = .all @@ -26,9 +29,11 @@ extension FeedListViewController { @Published var isLoading: Bool = false var items: [Review] = [] + var words: [WordCount] = [] private var reviewsAll: [Review] = [] private var reviewsFiltered: FilteredReviews = [:] + private var reviewsTopWords: TopWordsReviews = [:] lazy private var iTunesService: iTunesService = { .init(configuration: .init(session: configuration.session)) @@ -56,6 +61,12 @@ extension FeedListViewController { .reduce(into: FilteredReviews()) { partialResult, option in partialResult[option] = reviewsAll.filter { $0.rating.stars == option.rawValue } } + reviewsTopWords = reviewsFiltered + .mapValues { reviews in + reviews.map(\.comment) + .compactMap { try? filterWords($0) } + } + .mapValues { topWords($0) } items = reviewsAll isFilterEnabled = !items.isEmpty @@ -74,7 +85,8 @@ extension FeedListViewController { items = option == .all ? reviewsAll : reviewsFiltered[option] ?? [] - + words = reviewsTopWords[option] ?? [] + filter = option } @@ -86,5 +98,6 @@ private extension FeedListViewController.ViewModel { // MARK: Type aliases typealias FilteredReviews = [FilterOption: [Review]] + typealias TopWordsReviews = [FilterOption: [WordCount]] }