mirror of
https://github.com/ProtonMail/ios-mail.git
synced 2026-05-15 09:50:39 +00:00
Fix the problem with redundant Sidebar and SidebarModel allocations
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
+16
-10
@@ -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])
|
||||
|
||||
Reference in New Issue
Block a user