diff --git a/Multiplatform/Shared/Sidebar/SidebarContextMenu.swift b/Multiplatform/Shared/Sidebar/SidebarContextMenu.swift index e01b65a69..f98146993 100644 --- a/Multiplatform/Shared/Sidebar/SidebarContextMenu.swift +++ b/Multiplatform/Shared/Sidebar/SidebarContextMenu.swift @@ -123,7 +123,7 @@ struct SidebarContextMenu: View { } Divider() Button { -// sidebarModel.deleteItems(item: sidebarItem) + sidebarModel.deleteFromAccount.send(sidebarItem.feed!) } label: { Text("Delete") #if os(iOS) @@ -155,7 +155,7 @@ struct SidebarContextMenu: View { } Divider() Button { -// sidebarModel.deleteItems(item: sidebarItem) + sidebarModel.deleteFromAccount.send(sidebarItem.feed!) } label: { Text("Delete") #if os(iOS) diff --git a/Multiplatform/Shared/Sidebar/SidebarModel.swift b/Multiplatform/Shared/Sidebar/SidebarModel.swift index db7500080..351f36ef9 100644 --- a/Multiplatform/Shared/Sidebar/SidebarModel.swift +++ b/Multiplatform/Shared/Sidebar/SidebarModel.swift @@ -30,6 +30,7 @@ class SidebarModel: ObservableObject, UndoableCommandRunner { var selectNextUnread = PassthroughSubject() var markAllAsReadInFeed = PassthroughSubject() var markAllAsReadInAccount = PassthroughSubject() + var deleteFromAccount = PassthroughSubject() private var cancellables = Set() @@ -42,58 +43,11 @@ class SidebarModel: ObservableObject, UndoableCommandRunner { subscribeToNextUnread() subscribeToMarkAllAsReadInFeed() subscribeToMarkAllAsReadInAccount() + subscribeToDeleteFromAccount() } } -// MARK: Side Context Menu Actions - -private extension SidebarModel { - - func deleteItems(item: SidebarItem) { -// #if os(macOS) -// if selectedFeeds.count > 0 { -// for feed in selectedFeeds { -// if feed is WebFeed { -// print(feed.nameForDisplay) -// let account = (feed as! WebFeed).account -// account?.removeWebFeed(feed as! WebFeed) -// } -// if feed is Folder { -// let account = (feed as! Folder).account -// account?.removeFolder(feed as! Folder, completion: { (result) in -// switch result { -// case .success( _): -// print("Deleted folder") -// case .failure(let err): -// print(err.localizedDescription) -// } -// }) -// } -// } -// } -// #else -// if item.feed is WebFeed { -// let account = (item.feed as! WebFeed).account -// account?.removeWebFeed(item.feed as! WebFeed) -// } -// if item.feed is Folder { -// let account = (item.feed as! Folder).account -// account?.removeFolder(item.feed as! Folder, completion: { (result) in -// switch result { -// case .success( _): -// print("Deleted folder") -// case .failure(let err): -// print(err.localizedDescription) -// } -// }) -// } -// #endif - } -} - - - // MARK: Private private extension SidebarModel { @@ -208,11 +162,34 @@ private extension SidebarModel { .store(in: &cancellables) } + func subscribeToDeleteFromAccount() { + guard let selectedFeedsPublisher = selectedFeedsPublisher else { return } + + deleteFromAccount + .withLatestFrom(selectedFeedsPublisher, resultSelector: { givenFeed, selectedFeeds -> [Feed] in + if selectedFeeds.contains(where: { $0.feedID == givenFeed.feedID }) { + return selectedFeeds + } else { + return [givenFeed] + } + }) + .sink { feeds in + for feed in feeds { + if let webFeed = feed as? WebFeed { + webFeed.account?.removeWebFeed(webFeed) + } + if let folder = feed as? Folder { + folder.account?.removeFolder(folder) { _ in } + } + } + } + .store(in: &cancellables) + } /// Marks provided artices as read. /// - Parameter articles: An array of `Article`s. /// - Warning: An `UndoManager` is created here as the `Environment`'s undo manager appears to be `nil`. - private func markAllAsRead(_ articles: [Article]) { + func markAllAsRead(_ articles: [Article]) { guard let undoManager = undoManager ?? UndoManager(), let markAsReadCommand = MarkStatusCommand(initialArticles: articles, markingRead: true, undoManager: undoManager) else { return