mirror of
https://github.com/zhigang1992/GitHawk.git
synced 2026-06-05 15:09:12 +08:00
124 lines
3.7 KiB
Swift
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
|
|
}
|
|
|
|
}
|