Skip to content

Commit

Permalink
Merge pull request #796 from Infomaniak/perf-list
Browse files Browse the repository at this point in the history
perf(ThreadListView): Remove nested if
  • Loading branch information
valentinperignon committed Jun 12, 2023
2 parents 916902d + 9d2b9f5 commit 93c493c
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 22 deletions.
27 changes: 22 additions & 5 deletions Mail/Utils/AdaptivePanelViewModifier.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,34 @@ struct AdaptivePanelViewModifier<Item: Identifiable, PanelContent: View>: ViewMo
@Binding var item: Item?
@ViewBuilder var panelContent: (Item) -> PanelContent

enum AdaptiveSizeType {
case compact
case regular
}

func body(content: Content) -> some View {
if isCompactWindow {
content.floatingPanel(item: $item) { item in
content
.floatingPanel(item: getBindingForSize(.compact)) { item in
panelContent(item)
}
} else {
content.popover(item: $item) { item in
.popover(item: getBindingForSize(.regular)) { item in
panelContent(item)
.padding()
.frame(idealWidth: 400)
}
}
}

func getBindingForSize(_ size: AdaptiveSizeType) -> Binding<Item?> {
// We can't use if statement in this modifier because this creates performance issues in the List:
// => SwiftUI needs to create each element of the list before rendering if an if statement is present)
Binding(get: {
if isCompactWindow && size == .compact || !isCompactWindow && size == .regular {
return item
} else {
return nil
}
}, set: { newItem in
item = newItem
})
}
}
29 changes: 14 additions & 15 deletions Mail/Views/Thread List/ThreadListSwipeAction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -110,25 +110,24 @@ struct ThreadListSwipeActions: ViewModifier {
let multipleSelectionViewModel: ThreadListMultipleSelectionViewModel

func body(content: Content) -> some View {
if viewModel.folder.role == .draft {
content
.swipeActions(edge: .trailing) {
edgeActions([.delete])
}
} else {
content
.swipeActions(edge: .leading) {
content
.swipeActions(edge: .leading) {
if viewModel.folder.role != .draft {
edgeActions([swipeFullLeading, swipeLeading])
}
.swipeActions(edge: .trailing) {
}
.swipeActions(edge: .trailing) {
if viewModel.folder.role == .draft {
edgeActions([.delete])
} else {
edgeActions([swipeFullTrailing, swipeTrailing])
}
.actionsPanel(actionsTarget: $actionsTarget)
.sheet(item: $moveAction) { moveAction in
MoveEmailView(moveAction: moveAction)
.sheetViewStyle()
}
}
}
.actionsPanel(actionsTarget: $actionsTarget)
.sheet(item: $moveAction) { moveAction in
MoveEmailView(moveAction: moveAction)
.sheetViewStyle()
}
}

@MainActor @ViewBuilder
Expand Down
3 changes: 1 addition & 2 deletions Mail/Views/Thread List/ThreadListView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ struct ThreadListView: View {

@Binding private var editedMessageDraft: Draft?
@Binding private var messageReply: MessageReply?

private var shouldDisplayEmptyView: Bool {
viewModel.folder.lastUpdate != nil && viewModel.sections.isEmpty && !viewModel.isLoadingPage
}
Expand Down Expand Up @@ -129,7 +129,6 @@ struct ThreadListView: View {
isSelected: viewModel.selectedThread?.uid == thread.uid,
isMultiSelected: multipleSelectionViewModel.selectedItems
.contains { $0.id == thread.id })
.id(thread.id)
}
} header: {
if threadDensity != .compact {
Expand Down

0 comments on commit 93c493c

Please sign in to comment.