Skip to content
This repository was archived by the owner on Sep 20, 2023. It is now read-only.

change repo branch #2202

Merged
merged 3 commits into from
Sep 30, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//
// GitHubClient+RepoBranches.swift
// Freetime
//
// Created by B_Litwin on 9/25/18.
// Copyright © 2018 Ryan Nystrom. All rights reserved.
//

import GitHubAPI

extension GithubClient {

func fetchRepositoryBranches(owner: String,
repo: String,
completion: @escaping (Result<([String])>)->Void
) {
let query = FetchRepositoryBranchesQuery(owner: owner, name: repo)
client.query(query, result: { $0.repository }) { result in

switch result {
case .failure(let error):
completion(.error(error))

case .success(let repository):
var branches: [String] = []
repository.refs.map { edges in
edges.edges.map { edge in
branches += edge.compactMap {
$0?.node?.name
}
}
}

completion(.success(branches))
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//
// RepositoryBranchUpdatable.swift
// Freetime
//
// Created by B_Litwin on 9/28/18.
// Copyright © 2018 Ryan Nystrom. All rights reserved.
//

import UIKit

protocol RepositoryBranchUpdatable: class {
func updateBranch(to newBranch: String)
}
58 changes: 58 additions & 0 deletions Classes/Repository/RepositoryBranches/RepositoryBranchesCell.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
//
// RepoBranchesCell.swift
// Freetime
//
// Created by B_Litwin on 9/25/18.
// Copyright © 2018 Ryan Nystrom. All rights reserved.
//

import UIKit

final class RepositoryBranchCell: SelectableCell {
public let label = UILabel()
private let checkedImageView = UIImageView(image: UIImage(named: "check-small")?.withRenderingMode(.alwaysTemplate))

override init(frame: CGRect) {
super.init(frame: frame)

backgroundColor = nil
contentView.backgroundColor = nil

contentView.addSubview(checkedImageView)
checkedImageView.tintColor = Styles.Colors.Blue.medium.color
checkedImageView.snp.makeConstraints { make in
make.right.equalTo(-Styles.Sizes.gutter)
make.centerY.equalTo(contentView.snp.centerY)
}

contentView.addSubview(label)
label.font = Styles.Text.bodyBold.preferredFont
label.textColor = .white
label.snp.makeConstraints { make in
make.left.equalTo(Styles.Sizes.gutter)
make.right.lessThanOrEqualTo(checkedImageView.snp.left)
make.centerY.equalTo(contentView.snp.centerY)
}

let border = contentView.addBorder(.bottom,
left: Styles.Sizes.gutter,
right: -Styles.Sizes.gutter
)
border.backgroundColor = Styles.Colors.Gray.medium.color
}

func setSelected(_ selected: Bool) {
checkedImageView.isHidden = !selected
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

// MARK: Accessibility

override var accessibilityLabel: String? {
get { return AccessibilityHelper.generatedLabel(forCell: self) }
set { }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//
// RepoBranchesSectionController.swift
// Freetime
//
// Created by B_Litwin on 9/25/18.
// Copyright © 2018 Ryan Nystrom. All rights reserved.
//

import UIKit
import IGListKit

protocol RepositoryBranchSectionControllerDelegate: class {
func didSelect(value: RepositoryBranchViewModel)
}

final class RepositoryBranchSectionController: ListSwiftSectionController<RepositoryBranchViewModel> {

public weak var delegate: RepositoryBranchSectionControllerDelegate?

override func createBinders(from value: RepositoryBranchViewModel) -> [ListBinder] {
return [
binder(
value,
cellType: ListCellType.class(RepositoryBranchCell.self),
size: {
return CGSize(
width: $0.collection.containerSize.width,
height: Styles.Sizes.tableCellHeightLarge
)
},
configure: {
$0.label.text = $1.value.branch
$0.setSelected($1.value.selected)
},
didSelect: { [weak self] context in
guard let strongSelf = self else { return }
context.deselect(animated: true)
strongSelf.delegate?.didSelect(value: context.value)
})
]
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
//
// RepoBranchesViewController.swift
// Freetime
//
// Created by B_Litwin on 9/25/18.
// Copyright © 2018 Ryan Nystrom. All rights reserved.
//

import UIKit
import Squawk
import IGListKit

final class RepositoryBranchesViewController: BaseListViewController2<String>,
BaseListViewController2DataSource,
RepositoryBranchSectionControllerDelegate
{

private let owner: String
private let repo: String
private let client: GithubClient
private var branches: [String] = []
public var branch: String

init(branch: String,
owner: String,
repo: String,
client: GithubClient
)
{
self.branch = branch
self.owner = owner
self.repo = repo
self.client = client
super.init(emptyErrorMessage: "Couldn't load repository branches")

title = NSLocalizedString("Branches", comment: "")
preferredContentSize = Styles.Sizes.contextMenuSize
feed.collectionView.backgroundColor = Styles.Colors.menuBackgroundColor.color
dataSource = self
}

override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
addMenuDoneButton()
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func fetch(page: String?) {
client.fetchRepositoryBranches(owner: owner,
repo: repo
)
{ [weak self] result in
switch result {
case .success(let branches):
self?.branches = branches
case .error:
Squawk.showError(message: "Couldn't fetch repository branches")
}
self?.update(animated: true)
}
}

func models(adapter: ListSwiftAdapter) -> [ListSwiftPair] {
guard feed.status == .idle else { return [] }
return branches.map {
let value = RepositoryBranchViewModel(branch: $0,
selected: $0 == self.branch)

return ListSwiftPair(value) { [weak self] in
let controller = RepositoryBranchSectionController()
controller.delegate = self
return controller
}
}
}

func didSelect(value: RepositoryBranchViewModel) {
self.branch = value.branch
fetch(page: nil)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//
// RepoBranchesViewModel.swift
// Freetime
//
// Created by B_Litwin on 9/25/18.
// Copyright © 2018 Ryan Nystrom. All rights reserved.
//

import IGListKit

struct RepositoryBranchViewModel: ListSwiftDiffable {
let branch: String
let selected: Bool

var identifier: String {
return branch
}

func isEqual(to value: ListSwiftDiffable) -> Bool {
guard let value = value as? RepositoryBranchViewModel else { return false }
return value.branch == branch
&& value.selected == selected
}
}

14 changes: 12 additions & 2 deletions Classes/Repository/RepositoryCodeDirectoryViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@ import IGListKit

final class RepositoryCodeDirectoryViewController: BaseListViewController<NSNumber>,
BaseListViewControllerDataSource,
ListSingleSectionControllerDelegate {
ListSingleSectionControllerDelegate,
RepositoryBranchUpdatable
{

private let client: GithubClient
private let branch: String
private var branch: String
private let path: FilePath
private let repo: RepositoryDetails
private var files = [RepositoryFile]()
Expand Down Expand Up @@ -177,5 +179,13 @@ extension RepositoryCodeDirectoryViewController {

navigationController?.pushViewController(controller, animated: trueUnlessReduceMotionEnabled)
}

//Mark: RepositoryBranchUpdatable

func updateBranch(to newBranch: String) {
guard self.branch != newBranch else { return }
self.branch = newBranch
fetch(page: nil)
}

}
25 changes: 15 additions & 10 deletions Classes/Repository/RepositoryOverviewViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,14 @@ class HackScrollIndicatorInsetsCollectionView: UICollectionView {
}

class RepositoryOverviewViewController: BaseListViewController<NSString>,
BaseListViewControllerDataSource {
BaseListViewControllerDataSource,
RepositoryBranchUpdatable
{

private let repo: RepositoryDetails
private let client: RepositoryClient
private var readme: RepositoryReadmeModel?
private var branch: String

// lazy var _feed: Feed = { Feed(
// viewController: self,
Expand All @@ -41,6 +44,7 @@ BaseListViewControllerDataSource {
init(client: GithubClient, repo: RepositoryDetails) {
self.repo = repo
self.client = RepositoryClient(githubClient: client, owner: repo.owner, name: repo.name)
self.branch = repo.defaultBranch
super.init(
emptyErrorMessage: NSLocalizedString("Cannot load README.", comment: "")
)
Expand Down Expand Up @@ -71,20 +75,13 @@ BaseListViewControllerDataSource {
// let contentInset = feed.collectionView.contentInset
let width = view.bounds.width - Styles.Sizes.gutter * 2
let contentSizeCategory = UIContentSizeCategory.preferred
let branch = self.branch

client.githubClient.client
.send(V3RepositoryReadmeRequest(owner: repo.owner, repo: repo.name)) { [weak self] result in
.send(V3RepositoryReadmeRequest(owner: repo.owner, repo: repo.name, branch: branch)) { [weak self] result in
switch result {
case .success(let response):
DispatchQueue.global().async {
let branch: String
if let items = URLComponents(url: response.data.url, resolvingAgainstBaseURL: false)?.queryItems,
let index = items.index(where: { $0.name == "ref" }),
let value = items[index].value {
branch = value
} else {
branch = "master"
}

let models = MarkdownModels(
response.data.content,
Expand Down Expand Up @@ -130,5 +127,13 @@ BaseListViewControllerDataSource {
type: .readme
)
}

//Mark: RepositoryBranchUpdatable

func updateBranch(to newBranch: String) {
guard self.branch != newBranch else { return }
self.branch = newBranch
fetch(page: nil)
}

}
Loading