Stub out mark as read and star functionality

This commit is contained in:
Maurice Parker
2020-07-09 16:34:47 -05:00
parent 94f956b41f
commit 3e61c7044b
8 changed files with 95 additions and 18 deletions

View File

@@ -8,6 +8,16 @@
import Foundation
enum ArticleReadButtonState {
case on
case off
}
enum ArticleStarButtonState {
case on
case off
}
enum ArticleExtractorButtonState {
case error
case animated

View File

@@ -20,14 +20,23 @@ protocol ArticleModelDelegate: class {
func selectArticle(_: ArticleModel, article: Article)
}
protocol ArticleManager: class {
var currentArticle: Article? { get }
}
class ArticleModel: ObservableObject {
weak var articleManager: ArticleManager?
weak var delegate: ArticleModelDelegate?
var webViewProvider: WebViewProvider? {
return delegate?.articleModelWebViewProvider
}
var currentArticle: Article? {
return articleManager?.currentArticle
}
// MARK: API
func findPrevArticle(_ article: Article) -> Article? {
@@ -41,6 +50,19 @@ class ArticleModel: ObservableObject {
func selectArticle(_ article: Article) {
delegate?.selectArticle(self, article: article)
}
func toggleReadForCurrentArticle() {
if let article = currentArticle {
markArticles([article], statusKey: .starred, flag: !article.status.starred)
}
}
func toggleStarForCurrentArticle() {
if let article = currentArticle {
markArticles([article], statusKey: .starred, flag: !article.status.starred)
}
}
}

View File

@@ -9,11 +9,15 @@
import Foundation
import Account
import Articles
import RSCore
final class SceneModel: ObservableObject {
@Published var refreshProgressState = RefreshProgressModel.State.none
var undoManager: UndoManager?
var undoableCommands = [UndoableCommand]()
var sidebarModel: SidebarModel?
var timelineModel: TimelineModel?
var articleModel: ArticleModel?
@@ -22,7 +26,7 @@ final class SceneModel: ObservableObject {
private var articleIconSchemeHandler: ArticleIconSchemeHandler? = nil
private var webViewProvider: WebViewProvider? = nil
// MARK: API
// MARK: Initialization API
func startup() {
self.refreshProgressModel = RefreshProgressModel()
@@ -31,7 +35,28 @@ final class SceneModel: ObservableObject {
self.articleIconSchemeHandler = ArticleIconSchemeHandler(sceneModel: self)
self.webViewProvider = WebViewProvider(articleIconSchemeHandler: self.articleIconSchemeHandler!)
}
// MARK: Article Status Change API
func toggleReadForCurrentArticle() {
articleModel?.toggleReadForCurrentArticle()
}
func toggleRead(_ article: Article) {
guard !article.status.read || article.isAvailableToMarkUnread else { return }
markArticles([article], statusKey: .read, flag: !article.status.read)
}
func toggleStarForCurrentArticle() {
articleModel?.toggleStarForCurrentArticle()
}
func toggleStar(_ article: Article) {
markArticles([article], statusKey: .starred, flag: !article.status.starred)
}
// MARK: Resource lookup API
func articleFor(_ articleID: String) -> Article? {
return timelineModel?.articleFor(articleID)
}
@@ -80,8 +105,22 @@ extension SceneModel: ArticleModelDelegate {
}
// MARK: UndoableCommandRunner
extension SceneModel: UndoableCommandRunner {
func markArticlesWithUndo(_ articles: [Article], statusKey: ArticleStatus.Key, flag: Bool) {
guard let undoManager = undoManager, let markReadCommand = MarkStatusCommand(initialArticles: articles, statusKey: statusKey, flag: flag, undoManager: undoManager) else {
return
}
runCommand(markReadCommand)
}
}
// MARK: Private
private extension SceneModel {
}

View File

@@ -10,6 +10,7 @@ import SwiftUI
struct SceneNavigationView: View {
@Environment(\.undoManager) var undoManager
@StateObject private var sceneModel = SceneModel()
@State private var showSheet: Bool = false
@State private var sheetToShow: ToolbarSheets = .none
@@ -48,6 +49,7 @@ struct SceneNavigationView: View {
}
.environmentObject(sceneModel)
.onAppear {
sceneModel.undoManager = undoManager
sceneModel.startup()
}
.sheet(isPresented: $showSheet, onDismiss: { sheetToShow = .none }) {

View File

@@ -12,7 +12,7 @@ import Account
import Articles
import SafariServices
class ArticleViewController: UIViewController {
class ArticleViewController: UIViewController, ArticleManager {
weak var articleModel: ArticleModel?
@@ -22,7 +22,7 @@ class ArticleViewController: UIViewController {
return pageViewController?.viewControllers?.first as? WebViewController
}
var article: Article? {
var currentArticle: Article? {
didSet {
if let controller = currentWebViewController, controller.article != article {
controller.setArticle(article)

View File

@@ -26,7 +26,7 @@ struct ArticleView: NSViewControllerRepresentable {
func makeNSViewController(context: Context) -> WebViewController {
let controller = WebViewController()
controller.articleModel = articleModel
controller.article = article
controller.currentArticle = article
return controller
}

View File

@@ -22,7 +22,7 @@ protocol WebViewControllerDelegate: class {
func webViewController(_: WebViewController, articleExtractorButtonStateDidUpdate: ArticleExtractorButtonState)
}
class WebViewController: NSViewController {
class WebViewController: NSViewController, ArticleManager {
private struct MessageName {
static let imageWasClicked = "imageWasClicked"
@@ -49,7 +49,7 @@ class WebViewController: NSViewController {
var articleModel: ArticleModel?
weak var delegate: WebViewControllerDelegate?
var article: Article?
var currentArticle: Article?
override func loadView() {
view = NSView()
@@ -117,7 +117,7 @@ class WebViewController: NSViewController {
func toggleArticleExtractor() {
guard let article = article else {
guard let article = currentArticle else {
return
}
@@ -247,15 +247,15 @@ private extension WebViewController {
if let articleExtractor = articleExtractor, articleExtractor.state == .processing {
rendering = ArticleRenderer.loadingHTML(style: style)
} else if let articleExtractor = articleExtractor, articleExtractor.state == .failedToParse, let article = article {
} else if let articleExtractor = articleExtractor, articleExtractor.state == .failedToParse, let article = currentArticle {
rendering = ArticleRenderer.articleHTML(article: article, style: style)
} else if let article = article, let extractedArticle = extractedArticle {
} else if let article = currentArticle, let extractedArticle = extractedArticle {
if isShowingExtractedArticle {
rendering = ArticleRenderer.articleHTML(article: article, extractedArticle: extractedArticle, style: style)
} else {
rendering = ArticleRenderer.articleHTML(article: article, style: style)
}
} else if let article = article {
} else if let article = currentArticle {
rendering = ArticleRenderer.articleHTML(article: article, style: style)
} else {
rendering = ArticleRenderer.noSelectionHTML(style: style)
@@ -297,7 +297,7 @@ private extension WebViewController {
}
func startArticleExtractor() {
if let link = article?.preferredLink, let extractor = ArticleExtractor(link) {
if let link = currentArticle?.preferredLink, let extractor = ArticleExtractor(link) {
extractor.delegate = self
extractor.process()
articleExtractor = extractor
@@ -313,7 +313,7 @@ private extension WebViewController {
}
func reloadArticleImage() {
guard let article = article else { return }
guard let article = currentArticle else { return }
var components = URLComponents()
components.scheme = ArticleRenderer.imageIconScheme