From e470d7b58e35658f7066a83da62aa8df577885d5 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sat, 2 Oct 2021 11:18:38 -0400 Subject: [PATCH] Add pull to refresh --- Gemini-iOS/BrowserWebViewController.swift | 21 +++++++++++++++++++-- Gemini-iOS/Preferences.swift | 6 ++++++ Gemini-iOS/PreferencesView.swift | 1 + 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Gemini-iOS/BrowserWebViewController.swift b/Gemini-iOS/BrowserWebViewController.swift index 5d1265e..1f9df30 100644 --- a/Gemini-iOS/BrowserWebViewController.swift +++ b/Gemini-iOS/BrowserWebViewController.swift @@ -74,6 +74,7 @@ class BrowserWebViewController: UIViewController { // this doesn't default to .default :S webView.scrollView.indicatorStyle = .default webView.scrollView.keyboardDismissMode = .interactive + configureWebViewRefreshControl() webView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(webView) NSLayoutConstraint.activate([ @@ -154,14 +155,28 @@ class BrowserWebViewController: UIViewController { } } + private func configureWebViewRefreshControl(pullToRefreshEnabled: Bool = Preferences.shared.pullToRefreshEnabled) { + if pullToRefreshEnabled { + let refreshControl = UIRefreshControl() + refreshControl.addTarget(navigator, action: #selector(NavigationManager.reload), for: .valueChanged) + webView.scrollView.refreshControl = refreshControl + } else { + webView.scrollView.refreshControl = nil + } + } + func reload() { loaded = false loadedFallback = false document = nil - loadDocument() + loadDocument() { + DispatchQueue.main.async { + self.webView.scrollView.refreshControl?.endRefreshing() + } + } } - private func loadDocument() { + private func loadDocument(completion: (() -> Void)? = nil) { guard !loaded else { return } webView.isHidden = true @@ -207,6 +222,8 @@ class BrowserWebViewController: UIViewController { } } } + + completion?() } if #available(iOS 15.0, *) { task!.attribution = .user diff --git a/Gemini-iOS/Preferences.swift b/Gemini-iOS/Preferences.swift index 95ba02c..f013173 100644 --- a/Gemini-iOS/Preferences.swift +++ b/Gemini-iOS/Preferences.swift @@ -49,6 +49,9 @@ class Preferences: Codable, ObservableObject { if let stored = try container.decodeIfPresent(Bool.self, forKey: .hideToolbarsWhenScrolling) { hideToolbarsWhenScrolling = stored } + if let stored = try container.decodeIfPresent(Bool.self, forKey: .pullToRefreshEnabled) { + pullToRefreshEnabled = stored + } } func encode(to encoder: Encoder) throws { @@ -63,6 +66,7 @@ class Preferences: Codable, ObservableObject { try container.encode(useReaderMode, forKey: .useReaderMode) try container.encode(hideToolbarsWhenScrolling, forKey: .hideToolbarsWhenScrolling) + try container.encode(pullToRefreshEnabled, forKey: .pullToRefreshEnabled) } @Published var homepage = AppDelegate.defaultHomepage @@ -74,6 +78,7 @@ class Preferences: Codable, ObservableObject { @Published var useReaderMode = false @Published var hideToolbarsWhenScrolling = true + @Published var pullToRefreshEnabled = true enum CodingKeys: String, CodingKey { case homepage @@ -85,6 +90,7 @@ class Preferences: Codable, ObservableObject { case useReaderMode case hideToolbarsWhenScrolling + case pullToRefreshEnabled } } diff --git a/Gemini-iOS/PreferencesView.swift b/Gemini-iOS/PreferencesView.swift index 8de09f9..660b0ea 100644 --- a/Gemini-iOS/PreferencesView.swift +++ b/Gemini-iOS/PreferencesView.swift @@ -74,6 +74,7 @@ struct PreferencesView: View { private var behaviorSection: some View { Section(header: Text("Behavior")) { + Toggle("Pull to Refresh", isOn: $preferences.pullToRefreshEnabled) Toggle("Hide Toolbars When Scrolling", isOn: $preferences.hideToolbarsWhenScrolling) } }