diff --git a/Modules/App/Sources/UI/Screens/Home/HomeScreen.swift b/Modules/App/Sources/UI/Screens/Home/HomeScreen.swift index 4874c868a4..df049ee274 100644 --- a/Modules/App/Sources/UI/Screens/Home/HomeScreen.swift +++ b/Modules/App/Sources/UI/Screens/Home/HomeScreen.swift @@ -51,6 +51,7 @@ struct HomeScreen: View { @StateObject private var appRoute: AppRouteState @StateObject private var composerCoordinator: ComposerCoordinator @StateObject private var upsellEligibilityPublisher: UpsellEligibilityPublisher + @StateObject private var sidebarModel: SidebarModel @State private var messageQuickLook = MessageQuickLook() @State private var modalState: ModalState? @State private var isNotificationPromptPresented = false @@ -61,7 +62,6 @@ struct HomeScreen: View { private let userSession: MailUserSession private let mailSettingsLiveQuery: MailSettingLiveQuerying - private let makeSidebarScreen: (@escaping (SidebarItem) -> Void) -> SidebarScreen private let modalFactory: HomeScreenModalFactory private let notificationAuthorizationStore: NotificationAuthorizationStore @@ -76,17 +76,15 @@ struct HomeScreen: View { _composerCoordinator = .init(wrappedValue: .init(userSession: userSession, toastStateStore: toastStateStore)) let upsellEligibilityPublisher = UpsellEligibilityPublisher(userSession: userSession) _upsellEligibilityPublisher = .init(wrappedValue: upsellEligibilityPublisher) + _sidebarModel = .init( + wrappedValue: SidebarModel( + state: .initial, + sidebar: Sidebar(session: userSession), + upsellEligibilityPublisher: upsellEligibilityPublisher + )) self.appContext = appContext self.userSession = userSession self.mailSettingsLiveQuery = MailSettingsLiveQuery(userSession: userSession) - self.makeSidebarScreen = { selectedItem in - SidebarScreen( - state: .initial, - userSession: userSession, - upsellEligibilityPublisher: upsellEligibilityPublisher, - selectedItem: selectedItem - ) - } self._eventLoopErrorCoordinator = .init( wrappedValue: EventLoopErrorCoordinator(userSession: userSession, toastStateStore: toastStateStore) ) @@ -126,7 +124,7 @@ struct HomeScreen: View { .environmentObject(composerCoordinator) .environment(messageQuickLook) - makeSidebarScreen { selectedItem in + SidebarScreen(screenModel: sidebarModel) { selectedItem in switch selectedItem { case .upsell(let upsellType): presentUpsellScreen(ofType: upsellType) diff --git a/Modules/App/Sources/UI/Screens/Sidebar/SidebarScreen.swift b/Modules/App/Sources/UI/Screens/Sidebar/SidebarScreen.swift index 0094f95720..6e7ec7b7b2 100644 --- a/Modules/App/Sources/UI/Screens/Sidebar/SidebarScreen.swift +++ b/Modules/App/Sources/UI/Screens/Sidebar/SidebarScreen.swift @@ -27,7 +27,7 @@ struct SidebarScreen: View { } @EnvironmentObject private var appUIStateStore: AppUIStateStore - @StateObject private var screenModel: SidebarModel + @ObservedObject private var screenModel: SidebarModel @State private var headerHeight: CGFloat = .zero @GestureState private var gestureState: GestureStateData = .init() @State private var lastCommittedAxis: AxisLock = .none @@ -49,20 +49,11 @@ struct SidebarScreen: View { private let appVersionProvider: AppVersionProvider init( - state: SidebarState, - userSession: MailUserSession, - upsellEligibilityPublisher: UpsellEligibilityPublisher, + screenModel: SidebarModel, appVersionProvider: AppVersionProvider = .init(), - sidebarFactory: @escaping (MailUserSession) -> SidebarProtocol = Sidebar.init, selectedItem: @escaping (SidebarItem) -> Void ) { - let screenModel = SidebarModel( - state: state, - sidebar: sidebarFactory(userSession), - upsellEligibilityPublisher: upsellEligibilityPublisher - ) - - _screenModel = .init(wrappedValue: screenModel) + self.screenModel = screenModel self.selectedItem = selectedItem self.appVersionProvider = appVersionProvider } diff --git a/Modules/App/Tests/Tests/Snapshots/Screens/Sidebar/SidebarScreenSnapshotTests.swift b/Modules/App/Tests/Tests/Snapshots/Screens/Sidebar/SidebarScreenSnapshotTests.swift index b2478f788a..2a590606cc 100644 --- a/Modules/App/Tests/Tests/Snapshots/Screens/Sidebar/SidebarScreenSnapshotTests.swift +++ b/Modules/App/Tests/Tests/Snapshots/Screens/Sidebar/SidebarScreenSnapshotTests.swift @@ -45,13 +45,16 @@ final class SidebarScreenSnapshotTests { state.system = [PMSystemLabel.inbox, .sent, .outbox].compactMap(\.sidebarSystemFolder) state.labels = [SidebarCustomLabel.importantLabel, .topSecretLabel].map(\.sidebarLabel) - let sidebarScreen = SidebarScreen( + let screenModel = SidebarModel( state: state, - userSession: .dummy, - upsellEligibilityPublisher: .init(constant: .eligible(.mailPlus)), + sidebar: SidebarSpy(), + upsellEligibilityPublisher: .init(constant: .eligible(.mailPlus)) + ) + let sidebarScreen = SidebarScreen( + screenModel: screenModel, appVersionProvider: .init(bundle: bundleStub, sdkVersionProvider: .init(sdkVersion: "0.61.0")), - sidebarFactory: { _ in SidebarSpy() } - ) { _ in } + selectedItem: { _ in } + ) .environmentObject(AppUIStateStore(sidebarState: .init(zIndex: .zero, visibleWidth: 320))) assertSnapshotsOnIPhoneX(of: sidebarScreen, styles: [style]) @@ -63,13 +66,16 @@ final class SidebarScreenSnapshotTests { state.system = [PMSystemLabel.inbox, .sent].compactMap(\.sidebarSystemFolder) - let sidebarScreen = SidebarScreen( + let screenModel = SidebarModel( state: state, - userSession: .dummy, - upsellEligibilityPublisher: .init(constant: .eligible(.mailPlus)), + sidebar: SidebarSpy(), + upsellEligibilityPublisher: .init(constant: .eligible(.mailPlus)) + ) + let sidebarScreen = SidebarScreen( + screenModel: screenModel, appVersionProvider: .init(bundle: bundleStub, sdkVersionProvider: .init(sdkVersion: "0.61.0")), - sidebarFactory: { _ in SidebarSpy() } - ) { _ in } + selectedItem: { _ in } + ) .environmentObject(AppUIStateStore(sidebarState: .init(zIndex: .zero, visibleWidth: 320))) assertSnapshotsOnIPhoneX(of: sidebarScreen, styles: [style])