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