Files
GitHawk/Classes/Repository/RepositoryDataSource.swift
2017-09-17 17:41:29 -04:00

124 lines
3.7 KiB
Swift

//
// RepositoryDataSource.swift
// Freetime
//
// Created by Ryan Nystrom on 9/10/17.
// Copyright © 2017 Ryan Nystrom. All rights reserved.
//
import UIKit
import IGListKit
final class RepositoryDataSource {
static let overviewTitle = NSLocalizedString("Overview", comment: "")
static let issuesTitle = NSLocalizedString("Issues", comment: "")
static let pullRequestsTitle = NSLocalizedString("Pull Requests", comment: "")
// mutated by SegmentedControlSectionController
let selection: SegmentedControlModel
let loadMore = "loadMore" as ListDiffable
private var readmeModel: RepositoryReadmeModel? = nil
private var issues = [RepositoryIssueSummaryModel]()
private var pullRequests = [RepositoryIssueSummaryModel]()
// public for paging
private(set) var issuesNextPage: String?
private(set) var pullRequestsNextPage: String?
init(hasIssuesEnabled: Bool) {
var items = [RepositoryDataSource.overviewTitle]
if hasIssuesEnabled {
items.append(RepositoryDataSource.issuesTitle)
}
items.append(RepositoryDataSource.pullRequestsTitle)
selection = SegmentedControlModel(items: items)
}
// MARK: Public
enum State {
case readme
case issues
case pullRequests
}
var state: State {
switch selection.items[selection.selectedIndex] {
case RepositoryDataSource.overviewTitle: return .readme
case RepositoryDataSource.issuesTitle: return .issues
case RepositoryDataSource.pullRequestsTitle: return .pullRequests
default: fatalError("Repository selection in unknown state")
}
}
var selectionModels: [ListDiffable] {
switch state {
case .readme:
if let model = readmeModel {
return [model]
}
return []
case .issues:
var models: [ListDiffable] = issues
if issuesNextPage != nil {
models.append(loadMore)
}
return models
case .pullRequests:
var models: [ListDiffable] = pullRequests
if pullRequestsNextPage != nil {
models.append(loadMore)
}
return models
}
}
func reset(
issues: [RepositoryIssueSummaryModel],
issuesNextPage: String?,
pullRequests: [RepositoryIssueSummaryModel],
pullRequestsNextPage: String?
) {
self.issues = issues
self.issuesNextPage = issuesNextPage
self.pullRequests = pullRequests
self.pullRequestsNextPage = pullRequestsNextPage
}
func setReadme(
_ readme: String,
width: CGFloat,
owner: String,
repo: String,
completion: @escaping () -> ()
) {
DispatchQueue.global().async {
let options = GitHubMarkdownOptions(owner: owner, repo: repo, flavors: [.baseURL])
let models = CreateCommentModels(markdown: readme, width: width, options: options)
let model = RepositoryReadmeModel(models: models)
DispatchQueue.main.async {
self.readmeModel = model
completion()
}
}
}
func setPullRequests(_ pullRequests: [RepositoryIssueSummaryModel], page: String?) {
self.pullRequests = pullRequests
self.pullRequestsNextPage = page
}
func appendIssues(issues: [RepositoryIssueSummaryModel], page: String?) {
self.issues += issues
self.issuesNextPage = page
}
func appendPullRequests(pullRequests: [RepositoryIssueSummaryModel], page: String?) {
self.pullRequests += pullRequests
self.pullRequestsNextPage = page
}
}