Fix the problem with redundant Sidebar and SidebarModel allocations

This commit is contained in:
Maciej Gomółka
2026-04-09 15:42:35 +02:00
parent d1085c68dc
commit d566751d80
3 changed files with 27 additions and 32 deletions
@@ -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
}
@@ -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])