From 763b6ddefc53045e348db74067f009ca70135da9 Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Wed, 20 Mar 2024 23:40:28 +0100 Subject: [PATCH] Implemented the calculation of reviews' top words for the FeedListViewController view controller in the Feed framework. --- .../Logic/View Models/FeedListViewModel.swift | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) 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]] }