From fbcca936eac89d2c78206b220ab355b81e543e07 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Fri, 12 May 2023 12:09:31 +0800 Subject: [PATCH] Better handling of pages that fail to parse --- .../Views/WebReader/WebReaderContainer.swift | 15 ++++++++++++- .../Views/WebReader/WebReaderViewModel.swift | 22 +++++++++++++++---- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift index ede88ade0..7db6b69a2 100644 --- a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift +++ b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderContainer.swift @@ -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) diff --git a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderViewModel.swift index b3c5065ff..0e83fff5f 100644 --- a/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/WebReader/WebReaderViewModel.swift @@ -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? @@ -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") + } + } + } }