diff --git a/Mail/Views/Thread/MoveEmailView.swift b/Mail/Views/Thread/MoveEmailView.swift index b91fe5da1..dc10854cd 100644 --- a/Mail/Views/Thread/MoveEmailView.swift +++ b/Mail/Views/Thread/MoveEmailView.swift @@ -43,20 +43,33 @@ struct MoveEmailView: View { typealias MoveHandler = (Folder) -> Void // swiftlint:disable empty_count - @ObservedResults(Folder.self, where: { $0.role != .draft && $0.parents.count == 0 && $0.toolType == nil }) var folders + @ObservedResults(Folder.self, where: { $0.role != .draft && $0.toolType == nil }) var folders @State private var isShowingCreateFolderAlert = false + private var filteredFolders: [NestableFolder] { + guard !searchFilter.isEmpty else { + return NestableFolder.createFoldersHierarchy(from: Array(folders.where { $0.parents.count == 0 })) + } + return folders.filter { + let filter = searchFilter.folding(options: [.caseInsensitive, .diacriticInsensitive], locale: .current) + return $0.verifyFilter(filter) + }.map { NestableFolder(content: $0, children: []) } + } + + @State private var searchFilter = "" + let moveAction: MoveAction var body: some View { ScrollView { LazyVStack(spacing: 0) { - listOfFolders(nestableFolders: NestableFolder - .createFoldersHierarchy(from: Array(folders.where { $0.role != nil }))) - IKDivider(horizontalPadding: 8) - listOfFolders(nestableFolders: NestableFolder - .createFoldersHierarchy(from: Array(folders.where { $0.role == nil }))) + listOfFolders(nestableFolders: filteredFolders.filter { $0.content.role != nil }) + if searchFilter.isEmpty { + IKDivider(horizontalPadding: 8) + } + listOfFolders(nestableFolders: filteredFolders.filter { $0.content.role == nil }) } + .searchable(text: $searchFilter, placement: .navigationBarDrawer(displayMode: .always)) } .navigationTitle(MailResourcesStrings.Localizable.actionMove) .navigationBarTitleDisplayMode(.inline) diff --git a/MailCore/Models/Folder.swift b/MailCore/Models/Folder.swift index f58ae0274..649b8b3ef 100644 --- a/MailCore/Models/Folder.swift +++ b/MailCore/Models/Folder.swift @@ -198,6 +198,10 @@ public class Folder: Object, Codable, Comparable, Identifiable { } return true } + + public func verifyFilter(_ filter: String) -> Bool { + return localizedName.folding(options: [.caseInsensitive, .diacriticInsensitive], locale: .current).contains(filter) + } enum CodingKeys: String, CodingKey { case _id = "id"