Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Image recommendations - Improve error handling #4831

Merged
merged 3 commits into from
May 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions Wikipedia/Code/EditPreviewViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ protocol EditPreviewViewControllerLoggingDelegate: AnyObject {
func logEditPreviewDidTapNext()
}

class EditPreviewViewController: ViewController, WMFPreviewAnchorTapAlertDelegate, InternalLinkPreviewing {
class EditPreviewViewController: ViewController, WMFPreviewDelegate, InternalLinkPreviewing {
var sectionID: Int?
var pageURL: URL
var languageCode: String?
Expand Down Expand Up @@ -63,6 +63,10 @@ class EditPreviewViewController: ViewController, WMFPreviewAnchorTapAlertDelegat
showInternalLink(url: url)
}
}

func previewWebViewContainer(_ previewWebViewContainer: PreviewWebViewContainer, didFailWithError error: any Error) {
showError(error)
}

func showExternalLinkInAlert(link: String) {
let title = WMFLocalizedString("wikitext-preview-link-external-preview-title", value: "External link", comment: "Title for external link preview popup")
Expand Down Expand Up @@ -96,7 +100,7 @@ class EditPreviewViewController: ViewController, WMFPreviewAnchorTapAlertDelegat

view.addSubview(previewWebViewContainer)
view.wmf_addConstraintsToEdgesOfView(previewWebViewContainer)
previewWebViewContainer.previewAnchorTapAlertDelegate = self
previewWebViewContainer.delegate = self

navigationItem.title = WMFLocalizedString("navbar-title-mode-edit-wikitext-preview", value: "Preview", comment: "Header text shown when wikitext changes are being previewed. {{Identical|Preview}}")

Expand Down
39 changes: 39 additions & 0 deletions Wikipedia/Code/InsertMediaSettingsViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,21 @@ final class InsertMediaSettingsViewController: ViewController {
let alternativeTextViewModel = TextViewModel(type: .alternativeText)
return [captionViewModel, alternativeTextViewModel]
}()

private lazy var reachabilityNotifier: ReachabilityNotifier = {
let notifier = ReachabilityNotifier(Configuration.current.defaultSiteDomain) { [weak self] (reachable, flags) in
if reachable {
DispatchQueue.main.async {
self?.hideOfflineAlertIfNeeded()
}
} else {
DispatchQueue.main.async {
self?.showOfflineAlertIfNeeded()
}
}
}
return notifier
}()

init(image: UIImage, searchResult: InsertMediaSearchResult, fromImageRecommendations: Bool, delegate: InsertMediaSettingsViewControllerDelegate, imageRecLoggingDelegate: InsertMediaSettingsViewControllerLoggingDelegate?, theme: Theme) {
self.image = image
Expand Down Expand Up @@ -289,10 +304,21 @@ final class InsertMediaSettingsViewController: ViewController {

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
reachabilityNotifier.start()

UIAccessibility.post(notification: .screenChanged, argument: nil)

imageRecLoggingDelegate?.logInsertMediaSettingsViewControllerDidAppear()

if !reachabilityNotifier.isReachable {
showOfflineAlertIfNeeded()
}
}

override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)

reachabilityNotifier.stop()
}

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
Expand All @@ -306,6 +332,19 @@ final class InsertMediaSettingsViewController: ViewController {
self.tableView.endUpdates()
}
}

private func showOfflineAlertIfNeeded() {
let title = CommonStrings.noInternetConnection
if UIAccessibility.isVoiceOverRunning {
UIAccessibility.post(notification: UIAccessibility.Notification.announcement, argument: title)
} else {
WMFAlertManager.sharedInstance.showErrorAlertWithMessage(title, sticky: false, dismissPreviousAlerts: true)
}
}

private func hideOfflineAlertIfNeeded() {
WMFAlertManager.sharedInstance.dismissAllAlerts()
}

// MARK: - Themeable

Expand Down
11 changes: 8 additions & 3 deletions Wikipedia/Code/PreviewWebViewContainer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ import Foundation
import WebKit
import WMF

@objc protocol WMFPreviewAnchorTapAlertDelegate: AnyObject {
@objc protocol WMFPreviewDelegate: AnyObject {
func previewWebViewContainer(_ previewWebViewContainer: PreviewWebViewContainer, didTapLink url: URL)
func previewWebViewContainer(_ previewWebViewContainer: PreviewWebViewContainer, didFailWithError error: Error)
}

class PreviewWebViewContainer: UIView, WKNavigationDelegate, Themeable {
var theme: Theme = .standard
@IBOutlet weak var previewAnchorTapAlertDelegate: WMFPreviewAnchorTapAlertDelegate!
weak var delegate: WMFPreviewDelegate!

lazy var webView: WKWebView = {
let controller = WKUserContentController()
Expand All @@ -32,9 +33,13 @@ class PreviewWebViewContainer: UIView, WKNavigationDelegate, Themeable {
decisionHandler(WKNavigationActionPolicy.allow)
return
}
previewAnchorTapAlertDelegate.previewWebViewContainer(self, didTapLink: url)
delegate?.previewWebViewContainer(self, didTapLink: url)
decisionHandler(WKNavigationActionPolicy.cancel)
}

func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: any Error) {
delegate?.previewWebViewContainer(self, didFailWithError: error)
}

func apply(theme: Theme) {
self.theme = theme
Expand Down