@@ -529,20 +529,18 @@ public extension MailboxManager {
529
529
530
530
return isInFolder && isSnoozed && isLastMessageFromThreadNotSnoozed
531
531
}
532
- } . freeze ( )
532
+ } . freezeIfNeeded ( )
533
533
534
534
guard !threadsToUnsnooze. isEmpty else { return }
535
535
536
536
let unsnoozedMessages : [ String ] = await Array ( threadsToUnsnooze) . concurrentCompactMap ( customConcurrency: 4 ) { thread in
537
- guard let lastMessageSnoozed = thread. messages. last ( where: { $0. isSnoozed } ) else {
538
- return nil
539
- }
537
+ guard let lastMessageSnoozed = thread. messages. last ( where: { $0. isSnoozed } ) else { return nil }
540
538
541
539
do {
542
540
try await self . apiFetcher. deleteSnooze ( message: lastMessageSnoozed, mailbox: self . mailbox)
543
541
return lastMessageSnoozed. uid
544
542
} catch let error as MailApiError where error == . apiMessageNotSnoozed {
545
- self . unsnoozeThreadInRealm ( )
543
+ self . manuallyUnsnoozeThreadInRealm ( thread : thread )
546
544
return nil
547
545
} catch {
548
546
SentrySDK . capture ( message: " Impossible to automatically unsnooze thread " ) { scope in
@@ -571,8 +569,22 @@ public extension MailboxManager {
571
569
}
572
570
}
573
571
574
- private func unsnoozeThreadInRealm( ) {
572
+ private func manuallyUnsnoozeThreadInRealm( thread: Thread ) {
573
+ try ? writeTransaction { writableRealm in
574
+ guard let freshThread = thread. fresh ( using: writableRealm) else { return }
575
+
576
+ for message in freshThread. messages {
577
+ message. snoozeState = nil
578
+ message. snoozeUuid = nil
579
+ message. snoozeEndDate = nil
580
+ }
575
581
582
+ try ? freshThread. recomputeOrFail ( )
583
+ let duplicatesThreads = Set ( freshThread. duplicates. flatMap { $0. threads } )
584
+ for duplicateThread in duplicatesThreads {
585
+ try ? duplicateThread. recomputeOrFail ( )
586
+ }
587
+ }
576
588
}
577
589
578
590
// MARK: - Utils
0 commit comments