Skip to content

Commit

Permalink
Merge pull request #725 from Infomaniak/actions
Browse files Browse the repository at this point in the history
fix: get last message not from me for Star, Unread and Reply
  • Loading branch information
PhilippeWeidmann committed May 3, 2023
2 parents dd66513 + 96e80bc commit 6130c44
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 31 deletions.
52 changes: 28 additions & 24 deletions Mail/Views/Bottom sheets/Actions/ActionsViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -179,18 +179,18 @@ enum ActionsTarget: Equatable {

var isInvalidated: Bool {
switch self {
case let .threads(threads, _):
case .threads(let threads, _):
return threads.contains(where: \.isInvalidated)
case let .message(message):
case .message(let message):
return message.isInvalidated
}
}

func freeze() -> Self {
switch self {
case let .threads(threads, isMultiSelectionEnabled):
case .threads(let threads, let isMultiSelectionEnabled):
return .threads(threads.map { $0.freezeIfNeeded() }, isMultiSelectionEnabled)
case let .message(message):
case .message(let message):
return .message(message.freezeIfNeeded())
}
}
Expand Down Expand Up @@ -236,7 +236,7 @@ enum ActionsTarget: Equatable {

private func setActions() {
switch target {
case let .threads(threads, _):
case .threads(let threads, _):
if threads.count > 1 {
let spam = threads.allSatisfy { $0.folder?.role == .spam }
let unread = threads.allSatisfy(\.hasUnseenMessages)
Expand Down Expand Up @@ -267,7 +267,7 @@ enum ActionsTarget: Equatable {

listActions = tempListActions.compactMap { $0 }
}
case let .message(message):
case .message(let message):
quickActions = Action.quickActions

let archive = message.folder?.role != .archive
Expand All @@ -292,8 +292,12 @@ enum ActionsTarget: Equatable {
state.close()
globalSheet.close()
if let matomoCategory, let matomoName = action.matomoName {
if case let .threads(threads, isMultipleSelectionEnabled) = target, isMultipleSelectionEnabled {
matomo.trackBulkEvent(eventWithCategory: matomoCategory, name: matomoName.capitalized, numberOfItems: threads.count)
if case .threads(let threads, let isMultipleSelectionEnabled) = target, isMultipleSelectionEnabled {
matomo.trackBulkEvent(
eventWithCategory: matomoCategory,
name: matomoName.capitalized,
numberOfItems: threads.count
)
} else {
matomo.track(eventWithCategory: matomoCategory, name: matomoName)
}
Expand Down Expand Up @@ -345,11 +349,11 @@ enum ActionsTarget: Equatable {
let undoRedoAction: UndoRedoAction
let snackBarMessage: String
switch target {
case let .threads(threads, _):
case .threads(let threads, _):
guard threads.first?.folder != folder else { return }
undoRedoAction = try await mailboxManager.move(threads: threads, to: folder)
snackBarMessage = MailResourcesStrings.Localizable.snackbarThreadsMoved(folder.localizedName)
case let .message(message):
case .message(let message):
guard message.folderId != folder.id else { return }
var messages = [message]
messages.append(contentsOf: message.duplicates)
Expand All @@ -372,40 +376,40 @@ enum ActionsTarget: Equatable {

private func delete() async throws {
switch target {
case let .threads(threads, _):
case .threads(let threads, _):
try await mailboxManager.moveOrDelete(threads: threads)
case let .message(message):
case .message(let message):
try await mailboxManager.moveOrDelete(message: message)
}
}

private func reply(mode: ReplyMode) async throws {
switch target {
case let .threads(threads, _):
case .threads(let threads, _):
// We don't handle this action in multiple selection
guard threads.count == 1, let thread = threads.first,
let message = thread.messages.last(where: { !$0.isDraft }) else { break }
let message = thread.lastMessageToExecuteAction() else { break }
replyHandler?(message, mode)
case let .message(message):
case .message(let message):
replyHandler?(message, mode)
}
}

private func toggleRead() async throws {
switch target {
case let .threads(threads, _):
case .threads(let threads, _):
try await mailboxManager.toggleRead(threads: threads)
case let .message(message):
case .message(let message):
try await mailboxManager.markAsSeen(message: message, seen: !message.seen)
}
}

private func move() {
let folderId: String?
switch target {
case let .threads(threads, _):
case .threads(let threads, _):
folderId = threads.first?.folder?.id
case let .message(message):
case .message(let message):
folderId = message.folderId
}

Expand All @@ -423,11 +427,11 @@ enum ActionsTarget: Equatable {

private func star() async throws {
switch target {
case let .threads(threads, _):
case .threads(let threads, _):
await tryOrDisplayError {
try await mailboxManager.toggleStar(threads: threads)
}
case let .message(message):
case .message(let message):
await tryOrDisplayError {
if message.flagged {
_ = try await mailboxManager.unstar(messages: [message])
Expand All @@ -444,7 +448,7 @@ enum ActionsTarget: Equatable {

private func block() async throws {
// This action is only available on a single message
guard case let .message(message) = target else { return }
guard case .message(let message) = target else { return }
let response = try await mailboxManager.apiFetcher.blockSender(message: message)
if response {
IKSnackBar.showSnackBar(message: MailResourcesStrings.Localizable.snackbarSenderBlacklisted(1))
Expand All @@ -453,7 +457,7 @@ enum ActionsTarget: Equatable {

private func phishing() async throws {
// This action is only available on a single message
guard case let .message(message) = target else { return }
guard case .message(let message) = target else { return }
globalAlert?.state = .reportPhishing(message: message)
}

Expand All @@ -464,7 +468,7 @@ enum ActionsTarget: Equatable {

private func report() {
// This action is only available on a single message
guard case let .message(message) = target else { return }
guard case .message(let message) = target else { return }
globalAlert?.state = .reportDisplayProblem(message: message)
}

Expand Down
12 changes: 5 additions & 7 deletions MailCore/Cache/MailboxManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -342,10 +342,9 @@ public class MailboxManager: ObservableObject {
messages.append(contentsOf: messages.flatMap(\.duplicates))
try await markAsSeen(messages: messages, seen: true)
} else {
var messages = threads.compactMap { thread in
thread.messages.last { $0.isDraft == false }
let messages = threads.flatMap { thread in
thread.lastMessageAndItsDuplicateToExecuteAction()
}
messages.append(contentsOf: messages.flatMap(\.duplicates))
try await markAsSeen(messages: messages, seen: false)
}
}
Expand Down Expand Up @@ -406,10 +405,9 @@ public class MailboxManager: ObservableObject {

public func toggleStar(threads: [Thread]) async throws {
if threads.contains(where: { !$0.flagged }) {
var messages = threads.compactMap { thread in
thread.messages.last { $0.isDraft == false }
let messages = threads.flatMap { thread in
thread.lastMessageAndItsDuplicateToExecuteAction()
}
messages.append(contentsOf: messages.flatMap(\.duplicates))
_ = try await star(messages: messages)
} else {
var messages = threads.flatMap { thread in
Expand Down Expand Up @@ -911,7 +909,7 @@ public class MailboxManager: ObservableObject {
"messageId": message.messageId,
"date": message.date,
"seen": message.seen,
"duplicates": message.duplicates.compactMap {$0.messageId},
"duplicates": message.duplicates.compactMap { $0.messageId },
"references": message.references],
"Seen": ["Expected": seen, "Actual": liveMessage.seen],
"Folder": ["id": message.folder?._id,
Expand Down
16 changes: 16 additions & 0 deletions MailCore/Models/Thread.swift
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,22 @@ public class Thread: Object, Decodable, Identifiable {
}
}

public func lastMessageToExecuteAction() -> Message? {
if let message = messages.last(where: { $0.isDraft == false && $0.fromMe == false }) {
return message
} else if let message = messages.last(where: { $0.isDraft == false }) {
return message
}
return messages.last
}

public func lastMessageAndItsDuplicateToExecuteAction() -> [Message] {
guard let lastMessage = lastMessageToExecuteAction() else { return [] }
var messageAndDuplicates = [lastMessage]
messageAndDuplicates.append(contentsOf: lastMessage.duplicates)
return messageAndDuplicates
}

private enum CodingKeys: String, CodingKey {
case uid
case messagesCount
Expand Down

0 comments on commit 6130c44

Please sign in to comment.