Skip to content

Commit

Permalink
feat: MoveEmailView without sheetstate
Browse files Browse the repository at this point in the history
  • Loading branch information
PhilippeWeidmann committed May 2, 2023
1 parent fe3fa71 commit f8df3f1
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 57 deletions.
11 changes: 4 additions & 7 deletions Mail/Views/Bottom sheets/Actions/ActionsPanelViewModifier.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,11 @@ struct ActionsPanelViewModifier: ViewModifier {
@EnvironmentObject private var mailboxManager: MailboxManager
@EnvironmentObject private var navigationStore: NavigationStore

@State private var moveAction: MoveAction?
@State private var reportJunkActionsTarget: ActionsTarget?
@State private var reportedForPhishingMessage: Message?
@State private var reportedForDisplayProblemMessage: Message?

@StateObject private var moveSheet = MoveSheet()

@Binding var actionsTarget: ActionsTarget?

var completionHandler: (() -> Void)?
Expand All @@ -44,17 +43,15 @@ struct ActionsPanelViewModifier: ViewModifier {
content.adaptivePanel(item: $actionsTarget) { target in
ActionsView(mailboxManager: mailboxManager,
target: target,
moveSheet: moveSheet,
moveAction: $moveAction,
messageReply: $navigationStore.messageReply,
reportJunkActionsTarget: $reportJunkActionsTarget,
reportedForDisplayProblemMessage: $reportedForDisplayProblemMessage) {
completionHandler?()
}
}
.sheet(isPresented: $moveSheet.isShowing) {
if case .move(let folderId, let handler) = moveSheet.state {
MoveEmailView.sheetView(from: folderId, moveHandler: handler)
}
.sheet(item: $moveAction) { moveAction in
MoveEmailView.sheetView(moveAction: moveAction)
}
.floatingPanel(item: $reportJunkActionsTarget) { target in
ReportJunkView(mailboxManager: mailboxManager,
Expand Down
16 changes: 8 additions & 8 deletions Mail/Views/Bottom sheets/Actions/ActionsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ struct ActionsView: View {

init(mailboxManager: MailboxManager,
target: ActionsTarget,
moveSheet: MoveSheet? = nil,
moveAction: Binding<MoveAction?>? = nil,
messageReply: Binding<MessageReply?>? = nil,
reportJunkActionsTarget: Binding<ActionsTarget?>? = nil,
reportedForDisplayProblemMessage: Binding<Message?>? = nil,
Expand All @@ -38,13 +38,13 @@ struct ActionsView: View {
}

_viewModel = StateObject(wrappedValue: ActionsViewModel(mailboxManager: mailboxManager,
target: target,
moveSheet: moveSheet,
messageReply: messageReply,
reportJunkActionsTarget: reportJunkActionsTarget,
reportedForDisplayProblemMessage: reportedForDisplayProblemMessage,
matomoCategory: matomoCategory,
completionHandler: completionHandler))
target: target,
moveAction: moveAction,
messageReply: messageReply,
reportJunkActionsTarget: reportJunkActionsTarget,
reportedForDisplayProblemMessage: reportedForDisplayProblemMessage,
matomoCategory: matomoCategory,
completionHandler: completionHandler))
}

var body: some View {
Expand Down
12 changes: 4 additions & 8 deletions Mail/Views/Bottom sheets/Actions/ActionsViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ enum ActionsTarget: Equatable, Identifiable {
@MainActor class ActionsViewModel: ObservableObject {
private let mailboxManager: MailboxManager
private let target: ActionsTarget
private let moveSheet: MoveSheet?
private let moveAction: Binding<MoveAction?>?
private let messageReply: Binding<MessageReply?>?
private let reportJunkActionsTarget: Binding<ActionsTarget?>?
private let reportedForPhishingMessage: Binding<Message?>?
Expand All @@ -224,7 +224,7 @@ enum ActionsTarget: Equatable, Identifiable {

init(mailboxManager: MailboxManager,
target: ActionsTarget,
moveSheet: MoveSheet? = nil,
moveAction: Binding<MoveAction?>? = nil,
messageReply: Binding<MessageReply?>? = nil,
reportJunkActionsTarget: Binding<ActionsTarget?>? = nil,
reportedForPhishingMessage: Binding<Message?>? = nil,
Expand All @@ -233,7 +233,7 @@ enum ActionsTarget: Equatable, Identifiable {
completionHandler: (() -> Void)? = nil) {
self.mailboxManager = mailboxManager
self.target = target.freeze()
self.moveSheet = moveSheet
self.moveAction = moveAction
self.messageReply = messageReply
self.reportJunkActionsTarget = reportJunkActionsTarget
self.reportedForPhishingMessage = reportedForPhishingMessage
Expand Down Expand Up @@ -424,11 +424,7 @@ enum ActionsTarget: Equatable, Identifiable {
folderId = message.folderId
}

moveSheet?.state = .move(folderId: folderId) { folder in
Task {
try await self.move(to: folder)
}
}
moveAction?.wrappedValue = MoveAction(fromFolderId: folderId, target: target)
}

private func postpone() {
Expand Down
23 changes: 7 additions & 16 deletions Mail/Views/Thread List/ThreadListSwipeAction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,7 @@ private struct SwipeActionView: View {

@EnvironmentObject private var mailboxManager: MailboxManager

@ObservedObject var moveSheet: MoveSheet

@Binding var moveAction: MoveAction?
@Binding var actionsTarget: ActionsTarget?

let thread: Thread
Expand Down Expand Up @@ -60,12 +59,7 @@ private struct SwipeActionView: View {
case .readUnread:
try await mailboxManager.toggleRead(threads: [thread])
case .move:
moveSheet.state = .move(folderId: viewModel.folder.id) { folder in
guard thread.folder != folder else { return }
Task {
try await self.move(thread: thread, to: folder)
}
}
moveAction = MoveAction(fromFolderId: viewModel.folder.id, target: .threads([thread], false))
case .favorite:
try await mailboxManager.toggleStar(threads: [thread])
case .postPone:
Expand Down Expand Up @@ -108,8 +102,7 @@ struct ThreadListSwipeActions: ViewModifier {
@AppStorage(UserDefaults.shared.key(.swipeFullTrailing)) private var swipeFullTrailing = DefaultPreferences.swipeFullTrailing
@AppStorage(UserDefaults.shared.key(.swipeTrailing)) private var swipeTrailing = DefaultPreferences.swipeTrailing

@StateObject private var moveSheet = MoveSheet()

@State private var moveAction: MoveAction?
@State private var actionsTarget: ActionsTarget?

let thread: Thread
Expand All @@ -131,10 +124,8 @@ struct ThreadListSwipeActions: ViewModifier {
edgeActions([swipeFullTrailing, swipeTrailing])
}
.actionsPanel(actionsTarget: $actionsTarget)
.sheet(isPresented: $moveSheet.isShowing) {
if case .move(let folderId, let handler) = moveSheet.state {
MoveEmailView.sheetView(from: folderId, moveHandler: handler)
}
.sheet(item: $moveAction) { moveAction in
MoveEmailView.sheetView(moveAction: moveAction)
}
}
}
Expand All @@ -143,7 +134,7 @@ struct ThreadListSwipeActions: ViewModifier {
private func edgeActions(_ actions: [SwipeAction]) -> some View {
if !multipleSelectionViewModel.isEnabled {
ForEach(actions.filter { $0 != .none }, id: \.rawValue) { action in
SwipeActionView(moveSheet: moveSheet,
SwipeActionView(moveAction: $moveAction,
actionsTarget: $actionsTarget,
thread: thread,
viewModel: viewModel,
Expand All @@ -165,7 +156,7 @@ extension View {

struct ThreadListSwipeAction_Previews: PreviewProvider {
static var previews: some View {
SwipeActionView(moveSheet: MoveSheet(),
SwipeActionView(moveAction: .constant(nil),
actionsTarget: .constant(nil),
thread: PreviewHelper.sampleThread,
viewModel: ThreadListViewModel(mailboxManager: PreviewHelper.sampleMailboxManager,
Expand Down
6 changes: 0 additions & 6 deletions Mail/Views/Thread List/ThreadListView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,6 @@ import MailResources
import RealmSwift
import SwiftUI

class MoveSheet: SheetState<MoveSheet.State> {
enum State {
case move(folderId: String?, moveHandler: MoveEmailView.MoveHandler)
}
}

class FlushAlertState: Identifiable {
let id = UUID()
let deletedMessages: Int?
Expand Down
63 changes: 51 additions & 12 deletions Mail/Views/Thread/MoveEmailView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,29 @@ import MailResources
import RealmSwift
import SwiftUI

struct MoveAction: Identifiable {
var id: String {
return "\(target.id)\(fromFolderId ?? "")"
}

let fromFolderId: String?
let target: ActionsTarget
}

struct MoveEmailView: View {
typealias MoveHandler = (Folder) -> Void
@LazyInjectService private var matomo: MatomoUtils

@Environment(\.dismiss) private var dismiss

@EnvironmentObject private var mailboxManager: MailboxManager

typealias MoveHandler = (Folder) -> Void

// swiftlint:disable empty_count
@ObservedResults(Folder.self, where: { $0.role != .draft && $0.parents.count == 0 && $0.toolType == nil }) var folders
@State private var isShowingCreateFolderAlert = false

@LazyInjectService private var matomo: MatomoUtils

let currentFolderId: String?
let moveHandler: MoveEmailView.MoveHandler
let moveAction: MoveAction

var body: some View {
ScrollView {
Expand All @@ -63,31 +73,60 @@ struct MoveEmailView: View {
.environment(\.folderCellType, .indicator)
.matomoView(view: ["MoveEmailView"])
.customAlert(isPresented: $isShowingCreateFolderAlert) {
CreateFolderView(mode: .move(moveHandler: moveHandler))
CreateFolderView(mode: .move(moveHandler: { newFolder in
Task {
try await move(to: newFolder)
}
}))
}
}

private func move(to folder: Folder) async throws {
let undoRedoAction: UndoRedoAction
let snackBarMessage: String
switch moveAction.target {
case .threads(let threads, _):
guard threads.first?.folder != folder else { return }
undoRedoAction = try await mailboxManager.move(threads: threads, to: folder)
snackBarMessage = MailResourcesStrings.Localizable.snackbarThreadsMoved(folder.localizedName)
case .message(let message):
guard message.folderId != folder.id else { return }
var messages = [message]
messages.append(contentsOf: message.duplicates)
undoRedoAction = try await mailboxManager.move(messages: messages, to: folder)
snackBarMessage = MailResourcesStrings.Localizable.snackbarMessageMoved(folder.localizedName)
}

IKSnackBar.showCancelableSnackBar(message: snackBarMessage,
cancelSuccessMessage: MailResourcesStrings.Localizable.snackbarMoveCancelled,
undoRedoAction: undoRedoAction,
mailboxManager: mailboxManager)
}

private func listOfFolders(nestableFolders: [NestableFolder]) -> some View {
ForEach(nestableFolders) { nestableFolder in
FolderCell(folder: nestableFolder, currentFolderId: currentFolderId) { folder in
moveHandler(folder)
NotificationCenter.default.post(Notification(name: Constants.dismissMoveSheetNotificationName))
FolderCell(folder: nestableFolder, currentFolderId: moveAction.fromFolderId) { folder in
Task {
try await move(to: folder)
NotificationCenter.default.post(Notification(name: Constants.dismissMoveSheetNotificationName))
}
}
}
}
}

extension MoveEmailView {
static func sheetView(from folderId: String?, moveHandler: @escaping MoveEmailView.MoveHandler) -> some View {
static func sheetView(moveAction: MoveAction) -> some View {
SheetView {
MoveEmailView(currentFolderId: folderId, moveHandler: moveHandler)
MoveEmailView(moveAction: moveAction)
}
}
}

struct MoveMessageView_Previews: PreviewProvider {
static var previews: some View {
MoveEmailView(currentFolderId: nil) { _ in /* Preview */ }
MoveEmailView(moveAction: MoveAction(fromFolderId: PreviewHelper.sampleFolder.id,
target: .message(PreviewHelper.sampleMessage)))
.environmentObject(PreviewHelper.sampleMailboxManager)
}
}

0 comments on commit f8df3f1

Please sign in to comment.