From 8cbc18c45e7775c50f9e78bb04a3dcc0e50e4968 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Sat, 18 Jul 2020 19:56:30 -0500 Subject: [PATCH] Refactor TimelineModel to use Combine more fully --- .../Shared/Timeline/TimelineModel.swift | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/Multiplatform/Shared/Timeline/TimelineModel.swift b/Multiplatform/Shared/Timeline/TimelineModel.swift index 2853f74fe..12ef8d117 100644 --- a/Multiplatform/Shared/Timeline/TimelineModel.swift +++ b/Multiplatform/Shared/Timeline/TimelineModel.swift @@ -118,7 +118,6 @@ class TimelineModel: ObservableObject, UndoableCommandRunner { } func subscribeToSelectedFeedChanges() { - // TODO: This should be rewritten to use Combine correctly (including fixing the read filter toggle to work as a published bool) delegate?.selectedFeeds.sink { [weak self] feeds in guard let self = self else { return } self.feeds = feeds @@ -127,29 +126,26 @@ class TimelineModel: ObservableObject, UndoableCommandRunner { } func subscribeToSelectedArticleSelectionChanges() { - // TODO: This should be rewritten to use Combine correctly - $selectedArticleIDs.sink { [weak self] articleIDs in - guard let self = self else { return } - self.selectedArticles = articleIDs.compactMap { self.idToArticleDictionary[$0] } - }.store(in: &cancellables) + $selectedArticleIDs.map { [weak self] articleIDs in + return articleIDs.compactMap { self?.idToArticleDictionary[$0] } + } + .assign(to: $selectedArticles) - // TODO: This should be rewritten to use Combine correctly - $selectedArticleID.sink { [weak self] articleID in - guard let self = self else { return } - if let articleID = articleID, let article = self.idToArticleDictionary[articleID] { - self.selectedArticles = [article] + $selectedArticleID.map { [weak self] articleID in + if let articleID = articleID, let article = self?.idToArticleDictionary[articleID] { + return [article] + } else { + return [Article]() } - }.store(in: &cancellables) + } + .assign(to: $selectedArticles) - // TODO: This should be rewritten to use Combine correctly - $selectedArticles.sink { articles in - if articles.count == 1 { - let article = articles.first! - if !article.status.read { - markArticles(Set([article]), statusKey: .read, flag: true) - } - } - }.store(in: &cancellables) + $selectedArticles + .filter { $0.count == 1 } + .compactMap { $0.first } + .filter { !$0.status.read } + .sink { markArticles(Set([$0]), statusKey: .read, flag: true) } + .store(in: &cancellables) } // MARK: API