Skip to content

Commit c5fc3bc

Browse files
fix: Move FlushAlertState to MainViewState to prevent too many updates
1 parent dc3e331 commit c5fc3bc

7 files changed

+21
-37
lines changed

Mail/Views/Search/SearchThreadsSectionView.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ struct SearchThreadsSectionView: View {
4343
threadDensity: threadDensity,
4444
accentColor: accentColor,
4545
isSelected: mainViewState.selectedThread?.uid == thread.uid,
46-
isMultiSelected: multipleSelectionViewModel.selectedItems[thread.uid] != nil,
47-
flushAlert: .constant(nil)
46+
isMultiSelected: multipleSelectionViewModel.selectedItems[thread.uid] != nil
4847
)
4948
}
5049
.threadListCellAppearance()

Mail/Views/Thread List/ThreadListCell.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ struct ThreadListCell: View {
4747
let isSelected: Bool
4848
let isMultiSelected: Bool
4949

50-
@Binding var flushAlert: FlushAlertState?
51-
5250
private var selectionType: SelectionBackgroundKind {
5351
if multipleSelectionViewModel.isEnabled {
5452
return isMultiSelected ? .multiple : .none
@@ -94,8 +92,7 @@ struct ThreadListCell: View {
9492
.swipeActions(
9593
thread: thread,
9694
viewModel: viewModel,
97-
multipleSelectionViewModel: multipleSelectionViewModel,
98-
nearestFlushAlert: $flushAlert
95+
multipleSelectionViewModel: multipleSelectionViewModel
9996
)
10097
.actionsContextMenu(thread: thread, toggleMultipleSelection: toggleMultipleSelection)
10198
}
@@ -142,7 +139,6 @@ struct ThreadListCell: View {
142139
threadDensity: .large,
143140
accentColor: .pink,
144141
isSelected: false,
145-
isMultiSelected: false,
146-
flushAlert: .constant(nil)
142+
isMultiSelected: false
147143
)
148144
}

Mail/Views/Thread List/ThreadListModifiers.swift

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,8 @@ extension View {
3030
modifier(ThreadListCellAppearance())
3131
}
3232

33-
func threadListToolbar(
34-
flushAlert: Binding<FlushAlertState?>,
35-
viewModel: ThreadListViewModel,
36-
multipleSelectionViewModel: MultipleSelectionViewModel
37-
) -> some View {
38-
modifier(ThreadListToolbar(
39-
flushAlert: flushAlert,
40-
viewModel: viewModel,
41-
multipleSelectionViewModel: multipleSelectionViewModel
42-
))
33+
func threadListToolbar(viewModel: ThreadListViewModel, multipleSelectionViewModel: MultipleSelectionViewModel) -> some View {
34+
modifier(ThreadListToolbar(viewModel: viewModel, multipleSelectionViewModel: multipleSelectionViewModel))
4335
}
4436
}
4537

@@ -58,11 +50,10 @@ struct ThreadListToolbar: ViewModifier {
5850
@Environment(\.isCompactWindow) private var isCompactWindow
5951

6052
@EnvironmentObject private var actionsManager: ActionsManager
53+
@EnvironmentObject private var mainViewState: MainViewState
6154

6255
@State private var multipleSelectedMessages: [Message]?
6356

64-
@Binding var flushAlert: FlushAlertState?
65-
6657
@ObservedObject var viewModel: ThreadListViewModel
6758
@ObservedObject var multipleSelectionViewModel: MultipleSelectionViewModel
6859

@@ -132,7 +123,7 @@ struct ThreadListToolbar: ViewModifier {
132123
action: action,
133124
origin: .multipleSelection(
134125
originFolder: originFolder,
135-
nearestFlushAlert: $flushAlert,
126+
nearestFlushAlert: $mainViewState.flushAlert,
136127
nearestMessagesToMoveSheet: nil
137128
)
138129
)

Mail/Views/Thread List/ThreadListSwipeAction.swift

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ private struct SwipeActionView: View {
7474

7575
struct ThreadListSwipeActions: ViewModifier {
7676
@EnvironmentObject private var mailboxManager: MailboxManager
77+
@EnvironmentObject private var mainViewState: MainViewState
7778

7879
@AppStorage(UserDefaults.shared.key(.swipeFullLeading)) private var swipeFullLeading = DefaultPreferences.swipeFullLeading
7980
@AppStorage(UserDefaults.shared.key(.swipeLeading)) private var swipeLeading = DefaultPreferences.swipeLeading
@@ -88,8 +89,6 @@ struct ThreadListSwipeActions: ViewModifier {
8889
let viewModel: ThreadListable
8990
let multipleSelectionViewModel: MultipleSelectionViewModel
9091

91-
@Binding var flushAlert: FlushAlertState?
92-
9392
func body(content: Content) -> some View {
9493
content
9594
.swipeActions(edge: .leading) {
@@ -126,7 +125,7 @@ struct ThreadListSwipeActions: ViewModifier {
126125
SwipeActionView(
127126
actionPanelMessages: $actionPanelMessages,
128127
moveSheetMessages: $messagesToMove,
129-
flushAlert: $flushAlert,
128+
flushAlert: $mainViewState.flushAlert,
130129
viewModel: viewModel,
131130
thread: thread,
132131
action: action
@@ -139,12 +138,10 @@ struct ThreadListSwipeActions: ViewModifier {
139138
extension View {
140139
func swipeActions(thread: Thread,
141140
viewModel: ThreadListable,
142-
multipleSelectionViewModel: MultipleSelectionViewModel,
143-
nearestFlushAlert: Binding<FlushAlertState?>) -> some View {
141+
multipleSelectionViewModel: MultipleSelectionViewModel) -> some View {
144142
modifier(ThreadListSwipeActions(thread: thread,
145143
viewModel: viewModel,
146-
multipleSelectionViewModel: multipleSelectionViewModel,
147-
flushAlert: nearestFlushAlert))
144+
multipleSelectionViewModel: multipleSelectionViewModel))
148145
}
149146
}
150147

Mail/Views/Thread List/ThreadListView.swift

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ struct ThreadListView: View {
4747
@State private var fetchingTask: Task<Void, Never>?
4848
@State private var isRefreshing = false
4949
@ModalState private var isShowingUpdateAlert = false
50-
@ModalState private var flushAlert: FlushAlertState?
5150

5251
@StateObject private var viewModel: ThreadListViewModel
5352
@StateObject private var multipleSelectionViewModel: MultipleSelectionViewModel
@@ -104,7 +103,7 @@ struct ThreadListView: View {
104103
FlushFolderView(
105104
folder: viewModel.frozenFolder,
106105
mailboxManager: viewModel.mailboxManager,
107-
flushAlert: $flushAlert
106+
flushAlert: $mainViewState.flushAlert
108107
)
109108
.threadListCellAppearance()
110109
}
@@ -135,8 +134,7 @@ struct ThreadListView: View {
135134
threadDensity: threadDensity,
136135
accentColor: accentColor,
137136
isSelected: mainViewState.selectedThread?.uid == thread.uid,
138-
isMultiSelected: multipleSelectionViewModel.selectedItems[thread.uid] != nil,
139-
flushAlert: $flushAlert)
137+
isMultiSelected: multipleSelectionViewModel.selectedItems[thread.uid] != nil)
140138
.draggableThread(multipleSelectionViewModel.selectedItems.isEmpty ?
141139
[thread.uid] : Array(multipleSelectionViewModel.selectedItems.keys)) {
142140
multipleSelectionViewModel.selectedItems.removeAll()
@@ -198,9 +196,7 @@ struct ThreadListView: View {
198196
isRefreshing = false
199197
}
200198
}
201-
.threadListToolbar(flushAlert: $flushAlert,
202-
viewModel: viewModel,
203-
multipleSelectionViewModel: multipleSelectionViewModel)
199+
.threadListToolbar(viewModel: viewModel, multipleSelectionViewModel: multipleSelectionViewModel)
204200
.floatingActionButton(isEnabled: !multipleSelectionViewModel.isEnabled,
205201
icon: MailResourcesAsset.pencilPlain,
206202
title: MailResourcesStrings.Localizable.buttonNewMessage,
@@ -224,7 +220,7 @@ struct ThreadListView: View {
224220
.task(id: viewModel.mailboxManager.mailbox.id) {
225221
updateFetchingTask()
226222
}
227-
.customAlert(item: $flushAlert) { item in
223+
.customAlert(item: $mainViewState.flushAlert) { item in
228224
FlushFolderAlertView(flushAlert: item, folder: viewModel.frozenFolder)
229225
}
230226
.customAlert(isPresented: $isShowingUpdateAlert) {

MailCore/Cache/MainViewState.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class MainViewState: ObservableObject, SelectedThreadOwnable {
3636
@ModalPublished public var isShowingUpdateAvailable = false
3737
@ModalPublished public var isShowingSetAppAsDefaultDiscovery = false
3838
@ModalPublished public var isShowingMyKSuiteUpgrade = false
39+
@ModalPublished public var flushAlert: FlushAlertState?
3940
@ModalPublished public var modifiedScheduleDraftResource: ModifiedScheduleDraftResource?
4041
@Published public var isShowingChristmasEasterEgg = false
4142

MailCore/Utils/FlushAlertState.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import Foundation
2020

21-
public struct FlushAlertState: Identifiable {
21+
public struct FlushAlertState: Identifiable, Equatable {
2222
public let id = UUID()
2323
public let deletedMessages: Int?
2424
public let completion: () async -> Void
@@ -27,4 +27,8 @@ public struct FlushAlertState: Identifiable {
2727
self.deletedMessages = deletedMessages
2828
self.completion = completion
2929
}
30+
31+
public static func == (lhs: FlushAlertState, rhs: FlushAlertState) -> Bool {
32+
return lhs.id == rhs.id
33+
}
3034
}

0 commit comments

Comments
 (0)