Skip to content

fix: Contact flickering #1738

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 2, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions Mail/Views/Search/SearchThreadsSectionView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@ struct SearchThreadsSectionView: View {
threadDensity: threadDensity,
accentColor: accentColor,
isSelected: mainViewState.selectedThread?.uid == thread.uid,
isMultiSelected: multipleSelectionViewModel.selectedItems[thread.uid] != nil,
flushAlert: .constant(nil)
isMultiSelected: multipleSelectionViewModel.selectedItems[thread.uid] != nil
)
}
.threadListCellAppearance()
Expand Down
8 changes: 2 additions & 6 deletions Mail/Views/Thread List/ThreadListCell.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@ struct ThreadListCell: View {
let isSelected: Bool
let isMultiSelected: Bool

@Binding var flushAlert: FlushAlertState?

private var selectionType: SelectionBackgroundKind {
if multipleSelectionViewModel.isEnabled {
return isMultiSelected ? .multiple : .none
Expand Down Expand Up @@ -94,8 +92,7 @@ struct ThreadListCell: View {
.swipeActions(
thread: thread,
viewModel: viewModel,
multipleSelectionViewModel: multipleSelectionViewModel,
nearestFlushAlert: $flushAlert
multipleSelectionViewModel: multipleSelectionViewModel
)
.actionsContextMenu(thread: thread, toggleMultipleSelection: toggleMultipleSelection)
}
Expand Down Expand Up @@ -142,7 +139,6 @@ struct ThreadListCell: View {
threadDensity: .large,
accentColor: .pink,
isSelected: false,
isMultiSelected: false,
flushAlert: .constant(nil)
isMultiSelected: false
)
}
17 changes: 4 additions & 13 deletions Mail/Views/Thread List/ThreadListModifiers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,8 @@ extension View {
modifier(ThreadListCellAppearance())
}

func threadListToolbar(
flushAlert: Binding<FlushAlertState?>,
viewModel: ThreadListViewModel,
multipleSelectionViewModel: MultipleSelectionViewModel
) -> some View {
modifier(ThreadListToolbar(
flushAlert: flushAlert,
viewModel: viewModel,
multipleSelectionViewModel: multipleSelectionViewModel
))
func threadListToolbar(viewModel: ThreadListViewModel, multipleSelectionViewModel: MultipleSelectionViewModel) -> some View {
modifier(ThreadListToolbar(viewModel: viewModel, multipleSelectionViewModel: multipleSelectionViewModel))
}
}

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

@EnvironmentObject private var actionsManager: ActionsManager
@EnvironmentObject private var mainViewState: MainViewState

@State private var multipleSelectedMessages: [Message]?

@Binding var flushAlert: FlushAlertState?

@ObservedObject var viewModel: ThreadListViewModel
@ObservedObject var multipleSelectionViewModel: MultipleSelectionViewModel

Expand Down Expand Up @@ -132,7 +123,7 @@ struct ThreadListToolbar: ViewModifier {
action: action,
origin: .multipleSelection(
originFolder: originFolder,
nearestFlushAlert: $flushAlert,
nearestFlushAlert: $mainViewState.flushAlert,
nearestMessagesToMoveSheet: nil
)
)
Expand Down
11 changes: 4 additions & 7 deletions Mail/Views/Thread List/ThreadListSwipeAction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ private struct SwipeActionView: View {

struct ThreadListSwipeActions: ViewModifier {
@EnvironmentObject private var mailboxManager: MailboxManager
@EnvironmentObject private var mainViewState: MainViewState

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

@Binding var flushAlert: FlushAlertState?

func body(content: Content) -> some View {
content
.swipeActions(edge: .leading) {
Expand Down Expand Up @@ -126,7 +125,7 @@ struct ThreadListSwipeActions: ViewModifier {
SwipeActionView(
actionPanelMessages: $actionPanelMessages,
moveSheetMessages: $messagesToMove,
flushAlert: $flushAlert,
flushAlert: $mainViewState.flushAlert,
viewModel: viewModel,
thread: thread,
action: action
Expand All @@ -139,12 +138,10 @@ struct ThreadListSwipeActions: ViewModifier {
extension View {
func swipeActions(thread: Thread,
viewModel: ThreadListable,
multipleSelectionViewModel: MultipleSelectionViewModel,
nearestFlushAlert: Binding<FlushAlertState?>) -> some View {
multipleSelectionViewModel: MultipleSelectionViewModel) -> some View {
modifier(ThreadListSwipeActions(thread: thread,
viewModel: viewModel,
multipleSelectionViewModel: multipleSelectionViewModel,
flushAlert: nearestFlushAlert))
multipleSelectionViewModel: multipleSelectionViewModel))
}
}

Expand Down
12 changes: 4 additions & 8 deletions Mail/Views/Thread List/ThreadListView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ struct ThreadListView: View {
@State private var fetchingTask: Task<Void, Never>?
@State private var isRefreshing = false
@ModalState private var isShowingUpdateAlert = false
@ModalState private var flushAlert: FlushAlertState?

@StateObject private var viewModel: ThreadListViewModel
@StateObject private var multipleSelectionViewModel: MultipleSelectionViewModel
Expand Down Expand Up @@ -104,7 +103,7 @@ struct ThreadListView: View {
FlushFolderView(
folder: viewModel.frozenFolder,
mailboxManager: viewModel.mailboxManager,
flushAlert: $flushAlert
flushAlert: $mainViewState.flushAlert
)
.threadListCellAppearance()
}
Expand Down Expand Up @@ -135,8 +134,7 @@ struct ThreadListView: View {
threadDensity: threadDensity,
accentColor: accentColor,
isSelected: mainViewState.selectedThread?.uid == thread.uid,
isMultiSelected: multipleSelectionViewModel.selectedItems[thread.uid] != nil,
flushAlert: $flushAlert)
isMultiSelected: multipleSelectionViewModel.selectedItems[thread.uid] != nil)
.draggableThread(multipleSelectionViewModel.selectedItems.isEmpty ?
[thread.uid] : Array(multipleSelectionViewModel.selectedItems.keys)) {
multipleSelectionViewModel.selectedItems.removeAll()
Expand Down Expand Up @@ -198,9 +196,7 @@ struct ThreadListView: View {
isRefreshing = false
}
}
.threadListToolbar(flushAlert: $flushAlert,
viewModel: viewModel,
multipleSelectionViewModel: multipleSelectionViewModel)
.threadListToolbar(viewModel: viewModel, multipleSelectionViewModel: multipleSelectionViewModel)
.floatingActionButton(isEnabled: !multipleSelectionViewModel.isEnabled,
icon: MailResourcesAsset.pencilPlain,
title: MailResourcesStrings.Localizable.buttonNewMessage,
Expand All @@ -224,7 +220,7 @@ struct ThreadListView: View {
.task(id: viewModel.mailboxManager.mailbox.id) {
updateFetchingTask()
}
.customAlert(item: $flushAlert) { item in
.customAlert(item: $mainViewState.flushAlert) { item in
FlushFolderAlertView(flushAlert: item, folder: viewModel.frozenFolder)
}
.customAlert(isPresented: $isShowingUpdateAlert) {
Expand Down
1 change: 1 addition & 0 deletions MailCore/Cache/MainViewState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public class MainViewState: ObservableObject, SelectedThreadOwnable {
@ModalPublished public var isShowingUpdateAvailable = false
@ModalPublished public var isShowingSetAppAsDefaultDiscovery = false
@ModalPublished public var isShowingMyKSuiteUpgrade = false
@ModalPublished public var flushAlert: FlushAlertState?
@ModalPublished public var modifiedScheduleDraftResource: ModifiedScheduleDraftResource?
@Published public var isShowingChristmasEasterEgg = false

Expand Down
6 changes: 5 additions & 1 deletion MailCore/Utils/FlushAlertState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

import Foundation

public struct FlushAlertState: Identifiable {
public struct FlushAlertState: Identifiable, Equatable {
public let id = UUID()
public let deletedMessages: Int?
public let completion: () async -> Void
Expand All @@ -27,4 +27,8 @@ public struct FlushAlertState: Identifiable {
self.deletedMessages = deletedMessages
self.completion = completion
}

public static func == (lhs: FlushAlertState, rhs: FlushAlertState) -> Bool {
return lhs.id == rhs.id
}
}
13 changes: 0 additions & 13 deletions MailCoreUI/Components/AvatarView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -65,19 +65,6 @@ public struct AvatarView: View {
GroupRecipientsView(size: size)
} else if case .groupContact = contactConfiguration {
GroupRecipientsView(size: size)
} else if case .contact = contactConfiguration {
let avatarImageRequest = getAvatarImageRequest()
LazyImage(request: avatarImageRequest) { state in
if let image = state.image {
ContactImage(image: image, size: size)
} else {
InitialsView(
initials: displayablePerson.formatted(style: .initials),
color: displayablePerson.color,
size: size
)
}
}
} else if let avatarImageRequest = getAvatarImageRequest() {
LazyImage(request: avatarImageRequest) { state in
if let image = state.image {
Expand Down
Loading