Skip to content

Commit d00af39

Browse files
fix: Hide role folder in menuDrawer tree (#1775)
2 parents 6cfb00d + d3c423f commit d00af39

File tree

5 files changed

+34
-11
lines changed

5 files changed

+34
-11
lines changed

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

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,17 @@ struct FolderCell: View {
9595
}
9696
}
9797

98-
if folder.frozenContent.isExpanded || cellType == .move {
98+
if (folder.frozenContent.isExpanded && folder.frozenContent.hasSubFolders) || cellType == .move {
9999
ForEach(folder.children) { child in
100-
FolderCell(
101-
folder: child,
102-
level: level + 1,
103-
currentFolderId: currentFolderId,
104-
canCollapseSubFolders: canCollapseSubFolders,
105-
customCompletion: customCompletion
106-
)
100+
if child.frozenContent.role == nil || child.frozenContent.hasSubFolders {
101+
FolderCell(
102+
folder: child,
103+
level: level + 1,
104+
currentFolderId: currentFolderId,
105+
canCollapseSubFolders: canCollapseSubFolders,
106+
customCompletion: customCompletion
107+
)
108+
}
107109
}
108110
}
109111
}
@@ -152,12 +154,15 @@ struct FolderCellContent: View {
152154
canCollapseSubFolders && cellType == .menuDrawer
153155
}
154156

157+
private var shouldHaveChevron: Bool
158+
155159
init(frozenFolder: Folder, level: Int, isCurrentFolder: Bool, canCollapseSubFolders: Bool = false) {
156160
assert(frozenFolder.isFrozen, "expecting frozenFolder to be frozen")
157161
self.frozenFolder = frozenFolder
158162
self.level = min(level, Self.maximumSubFolderLevel)
159163
self.isCurrentFolder = isCurrentFolder
160164
self.canCollapseSubFolders = canCollapseSubFolders
165+
shouldHaveChevron = frozenFolder.hasSubFolders && level == 0
161166
}
162167

163168
var body: some View {
@@ -169,7 +174,7 @@ struct FolderCellContent: View {
169174
}
170175
.accessibilityLabel(MailResourcesStrings.Localizable
171176
.contentDescriptionButtonExpandFolder(frozenFolder.name))
172-
.opacity(level == 0 && !frozenFolder.children.isEmpty ? 1 : 0)
177+
.opacity(shouldHaveChevron ? 1 : 0)
173178
}
174179

175180
HStack(spacing: IKPadding.menuDrawerCellSpacing) {

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.children.isEmpty }
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/Cache/MailboxManager/MailboxManager.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public final class MailboxManager: ObservableObject, MailboxManageable {
7575
let realmName = "\(mailbox.userId)-\(mailbox.mailboxId).realm"
7676
realmConfiguration = Realm.Configuration(
7777
fileURL: MailboxManager.constants.rootDocumentsURL.appendingPathComponent(realmName),
78-
schemaVersion: 41,
78+
schemaVersion: 42,
7979
migrationBlock: { migration, oldSchemaVersion in
8080
// No migration needed from 0 to 16
8181
if oldSchemaVersion < 17 {

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>? {

0 commit comments

Comments
 (0)