From fef96d4031d6f4811ec950d0d44e89477eac22b4 Mon Sep 17 00:00:00 2001
From: Chris Offner <chrisoffner@pm.me>
Date: Thu, 25 Mar 2021 19:25:20 +0100
Subject: [PATCH] - added .onDelete functionality in MailListView - refactored
 some properties from MailListView into InboxView to make proper toolbar and
 navigation bar work - changed slider button label for key/ID to slanted key

---
 .../SwiftUI/FolderView/FolderOverView.swift   |   2 +-
 .../SwiftUI/Inbox/InboxView.swift             | 115 +++++++++++++-----
 .../SwiftUI/Inbox/MailListView.swift          |  82 +++----------
 enzevalos_iphone/SwiftUI/LetterboxApp.swift   |   2 +-
 4 files changed, 100 insertions(+), 101 deletions(-)

diff --git a/enzevalos_iphone/SwiftUI/FolderView/FolderOverView.swift b/enzevalos_iphone/SwiftUI/FolderView/FolderOverView.swift
index 68b61ae2..2842f8ae 100644
--- a/enzevalos_iphone/SwiftUI/FolderView/FolderOverView.swift
+++ b/enzevalos_iphone/SwiftUI/FolderView/FolderOverView.swift
@@ -17,7 +17,7 @@ struct FolderOverView: View {
     var body: some View {
         List (folders, id: \.self){ f in
             NavigationLink(
-                destination: MailListView(folderpath: f.path ?? f.name, name: f.name)
+                destination: MailListView(folderPath: f.path ?? f.name, folderName: f.name)
                     .environment(\.managedObjectContext, PersistentDataProvider.dataProvider.persistentContainer.viewContext)
             ) {
                     FolderRow(folder: f)
diff --git a/enzevalos_iphone/SwiftUI/Inbox/InboxView.swift b/enzevalos_iphone/SwiftUI/Inbox/InboxView.swift
index d24de44c..5fa3a96f 100644
--- a/enzevalos_iphone/SwiftUI/Inbox/InboxView.swift
+++ b/enzevalos_iphone/SwiftUI/Inbox/InboxView.swift
@@ -12,58 +12,109 @@ import CoreData
 //          Updating text -> Last update, updating, no connection...
 
 struct InboxView: View {    
-    var folderpath: String
+    var folderPath: String
     var name: String
-    
-    @State var goToFolders = false
+    @State private var updating = false
+    @State private var composeMail = false
+    @State private var goToFolders = false
     
     var body: some View {
-        NavigationView{
-            MailListView(folderpath: folderpath, name: name)
-                .environment(\.managedObjectContext,
-                             PersistentDataProvider
-                                .dataProvider
-                                .persistentContainer
-                                .viewContext)
-                .navigationBarItems(leading: self.folderButton, trailing: keyManagementButton)
+        NavigationView {
+            mailListView
+                .onAppear(perform: updateMails)
+                .sheet(isPresented: $composeMail) { ComposeView() }
+                .navigationBarItems(leading: folderButton, trailing: keyManagementButton)
+                .toolbar {
+                    ToolbarItem(placement: .status) {
+                        lastUpdate
+                    }
+                    
+                    ToolbarItemGroup(placement: .bottomBar) {
+                        Spacer()
+                        composeButton
+                    }
+                }
+        }.navigationViewStyle(DoubleColumnNavigationViewStyle())
+    }
+    
+    private var mailListView: some View {
+        MailListView(folderPath: folderPath, folderName: name)
+            .environment(\.managedObjectContext,
+                         PersistentDataProvider
+                            .dataProvider
+                            .persistentContainer
+                            .viewContext)
+    }
+    
+    private var composeButton: some View {
+        Button {
+            composeMail = true
+        } label: {
+            Image(systemName: "square.and.pencil").imageScale(.large)
         }
     }
     
     private var keyManagementButton: some View {
         NavigationLink(destination: KeyManagementOverview()) {
-            Image(systemName: "slider.horizontal.3")
+            Image(systemName: "key")
                 .imageScale(.large)
+                .rotationEffect(Angle(degrees: 45))
         }
     }
     
-    private var folderButton: some View {
-        Button(action: {
-            goToFolders = true
-        }) {
-            Image(systemName: "tray.2")
-                .imageScale(.large)
+    private var lastUpdate: some View {
+        var text = NSLocalizedString("Updating", comment: "updating...")
+        
+        if !updating {
+            let last = Date()
+            let dateFormatter = DateFormatter()
+            dateFormatter.locale = Locale.current
+            dateFormatter.timeStyle = .medium
+            let dateString = dateFormatter.string(from: last)
+            text = NSLocalizedString("LastUpdate", comment: "") + " " + dateString
+        }
+        
+        return Button(action: updateMails) {
+            Text(text).font(.callout)
+        }
+    }
+    
+    private func updateMails() {
+        guard !updating else {
+            return
         }
-        .background(
-            NavigationLink(destination: FolderOverView()
-                            .environment(\.managedObjectContext,
-                                         PersistentDataProvider
-                                            .dataProvider
-                                            .persistentContainer
-                                            .viewContext),
-                           isActive: $goToFolders) {
-                EmptyView()
+        
+        LetterboxModel
+            .instance
+            .mailHandler
+            .updateFolder(folderpath: folderPath) { error in
+                if error == nil {
+                    self.updating = false
+                }
+                // TODO: Add error message
             }
-            .hidden()
-        )
+        updating = true
     }
     
+    private var folderButton: some View {
+        Button {
+            goToFolders = true
+        } label:  {
+            Image(systemName: "tray.2").imageScale(.large)
+        }
+        .background(NavigationLink(destination: FolderOverView()
+                                    .environment(\.managedObjectContext,
+                                                 PersistentDataProvider
+                                                    .dataProvider
+                                                    .persistentContainer
+                                                    .viewContext),
+                                   isActive: $goToFolders) {})
+    }
 }
 
-
-
 struct InboxView_Previews: PreviewProvider {
     static var previews: some View {
-        return InboxView(folderpath: "INBOX", name: "INBOX")
+        return InboxView(folderPath: "INBOX", name: "INBOX")
             .environment(\.managedObjectContext,
                          PersistentDataProvider
                             .proxyPersistentDataProvider
diff --git a/enzevalos_iphone/SwiftUI/Inbox/MailListView.swift b/enzevalos_iphone/SwiftUI/Inbox/MailListView.swift
index 62748290..6b6fa334 100644
--- a/enzevalos_iphone/SwiftUI/Inbox/MailListView.swift
+++ b/enzevalos_iphone/SwiftUI/Inbox/MailListView.swift
@@ -18,16 +18,15 @@ struct MailListView: View {
     var folderPath: String
     var folderName: String
     
-    @State private var updating = false
     @State private var showUser = false
     @State private var searchText = ""
     @State private var searchType = SearchType.All
-    @State private var composeMail = false
     
-    init(folderpath: String, name: String) {
-        fetchRequest = MailRecord.mailsInFolderFetchRequest(folderpath: folderpath)
-        self.folderPath = folderpath
-        self.folderName = name
+    
+    init(folderPath: String, folderName: String) {
+        fetchRequest = MailRecord.mailsInFolderFetchRequest(folderpath: folderPath)
+        self.folderPath = folderPath
+        self.folderName = folderName
     }
     
     var body: some View {
@@ -36,72 +35,21 @@ struct MailListView: View {
             
             mailList.padding(-12)
         }
-            .navigationBarTitle(folderName, displayMode: .inline)
-            .onAppear { updateMails() }
-            .sheet(isPresented: $composeMail) { ComposeView() }
-            .toolbar {
-                ToolbarItem(placement: .status) {
-                    lastUpdate
-                }
-                
-                ToolbarItemGroup(placement: .bottomBar) {
-                    Spacer()
-                    composeButton
-                }
-            }
+        .navigationBarTitle(folderName, displayMode: .inline)
     }
     
     private var mailList: some View {
-        List(self.mails.filter(filterKeyRecord), id: \.self) { record in
-            NavigationLink(destination: ReadMainView(model: ReadModel(mail: record))) {
-                MailRowView(mail: record)
+        List {
+            ForEach(self.mails.filter(filterKeyRecord), id: \.self) { email in
+                NavigationLink(destination: ReadMainView(model: ReadModel(mail: email))) {
+                    MailRowView(mail: email)
+                }
+            }
+            .onDelete {_ in
+                // TODO: Perform actual deletion of email
             }
         }
         .listStyle(InsetGroupedListStyle())
-        .resignKeyboardOnDragGesture() // hide keyboard when dragging
-    }
-    
-    private var composeButton: some View {
-        Button {
-            composeMail = true
-        } label: {
-            Image(systemName: "square.and.pencil").imageScale(.large)
-        }
-    }
-    
-    private var lastUpdate: some View {
-        var text = NSLocalizedString("Updating", comment: "updating...")
-        
-        if !updating {
-            let last = Date()
-            let dateFormatter = DateFormatter()
-            dateFormatter.locale = Locale.current
-            dateFormatter.timeStyle = .medium
-            let dateString = dateFormatter.string(from: last)
-            text = NSLocalizedString("LastUpdate", comment: "") + " " + dateString
-        }
-        
-        return Button(action: updateMails) {
-            Text(text)
-                .font(.callout)
-        }
-    }
-    
-    func updateMails() {
-        guard !updating else {
-            return
-        }
-        
-        LetterboxModel
-            .instance
-            .mailHandler
-            .updateFolder(folderpath: folderPath) { error in
-                if error == nil {
-                    self.updating = false
-                }
-                // TODO: Add error message
-            }
-        updating = true
     }
     
     func filterKeyRecord(keyRecord: MailRecord) -> Bool {
@@ -133,7 +81,7 @@ struct MailListView: View {
 
 struct MailListView_Previews: PreviewProvider {
     static var previews: some View {
-        MailListView(folderpath: "INBOX", name: "INBOX")
+        MailListView(folderPath: "INBOX", folderName: "INBOX")
             .environment(\.managedObjectContext, PersistentDataProvider.proxyPersistentDataProvider.persistentContainer.viewContext)
     }
 }
diff --git a/enzevalos_iphone/SwiftUI/LetterboxApp.swift b/enzevalos_iphone/SwiftUI/LetterboxApp.swift
index 2f93ce7c..e0fee28d 100644
--- a/enzevalos_iphone/SwiftUI/LetterboxApp.swift
+++ b/enzevalos_iphone/SwiftUI/LetterboxApp.swift
@@ -31,7 +31,7 @@ struct LetterboxApp: App {
                 case .GENERATEKEYS:
                     PermissionRequestView() // TODO Wait
                 case .LAUNCHEDBEFORE:
-                    InboxView(folderpath: MailHandler.INBOX, name: NSLocalizedString("Inbox", comment: "Inbox"))
+                    InboxView(folderPath: MailHandler.INBOX, name: NSLocalizedString("Inbox", comment: "Inbox"))
                         .environment(\.managedObjectContext, PersistentDataProvider.dataProvider.persistentContainer.viewContext)
                 }
             }
-- 
GitLab