From fcaa9b12c510a9cfcc0316c46966100b2519bd2a Mon Sep 17 00:00:00 2001 From: Philippe Weidmann Date: Wed, 19 Apr 2023 15:26:58 +0200 Subject: [PATCH 01/11] refactor(SplitView): MailboxManager as EnvironmentObject --- .../Menu Drawer/Folders/FolderCell.swift | 6 +---- Mail/Views/Menu Drawer/MenuDrawerView.swift | 4 +-- Mail/Views/SplitView.swift | 25 ++++++++----------- Mail/Views/ThreadListManagerView.swift | 6 ++--- 4 files changed, 15 insertions(+), 26 deletions(-) diff --git a/Mail/Views/Menu Drawer/Folders/FolderCell.swift b/Mail/Views/Menu Drawer/Folders/FolderCell.swift index eadbf4762..807873598 100644 --- a/Mail/Views/Menu Drawer/Folders/FolderCell.swift +++ b/Mail/Views/Menu Drawer/Folders/FolderCell.swift @@ -42,7 +42,6 @@ struct FolderCell: View { @Environment(\.folderCellType) var cellType @EnvironmentObject var splitViewManager: SplitViewManager - @EnvironmentObject var mailboxManager: MailboxManager @EnvironmentObject var navigationDrawerState: NavigationDrawerState let folder: NestableFolder @@ -69,10 +68,7 @@ struct FolderCell: View { } } else { NavigationLink(isActive: $shouldTransit) { - ThreadListManagerView( - mailboxManager: mailboxManager, - isCompact: isCompact - ) + ThreadListManagerView(isCompact: isCompact) } label: { Button { if let matomoCategory { diff --git a/Mail/Views/Menu Drawer/MenuDrawerView.swift b/Mail/Views/Menu Drawer/MenuDrawerView.swift index 141a853a7..2bee6e285 100644 --- a/Mail/Views/Menu Drawer/MenuDrawerView.swift +++ b/Mail/Views/Menu Drawer/MenuDrawerView.swift @@ -47,8 +47,7 @@ struct NavigationDrawer: View { private let maxWidth = 350.0 private let spacing = 60.0 - let mailboxManager: MailboxManager - + @EnvironmentObject var mailboxManager: MailboxManager @EnvironmentObject var splitViewManager: SplitViewManager @EnvironmentObject var navigationDrawerState: NavigationDrawerState @Environment(\.window) var window @@ -190,7 +189,6 @@ struct MenuDrawerView: View { } } .background(MailResourcesAsset.backgroundSecondaryColor.swiftUIColor.ignoresSafeArea()) - .environmentObject(mailboxManager) .environment(\.folderCellType, .link) .onAppear { viewModel.createMenuItems(bottomSheet: bottomSheet) diff --git a/Mail/Views/SplitView.swift b/Mail/Views/SplitView.swift index f1ee40d8d..6839ec047 100644 --- a/Mail/Views/SplitView.swift +++ b/Mail/Views/SplitView.swift @@ -51,7 +51,7 @@ public class SplitViewManager: ObservableObject { } struct SplitView: View { - @ObservedObject var mailboxManager: MailboxManager + var mailboxManager: MailboxManager @State var splitViewController: UISplitViewController? @StateObject private var navigationDrawerController = NavigationDrawerState() @@ -79,15 +79,12 @@ struct SplitView: View { if isCompact { ZStack { NavigationView { - ThreadListManagerView( - mailboxManager: mailboxManager, - isCompact: isCompact - ) - .accessibilityHidden(navigationDrawerController.isOpen) + ThreadListManagerView(isCompact: isCompact) + .accessibilityHidden(navigationDrawerController.isOpen) } .navigationViewStyle(.stack) - NavigationDrawer(mailboxManager: mailboxManager) + NavigationDrawer() } } else { NavigationView { @@ -97,10 +94,7 @@ struct SplitView: View { ) .navigationBarHidden(true) - ThreadListManagerView( - mailboxManager: mailboxManager, - isCompact: isCompact - ) + ThreadListManagerView(isCompact: isCompact) EmptyStateView.emptyThread(from: splitViewManager.selectedFolder) } @@ -111,6 +105,7 @@ struct SplitView: View { try await mailboxManager.folders() } } + .environmentObject(mailboxManager) .environmentObject(splitViewManager) .environmentObject(navigationDrawerController) .defaultAppStorage(.shared) @@ -147,7 +142,7 @@ struct SplitView: View { MoreStorageView() case .restoreEmails: RestoreEmailsView(mailboxManager: mailboxManager) - case let .reportJunk(threadBottomSheet, target): + case .reportJunk(let threadBottomSheet, let target): ReportJunkView( mailboxManager: mailboxManager, target: target, @@ -161,11 +156,11 @@ struct SplitView: View { } .customAlert(isPresented: $alert.isShowing) { switch alert.state { - case let .createNewFolder(mode): + case .createNewFolder(let mode): CreateFolderView(mailboxManager: mailboxManager, mode: mode) - case let .reportPhishing(message): + case .reportPhishing(let message): ReportPhishingView(mailboxManager: mailboxManager, message: message) - case let .reportDisplayProblem(message): + case .reportDisplayProblem(let message): ReportDisplayProblemView(mailboxManager: mailboxManager, message: message) case .none: EmptyView() diff --git a/Mail/Views/ThreadListManagerView.swift b/Mail/Views/ThreadListManagerView.swift index fb7939d9a..95839678d 100644 --- a/Mail/Views/ThreadListManagerView.swift +++ b/Mail/Views/ThreadListManagerView.swift @@ -23,13 +23,13 @@ import SwiftUI struct ThreadListManagerView: View { @EnvironmentObject var splitViewManager: SplitViewManager + @EnvironmentObject var mailboxManager: MailboxManager + @State private var shouldNavigateToNotificationThread = false @State private var tappedNotificationThread: Thread? @State private var editedMessageDraft: Draft? @State private var messageReply: MessageReply? - var mailboxManager: MailboxManager - let isCompact: Bool var body: some View { @@ -90,8 +90,8 @@ struct ThreadListManagerView: View { struct ThreadListManagerView_Previews: PreviewProvider { static var previews: some View { ThreadListManagerView( - mailboxManager: PreviewHelper.sampleMailboxManager, isCompact: false ) + .environmentObject(PreviewHelper.sampleMailboxManager) } } From 9daace38b32bda708a5612536d0fb7689067de91 Mon Sep 17 00:00:00 2001 From: Philippe Weidmann Date: Wed, 19 Apr 2023 15:33:15 +0200 Subject: [PATCH 02/11] refactor(ThreadView): MailboxManager as EnvironmentObject --- Mail/Views/Search/SearchThreadsSectionView.swift | 11 ++++------- Mail/Views/Thread List/ThreadListCell.swift | 3 +-- Mail/Views/Thread/ThreadView.swift | 10 ++++------ Mail/Views/ThreadListManagerView.swift | 3 +-- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/Mail/Views/Search/SearchThreadsSectionView.swift b/Mail/Views/Search/SearchThreadsSectionView.swift index a581a7754..36498f4f9 100644 --- a/Mail/Views/Search/SearchThreadsSectionView.swift +++ b/Mail/Views/Search/SearchThreadsSectionView.swift @@ -45,13 +45,10 @@ struct SearchThreadsSectionView: View { } else { ZStack { NavigationLink(destination: { - ThreadView( - mailboxManager: viewModel.mailboxManager, - thread: thread - ) - .onAppear { - viewModel.selectedThread = thread - } + ThreadView(thread: thread) + .onAppear { + viewModel.selectedThread = thread + } }, label: { EmptyView() }) diff --git a/Mail/Views/Thread List/ThreadListCell.swift b/Mail/Views/Thread List/ThreadListCell.swift index 2eb0e1135..16ae7a557 100644 --- a/Mail/Views/Thread List/ThreadListCell.swift +++ b/Mail/Views/Thread List/ThreadListCell.swift @@ -55,8 +55,7 @@ struct ThreadListCell: View { var body: some View { ZStack { if !thread.shouldPresentAsDraft { - NavigationLink(destination: ThreadView(mailboxManager: viewModel.mailboxManager, - thread: thread, + NavigationLink(destination: ThreadView(thread: thread, onDismiss: { viewModel.selectedThread = nil }), isActive: $shouldNavigateToThreadList) { EmptyView() } .opacity(0) diff --git a/Mail/Views/Thread/ThreadView.swift b/Mail/Views/Thread/ThreadView.swift index 14574d744..d8427c718 100644 --- a/Mail/Views/Thread/ThreadView.swift +++ b/Mail/Views/Thread/ThreadView.swift @@ -41,10 +41,10 @@ class MessageBottomSheet: DisplayedFloatingPanelState struct ThreadView: View { @EnvironmentObject private var splitViewManager: SplitViewManager + @EnvironmentObject private var mailboxManager: MailboxManager - let mailboxManager: MailboxManager @ObservedRealmObject var thread: Thread - var onDismiss: (() -> Void)? = nil + var onDismiss: (() -> Void)? @State private var headerHeight: CGFloat = 0 @State private var displayNavigationTitle = false @@ -259,9 +259,7 @@ extension Label { struct ThreadView_Previews: PreviewProvider { static var previews: some View { - ThreadView( - mailboxManager: PreviewHelper.sampleMailboxManager, - thread: PreviewHelper.sampleThread - ) + ThreadView(thread: PreviewHelper.sampleThread) + .environmentObject(PreviewHelper.sampleMailboxManager) } } diff --git a/Mail/Views/ThreadListManagerView.swift b/Mail/Views/ThreadListManagerView.swift index 95839678d..9a872e0fb 100644 --- a/Mail/Views/ThreadListManagerView.swift +++ b/Mail/Views/ThreadListManagerView.swift @@ -36,8 +36,7 @@ struct ThreadListManagerView: View { ZStack { NavigationLink(isActive: $shouldNavigateToNotificationThread) { if let tappedNotificationThread { - ThreadView(mailboxManager: mailboxManager, - thread: tappedNotificationThread) + ThreadView(thread: tappedNotificationThread) } } label: { EmptyView() From 82bb9b79eada3cfa94d8d5ee4b7d53aeefab95b6 Mon Sep 17 00:00:00 2001 From: Philippe Weidmann Date: Wed, 19 Apr 2023 15:37:06 +0200 Subject: [PATCH 03/11] refactor(ThreadListCell): MailboxManager as EnvironmentObject --- Mail/Components/ThreadCell.swift | 9 +++------ Mail/Views/Search/SearchThreadsSectionView.swift | 8 ++------ Mail/Views/Thread List/ThreadListCell.swift | 1 - 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/Mail/Components/ThreadCell.swift b/Mail/Components/ThreadCell.swift index f8bd6659b..dab83019e 100644 --- a/Mail/Components/ThreadCell.swift +++ b/Mail/Components/ThreadCell.swift @@ -55,7 +55,7 @@ struct ThreadCellDataHolder { /// Last message of the thread, except for the Sent folder where we use the last message of the folder let preview: String - init(thread: Thread, mailboxManager: MailboxManager) { + init(thread: Thread) { let lastMessageNotFromSent = thread.messages.last { $0.folder?.role != .sent } ?? thread.messages.last recipientToDisplay = lastMessageNotFromSent?.from.last @@ -80,8 +80,8 @@ struct ThreadCellDataHolder { } struct ThreadCell: View { + @EnvironmentObject var mailboxManager: MailboxManager let thread: Thread - let mailboxManager: MailboxManager let dataHolder: ThreadCellDataHolder @@ -106,15 +106,13 @@ struct ThreadCell: View { init( thread: Thread, - mailboxManager: MailboxManager, density: ThreadDensity, isMultipleSelectionEnabled: Bool = false, isSelected: Bool = false ) { self.thread = thread - self.mailboxManager = mailboxManager - dataHolder = ThreadCellDataHolder(thread: thread, mailboxManager: mailboxManager) + dataHolder = ThreadCellDataHolder(thread: thread) self.density = density self.isMultipleSelectionEnabled = isMultipleSelectionEnabled @@ -176,7 +174,6 @@ struct ThreadCell: View { struct ThreadCell_Previews: PreviewProvider { static var previews: some View { ThreadCell(thread: PreviewHelper.sampleThread, - mailboxManager: PreviewHelper.sampleMailboxManager, density: .large, isMultipleSelectionEnabled: false, isSelected: false) diff --git a/Mail/Views/Search/SearchThreadsSectionView.swift b/Mail/Views/Search/SearchThreadsSectionView.swift index 36498f4f9..688788f4e 100644 --- a/Mail/Views/Search/SearchThreadsSectionView.swift +++ b/Mail/Views/Search/SearchThreadsSectionView.swift @@ -38,9 +38,7 @@ struct SearchThreadsSectionView: View { editedMessageDraft: $editedMessageDraft ) }, label: { - ThreadCell(thread: thread, - mailboxManager: viewModel.mailboxManager, - density: threadDensity) + ThreadCell(thread: thread, density: threadDensity) }) } else { ZStack { @@ -54,9 +52,7 @@ struct SearchThreadsSectionView: View { }) .opacity(0) - ThreadCell(thread: thread, - mailboxManager: viewModel.mailboxManager, - density: threadDensity) + ThreadCell(thread: thread, density: threadDensity) } } } diff --git a/Mail/Views/Thread List/ThreadListCell.swift b/Mail/Views/Thread List/ThreadListCell.swift index 16ae7a557..a95996504 100644 --- a/Mail/Views/Thread List/ThreadListCell.swift +++ b/Mail/Views/Thread List/ThreadListCell.swift @@ -64,7 +64,6 @@ struct ThreadListCell: View { ThreadCell( thread: thread, - mailboxManager: viewModel.mailboxManager, density: threadDensity, isMultipleSelectionEnabled: multipleSelectionViewModel.isEnabled, isSelected: isSelected From 29dcb99202487acfd091d27798a6905bd85c9424 Mon Sep 17 00:00:00 2001 From: Philippe Weidmann Date: Wed, 19 Apr 2023 16:08:51 +0200 Subject: [PATCH 04/11] refactor(CreateFolderView): MailboxManager as EnvironmentObject --- Mail/Views/AlertView.swift | 3 ++- Mail/Views/Alerts/CreateFolderView.swift | 17 +++++++---------- Mail/Views/SheetView.swift | 2 +- Mail/Views/SplitView.swift | 15 ++++++++------- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/Mail/Views/AlertView.swift b/Mail/Views/AlertView.swift index 3c52701d7..c78954a03 100644 --- a/Mail/Views/AlertView.swift +++ b/Mail/Views/AlertView.swift @@ -128,7 +128,8 @@ extension View { struct AlertView_Previews: PreviewProvider { static var previews: some View { AlertView { - CreateFolderView(mailboxManager: PreviewHelper.sampleMailboxManager, mode: .create) + CreateFolderView(mode: .create) } + .environmentObject(PreviewHelper.sampleMailboxManager) } } diff --git a/Mail/Views/Alerts/CreateFolderView.swift b/Mail/Views/Alerts/CreateFolderView.swift index 99a219d61..cdbcc6204 100644 --- a/Mail/Views/Alerts/CreateFolderView.swift +++ b/Mail/Views/Alerts/CreateFolderView.swift @@ -25,7 +25,7 @@ import RealmSwift import SwiftUI struct CreateFolderView: View { - @StateObject private var mailboxManager: MailboxManager + @EnvironmentObject var mailboxManager: MailboxManager @ObservedResults(Folder.self) private var folders @State private var folderName = "" @@ -34,7 +34,7 @@ struct CreateFolderView: View { @FocusState private var isFocused - private var mode: Mode + let mode: Mode enum Mode { case create @@ -64,12 +64,6 @@ struct CreateFolderView: View { } } - init(mailboxManager: MailboxManager, mode: Mode) { - _folders = .init(Folder.self, configuration: AccountManager.instance.currentMailboxManager?.realmConfiguration) - _mailboxManager = StateObject(wrappedValue: mailboxManager) - self.mode = mode - } - var body: some View { VStack(alignment: .leading) { Text(MailResourcesStrings.Localizable.newFolderDialogTitle) @@ -128,7 +122,10 @@ struct CreateFolderView: View { struct CreateFolderView_Previews: PreviewProvider { static var previews: some View { - CreateFolderView(mailboxManager: PreviewHelper.sampleMailboxManager, mode: .create) - CreateFolderView(mailboxManager: PreviewHelper.sampleMailboxManager, mode: .move { _ in /* Preview */ }) + Group { + CreateFolderView(mode: .create) + CreateFolderView(mode: .move { _ in /* Preview */ }) + } + .environmentObject(PreviewHelper.sampleMailboxManager) } } diff --git a/Mail/Views/SheetView.swift b/Mail/Views/SheetView.swift index a67bcfcfd..1acdb2ba1 100644 --- a/Mail/Views/SheetView.swift +++ b/Mail/Views/SheetView.swift @@ -45,7 +45,7 @@ struct SheetView: View where Content: View { .customAlert(isPresented: $alert.isShowing) { switch alert.state { case let .createNewFolder(mode): - CreateFolderView(mailboxManager: mailboxManager, mode: mode) + CreateFolderView(mode: mode) case let .reportPhishing(message): ReportPhishingView(mailboxManager: mailboxManager, message: message) case let .reportDisplayProblem(message): diff --git a/Mail/Views/SplitView.swift b/Mail/Views/SplitView.swift index 6839ec047..f110c2fda 100644 --- a/Mail/Views/SplitView.swift +++ b/Mail/Views/SplitView.swift @@ -105,10 +105,6 @@ struct SplitView: View { try await mailboxManager.folders() } } - .environmentObject(mailboxManager) - .environmentObject(splitViewManager) - .environmentObject(navigationDrawerController) - .defaultAppStorage(.shared) .onAppear { AppDelegate.orientationLock = .all } @@ -134,8 +130,6 @@ struct SplitView: View { setupBehaviour(orientation: interfaceOrientation) splitViewController.preferredDisplayMode = .twoDisplaceSecondary } - .environmentObject(bottomSheet) - .environmentObject(alert) .floatingPanel(state: bottomSheet) { switch bottomSheet.state { case .getMoreStorage: @@ -157,7 +151,7 @@ struct SplitView: View { .customAlert(isPresented: $alert.isShowing) { switch alert.state { case .createNewFolder(let mode): - CreateFolderView(mailboxManager: mailboxManager, mode: mode) + CreateFolderView(mode: mode) case .reportPhishing(let message): ReportPhishingView(mailboxManager: mailboxManager, message: message) case .reportDisplayProblem(let message): @@ -166,6 +160,13 @@ struct SplitView: View { EmptyView() } } + .environment(\.realmConfiguration, mailboxManager.realmConfiguration) + .environmentObject(mailboxManager) + .environmentObject(splitViewManager) + .environmentObject(navigationDrawerController) + .environmentObject(bottomSheet) + .environmentObject(alert) + .defaultAppStorage(.shared) } private func setupBehaviour(orientation: UIInterfaceOrientation) { From 2f1163a71cac8b7c2a12471c2f3ba0f9f8259abd Mon Sep 17 00:00:00 2001 From: Philippe Weidmann Date: Wed, 19 Apr 2023 16:33:37 +0200 Subject: [PATCH 05/11] refactor(MoveEmailView): MailboxManager as EnvironmentObject --- Mail/Views/Thread/MoveEmailView.swift | 34 ++++++++++----------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/Mail/Views/Thread/MoveEmailView.swift b/Mail/Views/Thread/MoveEmailView.swift index cd1f92513..0ecd61a20 100644 --- a/Mail/Views/Thread/MoveEmailView.swift +++ b/Mail/Views/Thread/MoveEmailView.swift @@ -28,36 +28,24 @@ struct MoveEmailView: View { typealias MoveHandler = (Folder) -> Void @EnvironmentObject private var alert: GlobalAlert + @EnvironmentObject private var mailboxManager: MailboxManager - @ObservedResults(Folder.self) var folders + // swiftlint:disable empty_count + @ObservedResults(Folder.self, where: { $0.role != .draft && $0.parents.count == 0 && $0.toolType == nil }) var folders @LazyInjectService private var matomo: MatomoUtils - let mailboxManager: MailboxManager let currentFolderId: String? let moveHandler: MoveEmailView.MoveHandler - private var nestableFolderSorted = [NestableFolder]() - - init(mailboxManager: MailboxManager, from currentFolderId: String?, moveHandler: @escaping MoveEmailView.MoveHandler) { - self.mailboxManager = mailboxManager - self.currentFolderId = currentFolderId - self.moveHandler = moveHandler - - // swiftlint:disable empty_count - _folders = ObservedResults( - Folder.self, - configuration: AccountManager.instance.currentMailboxManager?.realmConfiguration - ) { $0.role != .draft && $0.parents.count == 0 && $0.toolType == nil } - nestableFolderSorted = NestableFolder.createFoldersHierarchy(from: Array(folders)) - } - var body: some View { ScrollView { LazyVStack(spacing: 0) { - listOfFolders(nestableFolders: nestableFolderSorted.filter { $0.content.role != nil }) + listOfFolders(nestableFolders: NestableFolder + .createFoldersHierarchy(from: Array(folders.where { $0.role != nil }))) IKDivider(horizontalPadding: 8) - listOfFolders(nestableFolders: nestableFolderSorted.filter { $0.content.role == nil }) + listOfFolders(nestableFolders: NestableFolder + .createFoldersHierarchy(from: Array(folders.where { $0.role == nil }))) } } .navigationTitle(MailResourcesStrings.Localizable.actionMove) @@ -87,15 +75,17 @@ struct MoveEmailView: View { } extension MoveEmailView { - static func sheetView(mailboxManager: MailboxManager, from folderId: String?, moveHandler: @escaping MoveEmailView.MoveHandler) -> some View { + static func sheetView(mailboxManager: MailboxManager, from folderId: String?, + moveHandler: @escaping MoveEmailView.MoveHandler) -> some View { SheetView(mailboxManager: mailboxManager) { - MoveEmailView(mailboxManager: mailboxManager, from: folderId, moveHandler: moveHandler) + MoveEmailView(currentFolderId: folderId, moveHandler: moveHandler) } } } struct MoveMessageView_Previews: PreviewProvider { static var previews: some View { - MoveEmailView(mailboxManager: PreviewHelper.sampleMailboxManager, from: nil) { _ in /* Preview */ } + MoveEmailView(currentFolderId: nil) { _ in /* Preview */ } + .environmentObject(PreviewHelper.sampleMailboxManager) } } From ed1da6864e72733dc1ed4a63217d2df2b945dfc2 Mon Sep 17 00:00:00 2001 From: Philippe Weidmann Date: Thu, 20 Apr 2023 09:12:33 +0200 Subject: [PATCH 06/11] refactor(ReportPhishingView): MailboxManager as EnvironmentObject --- Mail/Views/Alerts/ReportPhishingView.swift | 5 +++-- Mail/Views/SheetView.swift | 2 +- Mail/Views/SplitView.swift | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Mail/Views/Alerts/ReportPhishingView.swift b/Mail/Views/Alerts/ReportPhishingView.swift index d2cf0c797..1d436f425 100644 --- a/Mail/Views/Alerts/ReportPhishingView.swift +++ b/Mail/Views/Alerts/ReportPhishingView.swift @@ -22,7 +22,7 @@ import MailResources import SwiftUI struct ReportPhishingView: View { - let mailboxManager: MailboxManager + @EnvironmentObject var mailboxManager: MailboxManager let message: Message var body: some View { @@ -54,6 +54,7 @@ struct ReportPhishingView: View { struct PhishingView_Previews: PreviewProvider { static var previews: some View { - ReportPhishingView(mailboxManager: PreviewHelper.sampleMailboxManager, message: PreviewHelper.sampleMessage) + ReportPhishingView(message: PreviewHelper.sampleMessage) + .environmentObject(PreviewHelper.sampleMailboxManager) } } diff --git a/Mail/Views/SheetView.swift b/Mail/Views/SheetView.swift index 1acdb2ba1..72dab98de 100644 --- a/Mail/Views/SheetView.swift +++ b/Mail/Views/SheetView.swift @@ -47,7 +47,7 @@ struct SheetView: View where Content: View { case let .createNewFolder(mode): CreateFolderView(mode: mode) case let .reportPhishing(message): - ReportPhishingView(mailboxManager: mailboxManager, message: message) + ReportPhishingView(message: message) case let .reportDisplayProblem(message): ReportDisplayProblemView(mailboxManager: mailboxManager, message: message) case .none: diff --git a/Mail/Views/SplitView.swift b/Mail/Views/SplitView.swift index f110c2fda..9d6dbb2b6 100644 --- a/Mail/Views/SplitView.swift +++ b/Mail/Views/SplitView.swift @@ -153,7 +153,7 @@ struct SplitView: View { case .createNewFolder(let mode): CreateFolderView(mode: mode) case .reportPhishing(let message): - ReportPhishingView(mailboxManager: mailboxManager, message: message) + ReportPhishingView(message: message) case .reportDisplayProblem(let message): ReportDisplayProblemView(mailboxManager: mailboxManager, message: message) case .none: From 4c7f2262bf232cceed684b50472913888b603344 Mon Sep 17 00:00:00 2001 From: Philippe Weidmann Date: Thu, 20 Apr 2023 09:16:25 +0200 Subject: [PATCH 07/11] refactor(ReportDisplayProblemView): MailboxManager as EnvironmentObject --- Mail/Views/Bottom sheets/ReportDisplayProblemView.swift | 5 +++-- Mail/Views/SheetView.swift | 2 +- Mail/Views/SplitView.swift | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Mail/Views/Bottom sheets/ReportDisplayProblemView.swift b/Mail/Views/Bottom sheets/ReportDisplayProblemView.swift index 8d85c9678..f3277cd2a 100644 --- a/Mail/Views/Bottom sheets/ReportDisplayProblemView.swift +++ b/Mail/Views/Bottom sheets/ReportDisplayProblemView.swift @@ -24,7 +24,7 @@ import Sentry import SwiftUI struct ReportDisplayProblemView: View { - let mailboxManager: MailboxManager + @EnvironmentObject var mailboxManager: MailboxManager let message: Message var body: some View { @@ -63,6 +63,7 @@ struct ReportDisplayProblemView: View { struct ReportDisplayProblemView_Previews: PreviewProvider { static var previews: some View { - ReportDisplayProblemView(mailboxManager: PreviewHelper.sampleMailboxManager, message: PreviewHelper.sampleMessage) + ReportDisplayProblemView(message: PreviewHelper.sampleMessage) + .environmentObject(PreviewHelper.sampleMailboxManager) } } diff --git a/Mail/Views/SheetView.swift b/Mail/Views/SheetView.swift index 72dab98de..9a45c8bbc 100644 --- a/Mail/Views/SheetView.swift +++ b/Mail/Views/SheetView.swift @@ -49,7 +49,7 @@ struct SheetView: View where Content: View { case let .reportPhishing(message): ReportPhishingView(message: message) case let .reportDisplayProblem(message): - ReportDisplayProblemView(mailboxManager: mailboxManager, message: message) + ReportDisplayProblemView(message: message) case .none: EmptyView() } diff --git a/Mail/Views/SplitView.swift b/Mail/Views/SplitView.swift index 9d6dbb2b6..255fa594d 100644 --- a/Mail/Views/SplitView.swift +++ b/Mail/Views/SplitView.swift @@ -155,7 +155,7 @@ struct SplitView: View { case .reportPhishing(let message): ReportPhishingView(message: message) case .reportDisplayProblem(let message): - ReportDisplayProblemView(mailboxManager: mailboxManager, message: message) + ReportDisplayProblemView(message: message) case .none: EmptyView() } From 4f9c99360700cbf5b68bfcff601b0a2327ff2816 Mon Sep 17 00:00:00 2001 From: Philippe Weidmann Date: Thu, 20 Apr 2023 09:25:51 +0200 Subject: [PATCH 08/11] refactor(SheetView): Remove MailboxManager --- .../MailboxManagement/MailboxesManagementView.swift | 2 +- Mail/Views/Menu Drawer/MenuDrawerView.swift | 2 +- Mail/Views/Menu Drawer/MenuHeaderView.swift | 2 +- Mail/Views/SheetView.swift | 6 ++---- Mail/Views/Thread/MoveEmailView.swift | 2 +- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Mail/Views/Menu Drawer/MailboxManagement/MailboxesManagementView.swift b/Mail/Views/Menu Drawer/MailboxManagement/MailboxesManagementView.swift index c1984d29f..e53b3b761 100644 --- a/Mail/Views/Menu Drawer/MailboxManagement/MailboxesManagementView.swift +++ b/Mail/Views/Menu Drawer/MailboxManagement/MailboxesManagementView.swift @@ -79,7 +79,7 @@ struct MailboxesManagementView: View { } } .sheet(isPresented: $isShowingSwitchAccount) { - SheetView(mailboxManager: mailboxManager) { + SheetView { AccountListView() } } diff --git a/Mail/Views/Menu Drawer/MenuDrawerView.swift b/Mail/Views/Menu Drawer/MenuDrawerView.swift index 2bee6e285..ea4d914fe 100644 --- a/Mail/Views/Menu Drawer/MenuDrawerView.swift +++ b/Mail/Views/Menu Drawer/MenuDrawerView.swift @@ -194,7 +194,7 @@ struct MenuDrawerView: View { viewModel.createMenuItems(bottomSheet: bottomSheet) } .sheet(isPresented: $viewModel.isShowingHelp) { - SheetView(mailboxManager: mailboxManager) { + SheetView { HelpView() } } diff --git a/Mail/Views/Menu Drawer/MenuHeaderView.swift b/Mail/Views/Menu Drawer/MenuHeaderView.swift index e54afb9b6..bd141013b 100644 --- a/Mail/Views/Menu Drawer/MenuHeaderView.swift +++ b/Mail/Views/Menu Drawer/MenuHeaderView.swift @@ -53,7 +53,7 @@ struct MenuHeaderView: View { .clipped() .shadow(color: MailResourcesAsset.menuDrawerShadowColor.swiftUIColor, radius: 1, x: 0, y: 2) .sheet(isPresented: $isShowingSettings) { - SheetView(mailboxManager: mailboxManager) { + SheetView { SettingsView() } } diff --git a/Mail/Views/SheetView.swift b/Mail/Views/SheetView.swift index 9a45c8bbc..2d93466c5 100644 --- a/Mail/Views/SheetView.swift +++ b/Mail/Views/SheetView.swift @@ -25,11 +25,9 @@ struct SheetView: View where Content: View { @Environment(\.dismiss) private var dismiss - let mailboxManager: MailboxManager let content: Content - init(mailboxManager: MailboxManager, @ViewBuilder _ content: () -> Content) { - self.mailboxManager = mailboxManager + init(@ViewBuilder _ content: () -> Content) { self.content = content() } @@ -64,7 +62,7 @@ struct SheetView: View where Content: View { struct SheetView_Previews: PreviewProvider { static var previews: some View { - SheetView(mailboxManager: PreviewHelper.sampleMailboxManager) { + SheetView { EmptyView() } } diff --git a/Mail/Views/Thread/MoveEmailView.swift b/Mail/Views/Thread/MoveEmailView.swift index 0ecd61a20..db2a0a221 100644 --- a/Mail/Views/Thread/MoveEmailView.swift +++ b/Mail/Views/Thread/MoveEmailView.swift @@ -77,7 +77,7 @@ struct MoveEmailView: View { extension MoveEmailView { static func sheetView(mailboxManager: MailboxManager, from folderId: String?, moveHandler: @escaping MoveEmailView.MoveHandler) -> some View { - SheetView(mailboxManager: mailboxManager) { + SheetView { MoveEmailView(currentFolderId: folderId, moveHandler: moveHandler) } } From 5fe755360693b89fa4453556cc1d62886983bf5f Mon Sep 17 00:00:00 2001 From: Philippe Weidmann Date: Thu, 20 Apr 2023 10:36:20 +0200 Subject: [PATCH 09/11] refactor: Display CreateFolderView where needed --- Mail/Views/Menu Drawer/Folders/UserFoldersListView.swift | 7 +++++-- Mail/Views/SheetView.swift | 2 -- Mail/Views/SplitView.swift | 3 --- Mail/Views/Thread/MoveEmailView.swift | 7 +++++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Mail/Views/Menu Drawer/Folders/UserFoldersListView.swift b/Mail/Views/Menu Drawer/Folders/UserFoldersListView.swift index d238062c3..99fbc0fab 100644 --- a/Mail/Views/Menu Drawer/Folders/UserFoldersListView.swift +++ b/Mail/Views/Menu Drawer/Folders/UserFoldersListView.swift @@ -29,9 +29,9 @@ struct UserFoldersListView: View { var folders: [NestableFolder] @State private var isExpanded = true + @State private var isShowingCreateFolderAlert = false @EnvironmentObject var splitViewManager: SplitViewManager - @EnvironmentObject var globalAlert: GlobalAlert let isCompact: Bool @@ -58,13 +58,16 @@ struct UserFoldersListView: View { Button { matomo.track(eventWithCategory: .createFolder, name: "fromMenuDrawer") - globalAlert.state = .createNewFolder(mode: .create) + isShowingCreateFolderAlert.toggle() } label: { MailResourcesAsset.addCircle.swiftUIImage .resizable() .frame(width: 16, height: 16) } .accessibilityLabel(MailResourcesStrings.Localizable.newFolderDialogTitle) + .customAlert(isPresented: $isShowingCreateFolderAlert) { + CreateFolderView(mode: .create) + } } .padding(.horizontal, UIConstants.menuDrawerHorizontalPadding) .padding(.vertical, UIConstants.menuDrawerVerticalPadding) diff --git a/Mail/Views/SheetView.swift b/Mail/Views/SheetView.swift index 2d93466c5..b45a42a7c 100644 --- a/Mail/Views/SheetView.swift +++ b/Mail/Views/SheetView.swift @@ -42,8 +42,6 @@ struct SheetView: View where Content: View { } .customAlert(isPresented: $alert.isShowing) { switch alert.state { - case let .createNewFolder(mode): - CreateFolderView(mode: mode) case let .reportPhishing(message): ReportPhishingView(message: message) case let .reportDisplayProblem(message): diff --git a/Mail/Views/SplitView.swift b/Mail/Views/SplitView.swift index 255fa594d..70fa00756 100644 --- a/Mail/Views/SplitView.swift +++ b/Mail/Views/SplitView.swift @@ -34,7 +34,6 @@ class GlobalBottomSheet: DisplayedFloatingPanelState { class GlobalAlert: SheetState { enum State { - case createNewFolder(mode: CreateFolderView.Mode) case reportPhishing(message: Message) case reportDisplayProblem(message: Message) } @@ -150,8 +149,6 @@ struct SplitView: View { } .customAlert(isPresented: $alert.isShowing) { switch alert.state { - case .createNewFolder(let mode): - CreateFolderView(mode: mode) case .reportPhishing(let message): ReportPhishingView(message: message) case .reportDisplayProblem(let message): diff --git a/Mail/Views/Thread/MoveEmailView.swift b/Mail/Views/Thread/MoveEmailView.swift index db2a0a221..f2384bd2b 100644 --- a/Mail/Views/Thread/MoveEmailView.swift +++ b/Mail/Views/Thread/MoveEmailView.swift @@ -27,11 +27,11 @@ import SwiftUI struct MoveEmailView: View { typealias MoveHandler = (Folder) -> Void - @EnvironmentObject private var alert: GlobalAlert @EnvironmentObject private var mailboxManager: MailboxManager // swiftlint:disable empty_count @ObservedResults(Folder.self, where: { $0.role != .draft && $0.parents.count == 0 && $0.toolType == nil }) var folders + @State private var isShowingCreateFolderAlert = false @LazyInjectService private var matomo: MatomoUtils @@ -54,7 +54,7 @@ struct MoveEmailView: View { ToolbarItem(placement: .navigationBarTrailing) { Button { matomo.track(eventWithCategory: .createFolder, name: "fromMove") - alert.state = .createNewFolder(mode: .move(moveHandler: moveHandler)) + isShowingCreateFolderAlert.toggle() } label: { MailResourcesAsset.folderAdd.swiftUIImage } @@ -62,6 +62,9 @@ struct MoveEmailView: View { } .environment(\.folderCellType, .indicator) .matomoView(view: ["MoveEmailView"]) + .customAlert(isPresented: $isShowingCreateFolderAlert) { + CreateFolderView(mode: .move(moveHandler: moveHandler)) + } } private func listOfFolders(nestableFolders: [NestableFolder]) -> some View { From f8ca2f463731d228f59228f7a69dcb0e58f8e1f4 Mon Sep 17 00:00:00 2001 From: Philippe Weidmann Date: Thu, 20 Apr 2023 11:14:07 +0200 Subject: [PATCH 10/11] refactor: Remove useless code SheetView --- Mail/Views/SheetView.swift | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/Mail/Views/SheetView.swift b/Mail/Views/SheetView.swift index b45a42a7c..912970b67 100644 --- a/Mail/Views/SheetView.swift +++ b/Mail/Views/SheetView.swift @@ -21,15 +21,9 @@ import MailResources import SwiftUI struct SheetView: View where Content: View { - @StateObject private var alert = GlobalAlert() - @Environment(\.dismiss) private var dismiss - let content: Content - - init(@ViewBuilder _ content: () -> Content) { - self.content = content() - } + @ViewBuilder let content: Content var body: some View { NavigationView { @@ -40,21 +34,9 @@ struct SheetView: View where Content: View { Label(MailResourcesStrings.Localizable.buttonClose, systemImage: "xmark") }) } - .customAlert(isPresented: $alert.isShowing) { - switch alert.state { - case let .reportPhishing(message): - ReportPhishingView(message: message) - case let .reportDisplayProblem(message): - ReportDisplayProblemView(message: message) - case .none: - EmptyView() - } - } - .defaultAppStorage(.shared) .onReceive(NotificationCenter.default.publisher(for: Constants.dismissMoveSheetNotificationName)) { _ in dismiss() } - .environmentObject(alert) } } From 143639490a7e05e5dd08a099ab367ac07a4c9639 Mon Sep 17 00:00:00 2001 From: Philippe Weidmann Date: Wed, 26 Apr 2023 09:07:38 +0200 Subject: [PATCH 11/11] refactor: Make EnvironmentObject private --- Mail/Components/ThreadCell.swift | 2 +- Mail/Views/Alerts/CreateFolderView.swift | 7 ++++--- Mail/Views/Alerts/ReportPhishingView.swift | 4 ++-- .../Bottom sheets/ReportDisplayProblemView.swift | 4 ++-- .../Menu Drawer/Folders/UserFoldersListView.swift | 2 +- Mail/Views/Menu Drawer/MenuDrawerView.swift | 12 +++++++----- 6 files changed, 17 insertions(+), 14 deletions(-) diff --git a/Mail/Components/ThreadCell.swift b/Mail/Components/ThreadCell.swift index dab83019e..56e5a5b27 100644 --- a/Mail/Components/ThreadCell.swift +++ b/Mail/Components/ThreadCell.swift @@ -80,7 +80,7 @@ struct ThreadCellDataHolder { } struct ThreadCell: View { - @EnvironmentObject var mailboxManager: MailboxManager + @EnvironmentObject private var mailboxManager: MailboxManager let thread: Thread let dataHolder: ThreadCellDataHolder diff --git a/Mail/Views/Alerts/CreateFolderView.swift b/Mail/Views/Alerts/CreateFolderView.swift index cdbcc6204..6ca09ae44 100644 --- a/Mail/Views/Alerts/CreateFolderView.swift +++ b/Mail/Views/Alerts/CreateFolderView.swift @@ -25,7 +25,7 @@ import RealmSwift import SwiftUI struct CreateFolderView: View { - @EnvironmentObject var mailboxManager: MailboxManager + @EnvironmentObject private var mailboxManager: MailboxManager @ObservedResults(Folder.self) private var folders @State private var folderName = "" @@ -75,7 +75,8 @@ struct CreateFolderView: View { .padding(12) .overlay( RoundedRectangle(cornerRadius: 4) - .stroke(error == nil ? MailResourcesAsset.textFieldBorder.swiftUIColor : MailResourcesAsset.redColor.swiftUIColor) + .stroke(error == nil ? MailResourcesAsset.textFieldBorder.swiftUIColor : MailResourcesAsset.redColor + .swiftUIColor) .animation(.easeInOut, value: error) ) .textStyle(.body) @@ -92,7 +93,7 @@ struct CreateFolderView: View { Task { await tryOrDisplayError { let folder = try await mailboxManager.createFolder(name: folderName) - if case let .move(moveHandler) = mode { + if case .move(let moveHandler) = mode { moveHandler(folder) NotificationCenter.default.post(Notification(name: Constants.dismissMoveSheetNotificationName)) } diff --git a/Mail/Views/Alerts/ReportPhishingView.swift b/Mail/Views/Alerts/ReportPhishingView.swift index 1d436f425..b7ef1bdf6 100644 --- a/Mail/Views/Alerts/ReportPhishingView.swift +++ b/Mail/Views/Alerts/ReportPhishingView.swift @@ -22,7 +22,7 @@ import MailResources import SwiftUI struct ReportPhishingView: View { - @EnvironmentObject var mailboxManager: MailboxManager + @EnvironmentObject private var mailboxManager: MailboxManager let message: Message var body: some View { @@ -31,7 +31,7 @@ struct ReportPhishingView: View { .textStyle(.bodyMedium) .frame(maxWidth: .infinity, alignment: .leading) Text(MailResourcesStrings.Localizable.reportPhishingDescription) - .textStyle(.bodySecondary) + .textStyle(.bodySecondary) ModalButtonsView(primaryButtonTitle: MailResourcesStrings.Localizable.buttonReport, primaryButtonAction: report) .padding(.top, 8) } diff --git a/Mail/Views/Bottom sheets/ReportDisplayProblemView.swift b/Mail/Views/Bottom sheets/ReportDisplayProblemView.swift index f3277cd2a..4a1239ae5 100644 --- a/Mail/Views/Bottom sheets/ReportDisplayProblemView.swift +++ b/Mail/Views/Bottom sheets/ReportDisplayProblemView.swift @@ -24,7 +24,7 @@ import Sentry import SwiftUI struct ReportDisplayProblemView: View { - @EnvironmentObject var mailboxManager: MailboxManager + @EnvironmentObject private var mailboxManager: MailboxManager let message: Message var body: some View { @@ -37,7 +37,7 @@ struct ReportDisplayProblemView: View { ModalButtonsView(primaryButtonTitle: MailResourcesStrings.Localizable.buttonAccept, secondaryButtonTitle: MailResourcesStrings.Localizable.buttonRefuse, primaryButtonAction: report) - .padding(.top, 8) + .padding(.top, 8) } .padding(.horizontal, UIConstants.bottomSheetHorizontalPadding) .matomoView(view: [MatomoUtils.View.bottomSheet.displayName, "ReportDisplayProblemView"]) diff --git a/Mail/Views/Menu Drawer/Folders/UserFoldersListView.swift b/Mail/Views/Menu Drawer/Folders/UserFoldersListView.swift index 99fbc0fab..2afc1aa8e 100644 --- a/Mail/Views/Menu Drawer/Folders/UserFoldersListView.swift +++ b/Mail/Views/Menu Drawer/Folders/UserFoldersListView.swift @@ -31,7 +31,7 @@ struct UserFoldersListView: View { @State private var isExpanded = true @State private var isShowingCreateFolderAlert = false - @EnvironmentObject var splitViewManager: SplitViewManager + @EnvironmentObject private var splitViewManager: SplitViewManager let isCompact: Bool diff --git a/Mail/Views/Menu Drawer/MenuDrawerView.swift b/Mail/Views/Menu Drawer/MenuDrawerView.swift index ea4d914fe..9fad5c2cd 100644 --- a/Mail/Views/Menu Drawer/MenuDrawerView.swift +++ b/Mail/Views/Menu Drawer/MenuDrawerView.swift @@ -47,11 +47,13 @@ struct NavigationDrawer: View { private let maxWidth = 350.0 private let spacing = 60.0 - @EnvironmentObject var mailboxManager: MailboxManager - @EnvironmentObject var splitViewManager: SplitViewManager - @EnvironmentObject var navigationDrawerState: NavigationDrawerState - @Environment(\.window) var window - @GestureState var isDragGestureActive = false + @Environment(\.window) private var window + + @EnvironmentObject private var mailboxManager: MailboxManager + @EnvironmentObject private var splitViewManager: SplitViewManager + @EnvironmentObject private var navigationDrawerState: NavigationDrawerState + + @GestureState private var isDragGestureActive = false @State private var offsetWidth: CGFloat = 0