Skip to content

Commit b022073

Browse files
committed
fix: Compute hasSubFolders in mailboxManager
1 parent f7982d5 commit b022073

File tree

5 files changed

+25
-22
lines changed

5 files changed

+25
-22
lines changed

Mail/Views/Menu Drawer/Folders/FolderCell.swift

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@ struct FolderCell: View {
6363
frozenFolder: folder.frozenContent,
6464
level: level,
6565
isCurrentFolder: isCurrentFolder,
66-
canCollapseSubFolders: canCollapseSubFolders,
67-
shouldHaveChevron: folder.hasSubFolders
66+
canCollapseSubFolders: canCollapseSubFolders
6867
)
6968
}
7069
.accessibilityAction(.default) {
@@ -87,8 +86,7 @@ struct FolderCell: View {
8786
frozenFolder: folder.frozenContent,
8887
level: level,
8988
isCurrentFolder: isCurrentFolder,
90-
canCollapseSubFolders: canCollapseSubFolders,
91-
shouldHaveChevron: folder.hasSubFolders
89+
canCollapseSubFolders: canCollapseSubFolders
9290
)
9391
}
9492
}
@@ -97,9 +95,9 @@ struct FolderCell: View {
9795
}
9896
}
9997

100-
if (folder.frozenContent.isExpanded && folder.hasSubFolders) || cellType == .move {
98+
if (folder.frozenContent.isExpanded && folder.frozenContent.hasSubFolders) || cellType == .move {
10199
ForEach(folder.children) { child in
102-
if child.frozenContent.role == nil || child.hasSubFolders {
100+
if child.frozenContent.role == nil || child.frozenContent.hasSubFolders {
103101
FolderCell(
104102
folder: child,
105103
level: level + 1,
@@ -158,13 +156,13 @@ struct FolderCellContent: View {
158156

159157
private var shouldHaveChevron: Bool
160158

161-
init(frozenFolder: Folder, level: Int, isCurrentFolder: Bool, canCollapseSubFolders: Bool = false, shouldHaveChevron: Bool) {
159+
init(frozenFolder: Folder, level: Int, isCurrentFolder: Bool, canCollapseSubFolders: Bool = false) {
162160
assert(frozenFolder.isFrozen, "expecting frozenFolder to be frozen")
163161
self.frozenFolder = frozenFolder
164162
self.level = min(level, Self.maximumSubFolderLevel)
165163
self.isCurrentFolder = isCurrentFolder
166164
self.canCollapseSubFolders = canCollapseSubFolders
167-
self.shouldHaveChevron = shouldHaveChevron && level == 0
165+
shouldHaveChevron = frozenFolder.hasSubFolders && level == 0
168166
}
169167

170168
var body: some View {

Mail/Views/Menu Drawer/Folders/FoldersListView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ struct FoldersListView: View {
3232
private let hasSubFolders: Bool
3333
init(folders: [NestableFolder]) {
3434
self.folders = folders
35-
hasSubFolders = folders.contains { $0.hasSubFolders }
35+
hasSubFolders = folders.contains { $0.frozenContent.hasSubFolders }
3636
}
3737

3838
var body: some View {

MailCore/Cache/MailboxManager/MailboxManager+Folders.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,19 @@ import RealmSwift
2424
// MARK: - Folders
2525

2626
public extension MailboxManager {
27+
func hasSubFolders(folder: Folder) -> Bool {
28+
let filteredChild = folder.children.filter { $0.role == nil }
29+
if !filteredChild.isEmpty {
30+
return true
31+
}
32+
for child in folder.children {
33+
if hasSubFolders(folder: child) {
34+
return true
35+
}
36+
}
37+
return false
38+
}
39+
2740
/// Get all remote folders in DB
2841
func refreshAllFolders() async throws {
2942
guard ReachabilityListener.instance.currentStatus != .offline else {
@@ -32,7 +45,11 @@ public extension MailboxManager {
3245

3346
let folderResult = try await apiFetcher.folders(mailbox: mailbox)
3447
let filteredFolderResult = filterOutUnknownFolders(folderResult)
48+
3549
let newFolders = getSubFolders(from: filteredFolderResult)
50+
for folder in newFolders {
51+
folder.hasSubFolders = hasSubFolders(folder: folder)
52+
}
3653

3754
try? writeTransaction { writableRealm in
3855
let foldersByRole = Dictionary(grouping: newFolders, by: \.role)

MailCore/Models/Folder.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ public class Folder: Object, Codable, Comparable, Identifiable {
188188
@Persisted public var threadsSource: Folder?
189189
@Persisted public var associatedFolders: RealmSwift.List<Folder>
190190

191+
@Persisted public var hasSubFolders = false
191192
@Persisted public var isAcceptingMove = true
192193

193194
public var listChildren: AnyRealmCollection<Folder>? {

MailCore/Models/NestableFolder.swift

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,6 @@ public struct NestableFolder: Identifiable {
3131
/// `NestableFolder` childs
3232
public let children: [NestableFolder]
3333

34-
public var hasSubFolders: Bool {
35-
let filteredChild = children.filter { $0.frozenContent.role == nil }
36-
if !filteredChild.isEmpty {
37-
return true
38-
}
39-
for child in children {
40-
if child.hasSubFolders {
41-
return true
42-
}
43-
}
44-
return false
45-
}
46-
4734
public init(content: Folder, children: [NestableFolder]) {
4835
frozenContent = content.freezeIfNeeded()
4936
self.children = children

0 commit comments

Comments
 (0)