diff --git a/Multiplatform/Shared/SceneModel.swift b/Multiplatform/Shared/SceneModel.swift index 682060f28..3bd922d37 100644 --- a/Multiplatform/Shared/SceneModel.swift +++ b/Multiplatform/Shared/SceneModel.swift @@ -73,7 +73,7 @@ final class SceneModel: ObservableObject { /// Toggles the star status for the selected articles func toggleStarredStatusForSelectedArticles() { -// timelineModel.toggleStarredStatusForSelectedArticles() + timelineModel.toggleStarredStatusForSelectedArticlesSubject.send() } /// Opens the selected article in an external browser diff --git a/Multiplatform/Shared/Timeline/TimelineModel.swift b/Multiplatform/Shared/Timeline/TimelineModel.swift index 77c8a25f3..0c8773acf 100644 --- a/Multiplatform/Shared/Timeline/TimelineModel.swift +++ b/Multiplatform/Shared/Timeline/TimelineModel.swift @@ -37,7 +37,7 @@ class TimelineModel: ObservableObject, UndoableCommandRunner { var articleStatusChangePublisher: AnyPublisher, Never>? var toggleReadStatusForSelectedArticlesSubject = PassthroughSubject() - + var toggleStarredStatusForSelectedArticlesSubject = PassthroughSubject() var readFilterEnabledTable = [FeedIdentifier: Bool]() @@ -270,8 +270,21 @@ private extension TimelineModel { return (selectedArticles, ArticleStatus.Key.read, false) } } + + let toggleStarred = toggleStarredStatusForSelectedArticlesSubject + .withLatestFrom(selectedArticlesPublisher) + .filter { !$0.isEmpty } + .map {selectedArticles -> ([Article], ArticleStatus.Key, Bool) in + if selectedArticles.anyArticleIsUnstarred() { + return (selectedArticles, ArticleStatus.Key.starred, true) + } else { + return (selectedArticles, ArticleStatus.Key.read, false) + } + } + toggleReadPublisher + .merge(with: toggleStarred) .sink { [weak self] (articles, key, flag) in if let undoManager = self?.undoManager, let markReadCommand = MarkStatusCommand(initialArticles: articles, statusKey: key, flag: flag, undoManager: undoManager) {