Skip to content

Commit 251ed2b

Browse files
fix(UndoAction): Refresh folders in the correct order
1 parent 7107562 commit 251ed2b

File tree

6 files changed

+49
-22
lines changed

6 files changed

+49
-22
lines changed

MailCore/Cache/MailboxManager/MailboxManager+Folders.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import Foundation
2020
import InfomaniakCore
21+
import OrderedCollections
2122
import RealmSwift
2223

2324
// MARK: - Folders
@@ -129,6 +130,10 @@ public extension MailboxManager {
129130
return try await refreshActor.flushFolder(folder: folder, mailbox: mailbox, apiFetcher: apiFetcher)
130131
}
131132

133+
func refreshFolders(folders: OrderedSet<Folder>) async throws {
134+
try await refreshActor.refreshFolders(folders: folders)
135+
}
136+
132137
func refreshFolder(from messages: [Message], additionalFolder: Folder?) async throws {
133138
try await refreshActor.refreshFolder(from: messages, additionalFolder: additionalFolder)
134139
}

MailCore/Cache/MailboxManager/MailboxManager+Message.swift

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import Foundation
2020
import InfomaniakDI
21+
import OrderedCollections
2122
import RealmSwift
2223

2324
// MARK: - Message
@@ -99,26 +100,27 @@ public extension MailboxManager {
99100
}
100101

101102
func move(messages: [Message], to folder: Folder, origin: Folder? = nil) async throws -> UndoAction {
102-
return try await performMoveAction(
103-
messages: messages,
104-
origin: origin
105-
) { uuid, chunk in
103+
return try await performMoveAction(messages: messages, from: origin, to: folder) { uuid, chunk in
106104
try await self.apiFetcher.move(mailboxUuid: uuid, messages: chunk, destinationId: folder.remoteId)
107105
}
108106
}
109107

110108
func reportSpam(messages: [Message], origin: Folder?) async throws -> UndoAction {
109+
guard let spamFolder = getFolder(with: .spam)?.freeze() else { throw MailError.folderNotFound }
110+
111111
return try await performMoveAction(
112112
messages: messages,
113-
origin: origin
113+
from: origin,
114+
to: spamFolder,
114115
) { uuid, chunk in
115116
try await self.apiFetcher.reportSpams(mailboxUuid: uuid, messages: chunk)
116117
}
117118
}
118119

119120
func performMoveAction(
120121
messages: [Message],
121-
origin: Folder?,
122+
from origin: Folder?,
123+
to destination: Folder,
122124
action: @escaping (String, [Message]) async throws -> UndoResponse
123125
) async throws -> UndoAction {
124126
await markMovedLocallyIfNecessary(true, messages: messages, folder: origin)
@@ -133,9 +135,9 @@ public extension MailboxManager {
133135
}
134136

135137
Task {
136-
try await refreshFolder(from: messages, additionalFolder: origin)
138+
try await refreshFolder(from: messages, additionalFolder: destination)
137139
}
138-
return undoAction(for: response, and: messages)
140+
return undoAction(for: response, messages: messages, origin: origin, destination: destination)
139141
}
140142

141143
func delete(messages: [Message]) async throws {
@@ -200,9 +202,16 @@ public extension MailboxManager {
200202
try await refreshFolder(from: messages, additionalFolder: nil)
201203
}
202204

203-
private func undoAction(for cancellableResponses: [UndoResponse], and messages: [Message]) -> UndoAction {
205+
private func undoAction(
206+
for cancellableResponses: [UndoResponse],
207+
messages: [Message],
208+
origin: Folder?,
209+
destination: Folder?
210+
) -> UndoAction {
204211
let afterUndo = {
205-
try await self.refreshFolder(from: messages, additionalFolder: nil)
212+
let foldersToRefresh = [destination, origin].compactMap(\.self) + messages.compactMap(\.folder)
213+
214+
try await self.refreshFolders(folders: OrderedSet(foldersToRefresh))
206215
return true
207216
}
208217
let undo = {

MailCore/Cache/RefreshActor.swift

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
along with this program. If not, see <http://www.gnu.org/licenses/>.
1717
*/
1818

19+
import Collections
1920
import Foundation
2021
import InfomaniakCore
2122
import InfomaniakCoreCommonUI
@@ -47,19 +48,11 @@ public actor RefreshActor {
4748
return response
4849
}
4950

50-
public func refreshFolder(from messages: [Message], additionalFolder: Folder?) async throws {
51+
public func refreshFolders(folders: OrderedSet<Folder>) async throws {
5152
let updateFolders = Task {
52-
var folders = messages.map(\.folder)
53-
if let additionalFolder {
54-
folders.append(additionalFolder)
55-
}
56-
57-
let orderedSet = NSOrderedSet(array: folders as [Any])
58-
59-
for folder in orderedSet {
53+
for folder in folders {
6054
guard !Task.isCancelled else { break }
61-
guard let impactedFolder = folder as? Folder else { continue }
62-
await refreshFolderContent(impactedFolder)
55+
await refreshFolderContent(folder)
6356
}
6457
}
6558

@@ -79,6 +72,15 @@ public actor RefreshActor {
7972
expiringActivity.endAll()
8073
}
8174

75+
public func refreshFolder(from messages: [Message], additionalFolder: Folder?) async throws {
76+
var folders = messages.compactMap(\.folder)
77+
if let additionalFolder {
78+
folders.append(additionalFolder)
79+
}
80+
81+
try await refreshFolders(folders: OrderedSet(folders))
82+
}
83+
8284
public func refreshFolderContent(_ folder: Folder) async {
8385
await cancelRefresh()
8486

Project.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ let project = Project(name: "Mail",
288288
.external(name: "Alamofire"),
289289
.external(name: "Algorithms"),
290290
.external(name: "Atlantis"),
291+
.external(name: "Collections"),
291292
.external(name: "DesignSystem"),
292293
.external(name: "InfomaniakBugTracker"),
293294
.external(name: "InfomaniakConcurrency"),

Tuist/Package.resolved

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,15 @@
243243
"version" : "1.2.1"
244244
}
245245
},
246+
{
247+
"identity" : "swift-collections",
248+
"kind" : "remoteSourceControl",
249+
"location" : "https://github.com/apple/swift-collections",
250+
"state" : {
251+
"revision" : "671108c96644956dddcd89dd59c203dcdb36cec7",
252+
"version" : "1.1.4"
253+
}
254+
},
246255
{
247256
"identity" : "swift-concurrency",
248257
"kind" : "remoteSourceControl",

Tuist/Package.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ let package = Package(
7878
.package(url: "https://github.com/shaps80/SwiftUIBackports", .upToNextMajor(from: "1.15.1")),
7979
.package(url: "https://github.com/httpswift/swifter", .upToNextMajor(from: "1.5.0")),
8080
.package(url: "https://github.com/SVGKit/SVGKit.git", branch: "3.x"),
81-
.package(url: "https://github.com/Infomaniak/swift-rich-html-editor.git", .upToNextMajor(from: "1.1.1"))
81+
.package(url: "https://github.com/Infomaniak/swift-rich-html-editor.git", .upToNextMajor(from: "1.1.1")),
82+
.package(url: "https://github.com/apple/swift-collections", .upToNextMajor(from: "1.1.4")),
8283
]
8384
)

0 commit comments

Comments
 (0)