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

Show PR CI status inline with title #2325

Merged
merged 3 commits into from
Oct 21, 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
58 changes: 11 additions & 47 deletions Classes/Repository/GQL+RepositoryIssueSummaryType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,53 +8,6 @@

import Foundation

extension RepoIssuePagesQuery.Data.Repository.Issue.Node: RepositoryIssueSummaryType {

var labelableFields: LabelableFields {
return fragments.labelableFields
}

var repoEventFields: RepoEventFields {
return fragments.repoEventFields
}

var pullRequest: Bool {
return false
}

var status: IssueStatus {
switch state {
case .closed: return .closed
case .open, .__unknown: return .open
}
}

}

extension RepoPullRequestPagesQuery.Data.Repository.PullRequest.Node: RepositoryIssueSummaryType {

var labelableFields: LabelableFields {
return fragments.labelableFields
}

var repoEventFields: RepoEventFields {
return fragments.repoEventFields
}

var pullRequest: Bool {
return true
}

var status: IssueStatus {
switch state {
case .closed: return .closed
case .merged: return .merged
case .open, .__unknown: return .open
}
}

}

extension RepoSearchPagesQuery.Data.Search.Node.AsIssue: RepositoryIssueSummaryType {

var labelableFields: LabelableFields {
Expand All @@ -76,6 +29,10 @@ extension RepoSearchPagesQuery.Data.Search.Node.AsIssue: RepositoryIssueSummaryT
}
}

var ciStatus: RepositoryIssueCIStatus? {
return nil
}

}

extension RepoSearchPagesQuery.Data.Search.Node.AsPullRequest: RepositoryIssueSummaryType {
Expand All @@ -100,4 +57,11 @@ extension RepoSearchPagesQuery.Data.Search.Node.AsPullRequest: RepositoryIssueSu
}
}

var ciStatus: RepositoryIssueCIStatus? {
guard let node = commits.nodes?.first,
let status = node?.commit.status
else { return nil }
return RepositoryIssueCIStatus(rawValue: status.state.rawValue)
}

}
99 changes: 35 additions & 64 deletions Classes/Repository/RepositoryClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,36 +17,6 @@ protocol RepositoryQuery {
func nextPageToken(from data: GraphQLSelectionSet) -> String?
}

extension RepoIssuePagesQuery: RepositoryQuery {

func summaryTypes(from data: GraphQLSelectionSet) -> [RepositoryIssueSummaryType] {
guard let issues = data as? Data else { return [] }
return issues.repository?.issues.nodes?.compactMap { $0 } ?? []
}

func nextPageToken(from data: GraphQLSelectionSet) -> String? {
guard let issues = data as? Data else { return nil }
guard let pageInfo = issues.repository?.issues.pageInfo, pageInfo.hasNextPage else { return nil }
return pageInfo.endCursor
}

}

extension RepoPullRequestPagesQuery: RepositoryQuery {

func summaryTypes(from data: GraphQLSelectionSet) -> [RepositoryIssueSummaryType] {
guard let prs = data as? RepoPullRequestPagesQuery.Data else { return [] }
return prs.repository?.pullRequests.nodes?.compactMap { $0 } ?? []
}

func nextPageToken(from data: GraphQLSelectionSet) -> String? {
guard let prs = data as? RepoPullRequestPagesQuery.Data else { return nil }
guard let pageInfo = prs.repository?.pullRequests.pageInfo, pageInfo.hasNextPage else { return nil }
return pageInfo.endCursor
}

}

extension RepoSearchPagesQuery: RepositoryQuery {

func summaryTypes(from data: GraphQLSelectionSet) -> [RepositoryIssueSummaryType] {
Expand All @@ -69,12 +39,34 @@ func createSummaryModel(
) -> RepositoryIssueSummaryModel? {
guard let date = node.repoEventFields.createdAt.githubDate else { return nil }

let title = StyledTextBuilder(styledText: StyledText(
let builder = StyledTextBuilder(styledText: StyledText(
text: node.title,
style: Styles.Text.body.with(foreground: Styles.Colors.Gray.dark.color)
)).build()
// style: Styles.Text.body.with(foreground: Styles.Colors.Gray.medium.color)
style: Styles.Text.body
))
if let ciStatus = node.ciStatus {
let iconName: String
let color: UIColor
switch ciStatus {
case .pending:
iconName = "primitive-dot"
color = Styles.Colors.Yellow.medium.color
case .failure:
iconName = "x-small"
color = Styles.Colors.Red.medium.color
case .success:
iconName = "check-small"
color = Styles.Colors.Green.medium.color
}
if let icon = UIImage(named: iconName)?.withRenderingMode(.alwaysTemplate) {
builder.save()
.add(text: "\u{00A0}")
.add(image: icon, attributes: [.foregroundColor: color])
.restore()
}
}
let string = StyledTextRenderer(
string: title,
string: builder.build(),
contentSizeCategory: contentSizeCategory,
inset: RepositorySummaryCell.titleInset
).warm(width: containerWidth)
Expand All @@ -87,7 +79,8 @@ func createSummaryModel(
author: node.repoEventFields.author?.login ?? Constants.Strings.unknown,
status: node.status,
pullRequest: node.pullRequest,
labels: node.labelableFields.issueLabelModels
labels: node.labelableFields.issueLabelModels,
ciStatus: node.ciStatus
)
}

Expand All @@ -98,11 +91,13 @@ func createSummaryModel(
containerWidth: CGFloat
) -> (models: [RepositoryIssueSummaryModel], nextPage: String?) {
let nextPage = query.nextPageToken(from: data)
let models: [RepositoryIssueSummaryModel] = query.summaryTypes(from: data).compactMap { (node: RepositoryIssueSummaryType) in
return createSummaryModel(node, contentSizeCategory: contentSizeCategory, containerWidth: containerWidth)
}.sorted(by: {
$0.created > $1.created
})
let models = query.summaryTypes(from: data).compactMap { node in
return createSummaryModel(
node,
contentSizeCategory: contentSizeCategory,
containerWidth: containerWidth
)
}.sorted {$0.created > $1.created }
return (models, nextPage)
}

Expand Down Expand Up @@ -155,30 +150,6 @@ final class RepositoryClient {
})
}

func loadIssues(
nextPage: String? = nil,
containerWidth: CGFloat,
completion: @escaping (Result<RepositoryPayload>) -> Void
) {
loadPage(
query: RepoIssuePagesQuery(owner: owner, name: name, after: nextPage, page_size: 30),
containerWidth: containerWidth,
completion: completion
)
}

func loadPullRequests(
nextPage: String? = nil,
containerWidth: CGFloat,
completion: @escaping (Result<RepositoryPayload>) -> Void
) {
loadPage(
query: RepoPullRequestPagesQuery(owner: owner, name: name, after: nextPage, page_size: 30),
containerWidth: containerWidth,
completion: completion
)
}

func searchIssues(
query: String,
nextPage: String? = nil,
Expand Down
6 changes: 5 additions & 1 deletion Classes/Repository/RepositoryIssueSummaryModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class RepositoryIssueSummaryModel: ListDiffable {
let status: IssueStatus
let pullRequest: Bool
let labels: [RepositoryLabel]
let ciStatus: RepositoryIssueCIStatus?

// quicker comparison for diffing rather than scanning the labels array
let labelSummary: String
Expand All @@ -32,7 +33,8 @@ class RepositoryIssueSummaryModel: ListDiffable {
author: String,
status: IssueStatus,
pullRequest: Bool,
labels: [RepositoryLabel]
labels: [RepositoryLabel],
ciStatus: RepositoryIssueCIStatus?
) {
self.id = id
self.title = title
Expand All @@ -43,6 +45,7 @@ class RepositoryIssueSummaryModel: ListDiffable {
self.pullRequest = pullRequest
self.labels = labels
self.labelSummary = labels.reduce("", { $0 + $1.name })
self.ciStatus = ciStatus
}

// MARK: ListDiffable
Expand All @@ -62,5 +65,6 @@ class RepositoryIssueSummaryModel: ListDiffable {
&& created == object.created
&& title.string == object.title.string
&& labelSummary == object.labelSummary
&& ciStatus == object.ciStatus
}
}
7 changes: 7 additions & 0 deletions Classes/Repository/RepositoryIssueSummaryType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@

import IGListKit

enum RepositoryIssueCIStatus: String {
case pending = "PENDING"
case failure = "FAILURE"
case success = "SUCCESS"
}

protocol RepositoryIssueSummaryType {

var number: Int { get }
Expand All @@ -17,5 +23,6 @@ protocol RepositoryIssueSummaryType {
var labelableFields: LabelableFields { get }
var pullRequest: Bool { get }
var title: String { get }
var ciStatus: RepositoryIssueCIStatus? { get }

}
2 changes: 1 addition & 1 deletion Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ CHECKOUT OPTIONS:
:commit: 88d671bbe86e3c18d54e094fac97df12a3054d53
:git: https://github.com/GitHawkApp/Squawk.git
StyledTextKit:
:commit: d15f77a32203daafd71e14e6f5911528e932aca5
:commit: 8583c80e742f886e541c5ec500b7be6f5e7a233f
:git: https://github.com/GitHawkApp/StyledTextKit.git

SPEC CHECKSUMS:
Expand Down
2 changes: 1 addition & 1 deletion Pods/Manifest.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

61 changes: 57 additions & 4 deletions Pods/StyledTextKit/Source/StyledText.swift

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading