Skip to content

Commit

Permalink
Merge pull request #905 from Infomaniak/update-signatures-dictionnary
Browse files Browse the repository at this point in the history
feat(DraftContentManager): Use Dictionary(grouping:, by:)
  • Loading branch information
valentinperignon committed Jul 28, 2023
2 parents bbdba83 + 820f8fa commit 6b9fc7d
Showing 1 changed file with 5 additions and 9 deletions.
14 changes: 5 additions & 9 deletions MailCore/Cache/DraftContentManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -201,16 +201,12 @@ public class DraftContentManager: ObservableObject {
private func guessMostFittingSignature(userSignatures: [Signature], defaultSignature: Signature) -> Signature {
guard let previousMessage = messageReply?.message else { return defaultSignature }

var signaturesAssociatedToEmail = [String: [Signature]]()
for signature in userSignatures {
signaturesAssociatedToEmail[signature.senderEmail, default: []].append(signature)
}

let signaturesGroupedByEmail = Dictionary(grouping: userSignatures, by: \.senderEmail)
let recipientsFieldsToCheck = [\Message.to, \Message.from, \Message.cc]
for field in recipientsFieldsToCheck {
if let signature = findSignatureInRecipients(
recipients: previousMessage[keyPath: field],
signaturesAssociatedToEmail: signaturesAssociatedToEmail
signaturesGroupedByEmail: signaturesGroupedByEmail
) {
return signature.freezeIfNeeded()
}
Expand All @@ -220,15 +216,15 @@ public class DraftContentManager: ObservableObject {
}

private func findSignatureInRecipients(recipients: List<Recipient>,
signaturesAssociatedToEmail: [String: [Signature]]) -> Signature? {
let matchingEmailRecipients = recipients.filter { signaturesAssociatedToEmail[$0.email] != nil }.toArray()
signaturesGroupedByEmail: [String: [Signature]]) -> Signature? {
let matchingEmailRecipients = recipients.filter { signaturesGroupedByEmail[$0.email] != nil }.toArray()
guard !matchingEmailRecipients.isEmpty else { return nil }

var bestSignature: Signature?
var bestMatchingScore: SignatureMatch?

for recipient in matchingEmailRecipients {
guard let signatures = signaturesAssociatedToEmail[recipient.email],
guard let signatures = signaturesGroupedByEmail[recipient.email],
let (signature, computedScore) = computeScore(for: signatures, recipient: recipient) else { continue }

if computedScore == .exactMatchDefault {
Expand Down

0 comments on commit 6b9fc7d

Please sign in to comment.