[Framework] Show top words for filtered items in the Feed List #12

Merged
javier merged 12 commits from framework/feed/top-words into main 2024-03-21 01:13:13 +00:00
Showing only changes of commit 763b6ddefc - Show all commits

View File

@ -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]]
}