From 6172e71e782c8c54a6d709f4e37e17182f3ef50f Mon Sep 17 00:00:00 2001 From: Brian Litwin Date: Wed, 17 Oct 2018 20:41:56 -0400 Subject: [PATCH 1/4] Added GithubClient ref to LabelDetails - To init and present a RepositoryIssuesViewController, need a GithubClient to pass in. --- Classes/Issues/GithubClient+Issues.swift | 3 +++ Classes/Issues/Issue+IssueType.swift | 3 +++ Classes/Issues/IssueType.swift | 1 + Classes/Issues/IssuesViewController.swift | 2 +- Classes/Issues/Labeled/IssueLabeledModel.swift | 3 ++- Classes/Issues/Labels/IssueLabelsSectionController.swift | 7 +++++-- Classes/Issues/PullRequest+IssueType.swift | 3 +++ Classes/Models/LabelDetails.swift | 4 +++- 8 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Classes/Issues/GithubClient+Issues.swift b/Classes/Issues/GithubClient+Issues.swift index 48d0c260a..1c81436cd 100644 --- a/Classes/Issues/GithubClient+Issues.swift +++ b/Classes/Issues/GithubClient+Issues.swift @@ -86,6 +86,7 @@ extension GithubClient { ) let timeline = issueType.timelineViewModels( + client: self, owner: owner, repo: repo, contentSizeCategory: contentSizeCategory, @@ -354,6 +355,7 @@ extension GithubClient { for newLabel in labels { if !oldLabelNames.contains(newLabel.name) { newEvents.append(IssueLabeledModel( + client: self, id: UUID().uuidString, actor: actor, title: newLabel.name, @@ -370,6 +372,7 @@ extension GithubClient { for oldLabel in previous.labels.labels { if !newLabelNames.contains(oldLabel.name) { newEvents.append(IssueLabeledModel( + client: self, id: UUID().uuidString, actor: actor, title: oldLabel.name, diff --git a/Classes/Issues/Issue+IssueType.swift b/Classes/Issues/Issue+IssueType.swift index f8c2b6c39..c904a3608 100644 --- a/Classes/Issues/Issue+IssueType.swift +++ b/Classes/Issues/Issue+IssueType.swift @@ -64,6 +64,7 @@ extension IssueOrPullRequestQuery.Data.Repository.IssueOrPullRequest.AsIssue: Is } func timelineViewModels( + client: GithubClient, owner: String, repo: String, contentSizeCategory: UIContentSizeCategory, @@ -100,6 +101,7 @@ extension IssueOrPullRequestQuery.Data.Repository.IssueOrPullRequest.AsIssue: Is } else if let unlabeled = node.asUnlabeledEvent, let date = unlabeled.createdAt.githubDate { let model = IssueLabeledModel( + client: client, id: unlabeled.fragments.nodeFields.id, actor: unlabeled.actor?.login ?? Constants.Strings.unknown, title: unlabeled.label.name, @@ -115,6 +117,7 @@ extension IssueOrPullRequestQuery.Data.Repository.IssueOrPullRequest.AsIssue: Is } else if let labeled = node.asLabeledEvent, let date = labeled.createdAt.githubDate { let model = IssueLabeledModel( + client: client, id: labeled.fragments.nodeFields.id, actor: labeled.actor?.login ?? Constants.Strings.unknown, title: labeled.label.name, diff --git a/Classes/Issues/IssueType.swift b/Classes/Issues/IssueType.swift index d3c4e8b6b..5bb31fe7d 100644 --- a/Classes/Issues/IssueType.swift +++ b/Classes/Issues/IssueType.swift @@ -39,6 +39,7 @@ protocol IssueType { func mergeModel(availableTypes: [IssueMergeType]) -> IssueMergeModel? func timelineViewModels( + client: GithubClient, owner: String, repo: String, contentSizeCategory: UIContentSizeCategory, diff --git a/Classes/Issues/IssuesViewController.swift b/Classes/Issues/IssuesViewController.swift index 2a60c1c83..4914f38a3 100644 --- a/Classes/Issues/IssuesViewController.swift +++ b/Classes/Issues/IssuesViewController.swift @@ -451,7 +451,7 @@ final class IssuesViewController: MessageViewController, switch object { // header and metadata case is IssueTitleModel: return IssueTitleSectionController() - case is IssueLabelsModel: return IssueLabelsSectionController(issue: model) + case is IssueLabelsModel: return IssueLabelsSectionController(client: client, issue: model) case is IssueAssigneesModel: return IssueAssigneesSectionController() case is Milestone: return IssueMilestoneSectionController(issueModel: model) case is IssueFileChangesModel: return IssueViewFilesSectionController(issueModel: model, client: client) diff --git a/Classes/Issues/Labeled/IssueLabeledModel.swift b/Classes/Issues/Labeled/IssueLabeledModel.swift index 04b98595e..f9c3b6a82 100644 --- a/Classes/Issues/Labeled/IssueLabeledModel.swift +++ b/Classes/Issues/Labeled/IssueLabeledModel.swift @@ -27,6 +27,7 @@ final class IssueLabeledModel: ListDiffable { let string: StyledTextRenderer init( + client: GithubClient, id: String, actor: String, title: String, @@ -68,7 +69,7 @@ final class IssueLabeledModel: ListDiffable { .backgroundColor: labelColor, .foregroundColor: labelColor.textOverlayColor ?? .black, .baselineOffset: 1, // offset for better rounded background colors - MarkdownAttribute.label: LabelDetails(owner: repoOwner, repo: repoName, label: title) + MarkdownAttribute.label: LabelDetails(client: client, owner: repoOwner, repo: repoName, label: title) ] ))) .restore() diff --git a/Classes/Issues/Labels/IssueLabelsSectionController.swift b/Classes/Issues/Labels/IssueLabelsSectionController.swift index b94ab1b8b..646f13e51 100644 --- a/Classes/Issues/Labels/IssueLabelsSectionController.swift +++ b/Classes/Issues/Labels/IssueLabelsSectionController.swift @@ -7,17 +7,20 @@ // import UIKit +import GitHubAPI import IGListKit final class IssueLabelsSectionController: ListBindingSectionController, ListBindingSectionControllerDataSource, ListBindingSectionControllerSelectionDelegate { - + + private let client: GithubClient private let issue: IssueDetailsModel private var sizeCache = [String: CGSize]() private let lockedModel = Constants.Strings.locked - init(issue: IssueDetailsModel) { + init(client: GitHubClient, issue: IssueDetailsModel) { + self.client = client self.issue = issue super.init() minimumInteritemSpacing = Styles.Sizes.labelSpacing diff --git a/Classes/Issues/PullRequest+IssueType.swift b/Classes/Issues/PullRequest+IssueType.swift index b320bb597..7833394f1 100644 --- a/Classes/Issues/PullRequest+IssueType.swift +++ b/Classes/Issues/PullRequest+IssueType.swift @@ -95,6 +95,7 @@ extension IssueOrPullRequestQuery.Data.Repository.IssueOrPullRequest.AsPullReque } func timelineViewModels( + client: GithubClient, owner: String, repo: String, contentSizeCategory: UIContentSizeCategory, @@ -131,6 +132,7 @@ extension IssueOrPullRequestQuery.Data.Repository.IssueOrPullRequest.AsPullReque } else if let unlabeled = node.asUnlabeledEvent, let date = unlabeled.createdAt.githubDate { let model = IssueLabeledModel( + client: client, id: unlabeled.fragments.nodeFields.id, actor: unlabeled.actor?.login ?? Constants.Strings.unknown, title: unlabeled.label.name, @@ -146,6 +148,7 @@ extension IssueOrPullRequestQuery.Data.Repository.IssueOrPullRequest.AsPullReque } else if let labeled = node.asLabeledEvent, let date = labeled.createdAt.githubDate { let model = IssueLabeledModel( + client: client, id: labeled.fragments.nodeFields.id, actor: labeled.actor?.login ?? Constants.Strings.unknown, title: labeled.label.name, diff --git a/Classes/Models/LabelDetails.swift b/Classes/Models/LabelDetails.swift index a3159ee2d..c9fa186af 100644 --- a/Classes/Models/LabelDetails.swift +++ b/Classes/Models/LabelDetails.swift @@ -10,11 +10,13 @@ import Foundation final class LabelDetails { + let client: GithubClient let owner: String let repo: String let label: String - init(owner: String, repo: String, label: String) { + init(client: GithubClient, owner: String, repo: String, label: String) { + self.client = client self.owner = owner self.repo = repo self.label = label From fdc5344142b8541709e320360e0f3f9e73696ff2 Mon Sep 17 00:00:00 2001 From: Brian Litwin Date: Wed, 17 Oct 2018 21:20:54 -0400 Subject: [PATCH 2/4] Updated RepoIssues VC and SectionController initializers - Instead of initializing using RepositoryDetails, only use owner and repo. Makes it easier to present a new RepoIssuesVC without needing a reference to RepositoryDetails. The only info from RepoDetails that we were using anyway was was owner and name. --- .../Repository/RepositoryIssuesViewController.swift | 12 +++++++----- .../RepositorySummarySectionController.swift | 8 +++++--- Classes/Repository/RepositoryViewController.swift | 4 ++-- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Classes/Repository/RepositoryIssuesViewController.swift b/Classes/Repository/RepositoryIssuesViewController.swift index bac4aa825..628dedc8d 100644 --- a/Classes/Repository/RepositoryIssuesViewController.swift +++ b/Classes/Repository/RepositoryIssuesViewController.swift @@ -19,16 +19,18 @@ BaseListViewControllerDataSource, SearchBarSectionControllerDelegate { private var models = [ListDiffable]() - private let repo: RepositoryDetails + private let owner: String + private let repo: String private let client: RepositoryClient private let type: RepositoryIssuesType private let searchKey: ListDiffable = "searchKey" as ListDiffable private let debouncer = Debouncer() private var previousSearchString = "is:open " - init(client: GithubClient, repo: RepositoryDetails, type: RepositoryIssuesType) { + init(client: GithubClient, owner: String, repo: String, type: RepositoryIssuesType) { + self.owner = owner self.repo = repo - self.client = RepositoryClient(githubClient: client, owner: repo.owner, name: repo.name) + self.client = RepositoryClient(githubClient: client, owner: owner, name: repo) self.type = type super.init( @@ -105,7 +107,7 @@ SearchBarSectionControllerDelegate { query: previousSearchString ) } - return RepositorySummarySectionController(client: client.githubClient, repo: repo) + return RepositorySummarySectionController(client: client.githubClient, owner: owner, repo: repo) } func emptySectionController(listAdapter: ListAdapter) -> ListSectionController { @@ -129,7 +131,7 @@ SearchBarSectionControllerDelegate { case .issues: typeQuery = "is:issue" case .pullRequests: typeQuery = "is:pr" } - return "repo:\(repo.owner)/\(repo.name) \(typeQuery) \(previousSearchString)" + return "repo:\(owner)/\(repo) \(typeQuery) \(previousSearchString)" } } diff --git a/Classes/Repository/RepositorySummarySectionController.swift b/Classes/Repository/RepositorySummarySectionController.swift index 831674d17..bf9dd3047 100644 --- a/Classes/Repository/RepositorySummarySectionController.swift +++ b/Classes/Repository/RepositorySummarySectionController.swift @@ -11,9 +11,11 @@ import IGListKit final class RepositorySummarySectionController: ListGenericSectionController { private let client: GithubClient - private let repo: RepositoryDetails + private let owner: String + private let repo: String - init(client: GithubClient, repo: RepositoryDetails) { + init(client: GithubClient, owner: String, repo: String) { + self.owner = owner self.client = client self.repo = repo super.init() @@ -53,7 +55,7 @@ final class RepositorySummarySectionController: ListGenericSectionController Date: Wed, 17 Oct 2018 21:33:07 -0400 Subject: [PATCH 3/4] Updated PresentLabels VC function --- .../Labels/IssueLabelsSectionController.swift | 11 ++++++-- .../Utility/UIViewController+Routing.swift | 2 +- .../UIViewController+PresentLabels.swift | 26 +++++++++++++++++++ .../UIViewController+Safari.swift | 5 ---- 4 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 Classes/View Controllers/UIViewController+PresentLabels.swift diff --git a/Classes/Issues/Labels/IssueLabelsSectionController.swift b/Classes/Issues/Labels/IssueLabelsSectionController.swift index 646f13e51..f21da8d0d 100644 --- a/Classes/Issues/Labels/IssueLabelsSectionController.swift +++ b/Classes/Issues/Labels/IssueLabelsSectionController.swift @@ -19,7 +19,7 @@ ListBindingSectionControllerSelectionDelegate { private var sizeCache = [String: CGSize]() private let lockedModel = Constants.Strings.locked - init(client: GitHubClient, issue: IssueDetailsModel) { + init(client: GithubClient, issue: IssueDetailsModel) { self.client = client self.issue = issue super.init() @@ -100,7 +100,14 @@ ListBindingSectionControllerSelectionDelegate { func sectionController(_ sectionController: ListBindingSectionController, didSelectItemAt index: Int, viewModel: Any) { guard let viewModel = viewModel as? RepositoryLabel else { return } - viewController?.presentLabels(owner: issue.owner, repo: issue.repo, label: viewModel.name) + viewController?.presentLabels( + label: LabelDetails( + client: client, + owner: issue.owner, + repo: issue.repo, + label: viewModel.name + ) + ) } } diff --git a/Classes/Utility/UIViewController+Routing.swift b/Classes/Utility/UIViewController+Routing.swift index cc69b0a6c..f7ce6be67 100644 --- a/Classes/Utility/UIViewController+Routing.swift +++ b/Classes/Utility/UIViewController+Routing.swift @@ -19,7 +19,7 @@ extension UIViewController { UIApplication.shared.open(url, options: [:], completionHandler: nil) } case .username(let username): presentProfile(login: username) - case .label(let label): presentLabels(owner: label.owner, repo: label.repo, label: label.label) + case .label(let label): presentLabels(label: label) case .commit(let commit): presentCommit(owner: commit.owner, repo: commit.repo, hash: commit.hash) default: return false } diff --git a/Classes/View Controllers/UIViewController+PresentLabels.swift b/Classes/View Controllers/UIViewController+PresentLabels.swift new file mode 100644 index 000000000..44f8f7736 --- /dev/null +++ b/Classes/View Controllers/UIViewController+PresentLabels.swift @@ -0,0 +1,26 @@ +// +// UIViewController+PresentLabels.swift +// Freetime +// +// Created by B_Litwin on 10/17/18. +// Copyright © 2018 Ryan Nystrom. All rights reserved. +// + +import UIKit + +extension UIViewController { + func presentLabels(label: LabelDetails) { + let repositoryIssuesViewController = + RepositoryIssuesViewController( + client: label.client, + owner: label.owner, + repo: label.repo, + type: .issues + ) + + navigationController?.pushViewController( + repositoryIssuesViewController, + animated: true + ) + } +} diff --git a/Classes/View Controllers/UIViewController+Safari.swift b/Classes/View Controllers/UIViewController+Safari.swift index 0bff58c7b..5142f991e 100644 --- a/Classes/View Controllers/UIViewController+Safari.swift +++ b/Classes/View Controllers/UIViewController+Safari.swift @@ -30,11 +30,6 @@ extension UIViewController { presentSafari(url: url) } - func presentLabels(owner: String, repo: String, label: String) { - guard let url = URL(string: "https://github.com/\(owner)/\(repo)/labels/\(label)") else { return } - presentSafari(url: url) - } - func presentMilestone(owner: String, repo: String, milestone: Int) { guard let url = URL(string: "https://github.com/\(owner)/\(repo)/milestone/\(milestone)") else { return } presentSafari(url: url) From 84a6cb4d312c2dcf0a9f350ca4d9e79036558f15 Mon Sep 17 00:00:00 2001 From: Brian Litwin Date: Wed, 17 Oct 2018 21:43:11 -0400 Subject: [PATCH 4/4] Add label to RepoIssuesVC initializer and fetch query --- .../RepositoryIssuesViewController.swift | 15 +++++++++++---- .../UIViewController+PresentLabels.swift | 5 +++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Classes/Repository/RepositoryIssuesViewController.swift b/Classes/Repository/RepositoryIssuesViewController.swift index 628dedc8d..c302269fe 100644 --- a/Classes/Repository/RepositoryIssuesViewController.swift +++ b/Classes/Repository/RepositoryIssuesViewController.swift @@ -26,12 +26,17 @@ SearchBarSectionControllerDelegate { private let searchKey: ListDiffable = "searchKey" as ListDiffable private let debouncer = Debouncer() private var previousSearchString = "is:open " + private let label: String? - init(client: GithubClient, owner: String, repo: String, type: RepositoryIssuesType) { + init(client: GithubClient, owner: String, repo: String, type: RepositoryIssuesType, label: String? = nil) { self.owner = owner self.repo = repo self.client = RepositoryClient(githubClient: client, owner: owner, name: repo) self.type = type + self.label = label + if let label = label { + previousSearchString += "label:\(label) " + } super.init( emptyErrorMessage: NSLocalizedString("Cannot load issues.", comment: "") @@ -53,10 +58,12 @@ SearchBarSectionControllerDelegate { super.viewDidLoad() makeBackBarItemEmpty() - + + if label == nil { // set the frame in -viewDidLoad is required when working with TabMan - feed.collectionView.frame = view.bounds - feed.collectionView.contentInsetAdjustmentBehavior = .never + feed.collectionView.frame = view.bounds + feed.collectionView.contentInsetAdjustmentBehavior = .never + } } // MARK: Overrides diff --git a/Classes/View Controllers/UIViewController+PresentLabels.swift b/Classes/View Controllers/UIViewController+PresentLabels.swift index 44f8f7736..79d27f0b4 100644 --- a/Classes/View Controllers/UIViewController+PresentLabels.swift +++ b/Classes/View Controllers/UIViewController+PresentLabels.swift @@ -15,8 +15,9 @@ extension UIViewController { client: label.client, owner: label.owner, repo: label.repo, - type: .issues - ) + type: .issues, + label: label.label + ) navigationController?.pushViewController( repositoryIssuesViewController,