diff --git a/Mail/Views/Bottom sheets/Actions/ActionsViewModel.swift b/Mail/Views/Bottom sheets/Actions/ActionsViewModel.swift index 98722a829..11a00945f 100644 --- a/Mail/Views/Bottom sheets/Actions/ActionsViewModel.swift +++ b/Mail/Views/Bottom sheets/Actions/ActionsViewModel.swift @@ -438,18 +438,12 @@ enum ActionsTarget: Equatable, Identifiable { } private func star() async throws { - switch target { - case .threads(let threads, _): - await tryOrDisplayError { + await tryOrDisplayError { + switch target { + case .threads(let threads, _): try await mailboxManager.toggleStar(threads: threads) - } - case .message(let message): - await tryOrDisplayError { - if message.flagged { - _ = try await mailboxManager.unstar(messages: [message]) - } else { - _ = try await mailboxManager.star(messages: [message]) - } + case .message(let message): + try await mailboxManager.toggleStar(messages: [message]) } } } diff --git a/MailCore/Cache/MailboxManager.swift b/MailCore/Cache/MailboxManager.swift index 0abe94cc8..cf663a616 100644 --- a/MailCore/Cache/MailboxManager.swift +++ b/MailCore/Cache/MailboxManager.swift @@ -410,18 +410,10 @@ public class MailboxManager: ObservableObject { } public func toggleStar(threads: [Thread]) async throws { - if threads.contains(where: { !$0.flagged }) { - let messages = threads.flatMap { thread in - thread.lastMessageAndItsDuplicateToExecuteAction(currentMailboxEmail: mailbox.email) - } - _ = try await star(messages: messages) - } else { - var messages = threads.flatMap { thread in - thread.messages.where { $0.isDraft == false } - } - messages.append(contentsOf: messages.flatMap(\.duplicates)) - _ = try await unstar(messages: messages) + let messagesToToggleStar = threads.flatMap { thread in + thread.lastMessageAndItsDuplicateToExecuteAction(currentMailboxEmail: mailbox.email) } + try await toggleStar(messages: messagesToToggleStar) } // MARK: - Search @@ -1092,13 +1084,25 @@ public class MailboxManager: ObservableObject { try await refreshFolder(from: messages) } - public func star(messages: [Message]) async throws -> MessageActionResult { + public func toggleStar(messages: [Message]) async throws { + if messages.contains(where: { !$0.flagged }) { + let messagesToStar = messages + messages.flatMap(\.duplicates) + _ = try await star(messages: messagesToStar) + } else { + let messagesToUnstar = messages + .compactMap { $0.originalThread?.messages.where { $0.isDraft == false } } + .flatMap { $0 + $0.flatMap(\.duplicates) } + _ = try await unstar(messages: messagesToUnstar) + } + } + + private func star(messages: [Message]) async throws -> MessageActionResult { let response = try await apiFetcher.star(mailbox: mailbox, messages: messages) try await refreshFolder(from: messages) return response } - public func unstar(messages: [Message]) async throws -> MessageActionResult { + private func unstar(messages: [Message]) async throws -> MessageActionResult { let response = try await apiFetcher.unstar(mailbox: mailbox, messages: messages) try await refreshFolder(from: messages) return response