Convert several methods to async await.

This commit is contained in:
Brent Simmons 2024-05-05 17:08:30 -07:00
parent 399703c2fe
commit fba8c52b67
4 changed files with 56 additions and 43 deletions

View File

@ -986,8 +986,8 @@ extension AppDelegate: NSWindowRestoration {
if identifier.rawValue == WindowRestorationIdentifiers.mainWindow {
mainWindow = appDelegate.createAndShowMainWindow().window
}
return mainWindow
}
return mainWindow!
}
}
// Handle Notification Actions

View File

@ -83,12 +83,12 @@ final class DetailViewController: NSViewController, WKUIDelegate {
currentWebViewController.stopMediaPlayback()
}
func canScrollDown(_ callback: @escaping (Bool) -> Void) {
currentWebViewController.canScrollDown(callback)
func canScrollDown() async -> Bool {
await currentWebViewController.canScrollDown()
}
func canScrollUp(_ callback: @escaping (Bool) -> Void) {
currentWebViewController.canScrollUp(callback)
func canScrollUp() async -> Bool {
await currentWebViewController.canScrollUp()
}
override func scrollPageDown(_ sender: Any?) {

View File

@ -166,14 +166,21 @@ final class DetailWebViewController: NSViewController {
}
@objc func userDefaultsDidChange(_ note: Notification) {
if articleTextSize != AppDefaults.shared.articleTextSize {
articleTextSize = AppDefaults.shared.articleTextSize
reloadHTMLMaintainingScrollPosition()
Task { @MainActor in
await reloadHTMLMaintainingScrollPosition()
}
}
}
@objc func currentArticleThemeDidChangeNotification(_ note: Notification) {
reloadHTMLMaintainingScrollPosition()
Task { @MainActor in
await reloadHTMLMaintainingScrollPosition()
}
}
// MARK: Media Functions
@ -184,16 +191,14 @@ final class DetailWebViewController: NSViewController {
// MARK: Scrolling
func canScrollDown(_ completion: @escaping (Bool) -> Void) {
fetchScrollInfo { (scrollInfo) in
completion(scrollInfo?.canScrollDown ?? false)
}
func canScrollDown() async -> Bool {
let scrollInfo = await fetchScrollInfo()
return scrollInfo?.canScrollDown ?? false
}
func canScrollUp(_ completion: @escaping (Bool) -> Void) {
fetchScrollInfo { (scrollInfo) in
completion(scrollInfo?.canScrollUp ?? false)
}
func canScrollUp() async -> Bool {
let scrollInfo = await fetchScrollInfo()
return scrollInfo?.canScrollUp ?? false
}
override func scrollPageDown(_ sender: Any?) {
@ -326,11 +331,10 @@ private extension DetailWebViewController {
}
}
func reloadHTMLMaintainingScrollPosition() {
fetchScrollInfo() { scrollInfo in
self.windowScrollY = scrollInfo?.offsetY
self.reloadHTML()
}
func reloadHTMLMaintainingScrollPosition() async {
let scrollInfo = await fetchScrollInfo()
windowScrollY = scrollInfo?.offsetY
self.reloadHTML()
}
func reloadHTML() {
@ -380,23 +384,22 @@ private extension DetailWebViewController {
webView.loadHTMLString(html, baseURL: baseURL)
}
func fetchScrollInfo(_ completion: @escaping (ScrollInfo?) -> Void) {
func fetchScrollInfo() async -> ScrollInfo? {
let javascriptString = "var x = {contentHeight: document.body.scrollHeight, offsetY: window.pageYOffset}; x"
webView.evaluateJavaScript(javascriptString) { (info, error) in
guard let info = info as? [String: Any] else {
completion(nil)
return
}
guard let contentHeight = info["contentHeight"] as? CGFloat, let offsetY = info["offsetY"] as? CGFloat else {
completion(nil)
return
}
let scrollInfo = ScrollInfo(contentHeight: contentHeight, viewHeight: self.webView.frame.height, offsetY: offsetY)
completion(scrollInfo)
guard let info = try? await webView.evaluateJavaScript(javascriptString) else {
return nil
}
guard let info = info as? [String: Any] else {
return nil
}
guard let contentHeight = info["contentHeight"] as? CGFloat, let offsetY = info["offsetY"] as? CGFloat else {
return nil
}
let scrollInfo = ScrollInfo(contentHeight: contentHeight, viewHeight: self.webView.frame.height, offsetY: offsetY)
return scrollInfo
}
#if !MAC_APP_STORE

View File

@ -288,26 +288,36 @@ final class MainWindowController : NSWindowController, NSUserInterfaceValidation
// MARK: - Actions
@IBAction func scrollOrGoToNextUnread(_ sender: Any?) {
guard let detailViewController = detailViewController else {
guard let detailViewController else {
return
}
detailViewController.canScrollDown { (canScroll) in
Task { @MainActor in
let canScroll = await detailViewController.canScrollDown()
NSCursor.setHiddenUntilMouseMoves(true)
canScroll ? detailViewController.scrollPageDown(sender) : self.nextUnread(sender)
if canScroll {
detailViewController.scrollPageDown(sender)
} else {
self.nextUnread(sender)
}
}
}
@IBAction func scrollUp(_ sender: Any?) {
guard let detailViewController = detailViewController else {
guard let detailViewController else {
return
}
detailViewController.canScrollUp { (canScroll) in
if (canScroll) {
Task { @MainActor in
let canScroll = await detailViewController.canScrollUp()
if canScroll {
NSCursor.setHiddenUntilMouseMoves(true)
detailViewController.scrollPageUp(sender)
}
}
}
@IBAction func copyArticleURL(_ sender: Any?) {