Add error handling to iOS post editor (#210) (#214)

* Add error handling to post editor

* Cleanup

* Add error handling to macOS (#211)

* Add error handling to Mac app

* Log fatal errors and present alert on next launch (#212)

* Log fatal crashes and present alert on next launch

* Update crash alert copy and navigate to help forum

* Refactor logging into reuseable methods

* Refactor class to use protocol

* Clean up todo comment

* Revert "Log fatal errors and present alert on next launch (#212)"

This reverts commit 7475b57772.
This commit is contained in:
Angelo Stavrow 2022-07-28 07:38:19 -04:00 committed by GitHub
parent 262aaaaa50
commit 93c016268a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 51 additions and 2 deletions

View File

@ -115,6 +115,7 @@ struct WriteFreely_MultiPlatformApp: App {
} }
.tag(2) .tag(2)
} }
.withErrorHandling()
.frame(minWidth: 500, maxWidth: 500, minHeight: 200) .frame(minWidth: 500, maxWidth: 500, minHeight: 200)
.padding() .padding()
// .preferredColorScheme(preferences.selectedColorScheme) // See PreferencesModel for info. // .preferredColorScheme(preferences.selectedColorScheme) // See PreferencesModel for info.

View File

@ -2,6 +2,7 @@ import SwiftUI
struct PostEditorView: View { struct PostEditorView: View {
@EnvironmentObject var model: WriteFreelyModel @EnvironmentObject var model: WriteFreelyModel
@EnvironmentObject var errorHandling: ErrorHandling
@ObservedObject var post: WFAPost @ObservedObject var post: WFAPost
@State private var isHovering: Bool = false @State private var isHovering: Bool = false
@ -38,6 +39,16 @@ struct PostEditorView: View {
LocalStorageManager.standard.saveContext() LocalStorageManager.standard.saveContext()
} }
}) })
.onChange(of: model.hasError) { value in
if value {
if let error = model.currentError {
self.errorHandling.handle(error: error)
} else {
self.errorHandling.handle(error: AppError.genericError())
}
model.hasError = false
}
}
.onDisappear(perform: { .onDisappear(perform: {
DispatchQueue.main.async { DispatchQueue.main.async {
model.editor.clearLastDraft() model.editor.clearLastDraft()

View File

@ -2,11 +2,22 @@ import SwiftUI
struct MacAccountView: View { struct MacAccountView: View {
@EnvironmentObject var model: WriteFreelyModel @EnvironmentObject var model: WriteFreelyModel
@EnvironmentObject var errorHandling: ErrorHandling
var body: some View { var body: some View {
Form { Form {
AccountView() AccountView()
}
.onChange(of: model.hasError) { value in
if value {
if let error = model.currentError {
self.errorHandling.handle(error: error)
} else {
self.errorHandling.handle(error: AppError.genericError())
}
model.hasError = false
} }
}
} }
} }

View File

@ -1,6 +1,9 @@
import SwiftUI import SwiftUI
struct MacPreferencesView: View { struct MacPreferencesView: View {
@EnvironmentObject var model: WriteFreelyModel
@EnvironmentObject var errorHandling: ErrorHandling
@ObservedObject var preferences: PreferencesModel @ObservedObject var preferences: PreferencesModel
var body: some View { var body: some View {
@ -8,6 +11,16 @@ struct MacPreferencesView: View {
PreferencesView(preferences: preferences) PreferencesView(preferences: preferences)
Spacer() Spacer()
} }
.onChange(of: model.hasError) { value in
if value {
if let error = model.currentError {
self.errorHandling.handle(error: error)
} else {
self.errorHandling.handle(error: AppError.genericError())
}
model.hasError = false
}
}
} }
} }

View File

@ -2,6 +2,9 @@ import SwiftUI
import Sparkle import Sparkle
struct MacUpdatesView: View { struct MacUpdatesView: View {
@EnvironmentObject var model: WriteFreelyModel
@EnvironmentObject var errorHandling: ErrorHandling
@ObservedObject var updaterViewModel: MacUpdatesViewModel @ObservedObject var updaterViewModel: MacUpdatesViewModel
@AppStorage(WFDefaults.automaticallyChecksForUpdates, store: UserDefaults.shared) @AppStorage(WFDefaults.automaticallyChecksForUpdates, store: UserDefaults.shared)
@ -81,6 +84,16 @@ that can cause crashes and data loss.
.onChange(of: subscribeToBetaUpdates) { _ in .onChange(of: subscribeToBetaUpdates) { _ in
updaterViewModel.toggleAllowedChannels() updaterViewModel.toggleAllowedChannels()
} }
.onChange(of: model.hasError) { value in
if value {
if let error = model.currentError {
self.errorHandling.handle(error: error)
} else {
self.errorHandling.handle(error: AppError.genericError())
}
model.hasError = false
}
}
} }
} }