Better handling of pages that fail to parse

This commit is contained in:
Jackson Harper
2023-05-12 12:09:31 +08:00
parent cbdd4f0a71
commit fbcca936ea
2 changed files with 32 additions and 5 deletions

View File

@ -501,7 +501,20 @@ struct WebReaderContainerView: View {
}
}
} else if let errorMessage = viewModel.errorMessage {
Text(errorMessage).padding()
VStack {
Text(errorMessage).padding()
if viewModel.allowRetry, viewModel.hasOriginalUrl(item) {
Button("Open Original", action: {
openOriginalURL(urlString: item.pageURLString)
}).buttonStyle(RoundedRectButtonStyle())
if let urlStr = item.pageURLString, let username = dataService.currentViewer?.username, let url = URL(string: urlStr) {
Button("Attempt to Save Again", action: {
viewModel.errorMessage = nil
viewModel.saveLinkAndFetch(dataService: dataService, username: username, url: url)
}).buttonStyle(RoundedRectButtonStyle())
}
}
}
} else {
ProgressView()
.opacity(progressViewOpacity)

View File

@ -12,6 +12,7 @@ struct SafariWebLink: Identifiable {
@MainActor final class WebReaderViewModel: ObservableObject {
@Published var articleContent: ArticleContent?
@Published var errorMessage: String?
@Published var allowRetry = false
@Published var isDownloadingAudio: Bool = false
@Published var audioDownloadTask: Task<Void, Error>?
@ -46,16 +47,14 @@ struct SafariWebLink: Identifiable {
}
}
func loadContent(dataService: DataService, username: String, itemID: String, retryCount: Int = 0) async {
func loadContent(dataService: DataService, username: String, itemID: String, retryCount _: Int = 0) async {
errorMessage = nil
do {
articleContent = try await dataService.loadArticleContentWithRetries(itemID: itemID, username: username)
} catch {
if retryCount == 0 {
return await loadContent(dataService: dataService, username: username, itemID: itemID, retryCount: 1)
}
if let fetchError = error as? ContentFetchError {
allowRetry = true
switch fetchError {
case .network:
errorMessage = "We were unable to retrieve your content. Please check network connectivity and try again."
@ -212,4 +211,19 @@ struct SafariWebLink: Identifiable {
}
}
}
func saveLinkAndFetch(dataService: DataService, username: String, url: URL) {
Task {
do {
Snackbar.show(message: "Saving link")
let requestId = UUID().uuidString
_ = try await dataService.createPageFromUrl(id: requestId, url: url.absoluteString)
Snackbar.show(message: "Link saved")
await loadContent(dataService: dataService, username: username, itemID: requestId, retryCount: 0)
} catch {
Snackbar.show(message: "Error saving link")
}
}
}
}