native macOS codings agent orchestrator
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #115 from supabitapp/toolbar-pr-badge

Align toolbar PR badge style

authored by

khoi and committed by
GitHub
ddb4dcaf 6fcd9af8

+100 -61
+51
supacode/Features/Repositories/Views/PullRequestBadgeView.swift
··· 1 + import SwiftUI 2 + 3 + enum PullRequestBadgeStyle { 4 + static let mergedColor = Color(red: 137.0 / 255.0, green: 87.0 / 255.0, blue: 229.0 / 255.0) 5 + static let openColor = Color(red: 35.0 / 255.0, green: 134.0 / 255.0, blue: 54.0 / 255.0) 6 + 7 + static func style(state: String?, number: Int?) -> (text: String, color: Color)? { 8 + guard let state = state?.uppercased() else { 9 + return nil 10 + } 11 + switch state { 12 + case "MERGED": 13 + return (text: number.map { "#\($0)" } ?? "MERGED", color: mergedColor) 14 + case "OPEN": 15 + return (text: number.map { "#\($0)" } ?? "OPEN", color: openColor) 16 + default: 17 + return nil 18 + } 19 + } 20 + 21 + static func helpText(state: String?, url: URL?) -> String { 22 + let state = state?.uppercased() 23 + switch state { 24 + case "MERGED": 25 + return url == nil ? "Pull request merged" : "Open merged pull request on GitHub" 26 + case "OPEN": 27 + return url == nil ? "Pull request open" : "Open pull request on GitHub" 28 + default: 29 + return url == nil ? "Pull request" : "Open pull request on GitHub" 30 + } 31 + } 32 + } 33 + 34 + struct PullRequestBadgeView: View { 35 + let text: String 36 + let color: Color 37 + 38 + var body: some View { 39 + Text(text) 40 + .font(.caption2) 41 + .monospaced() 42 + .foregroundStyle(color) 43 + .padding(.horizontal, 6) 44 + .padding(.vertical, 2) 45 + .overlay { 46 + RoundedRectangle(cornerRadius: 4) 47 + .stroke(color, lineWidth: 1) 48 + } 49 + .accessibilityLabel(text) 50 + } 51 + }
+33 -20
supacode/Features/Repositories/Views/PullRequestStatusButton.swift
··· 10 10 openURL(url) 11 11 } 12 12 } label: { 13 - HStack { 13 + HStack(spacing: 6) { 14 14 if let checkBreakdown = model.checkBreakdown { 15 15 PullRequestChecksRingView(breakdown: checkBreakdown) 16 16 } 17 - Text(model.label) 17 + PullRequestBadgeView( 18 + text: model.badgeText, 19 + color: model.badgeColor 20 + ) 21 + if let detailText = model.detailText { 22 + Text(detailText) 23 + } 18 24 } 25 + .font(.caption) 26 + .monospaced() 19 27 } 20 28 .buttonStyle(.plain) 21 - .font(.caption) 22 - .monospaced() 23 - .help("Open pull request on GitHub") 29 + .help(model.helpText) 24 30 } 25 31 26 32 } 27 33 28 34 struct PullRequestStatusModel: Equatable { 29 - let label: String 35 + let number: Int 36 + let state: String? 30 37 let url: URL? 31 38 let checkBreakdown: PullRequestCheckBreakdown? 32 - 33 - init(label: String, url: URL?, checkBreakdown: PullRequestCheckBreakdown?) { 34 - self.label = label 35 - self.url = url 36 - self.checkBreakdown = checkBreakdown 37 - } 39 + let detailText: String? 38 40 39 41 init?(snapshot: WorktreeInfoSnapshot?) { 40 42 guard ··· 44 46 else { 45 47 return nil 46 48 } 49 + self.number = number 47 50 let state = snapshot.pullRequestState?.uppercased() 48 - let url = snapshot.pullRequestURL.flatMap(URL.init(string:)) 51 + self.state = state 52 + self.url = snapshot.pullRequestURL.flatMap(URL.init(string:)) 49 53 if state == "MERGED" { 50 - self.label = "PR #\(number) - Merged" 51 - self.url = url 54 + self.detailText = "Merged" 52 55 self.checkBreakdown = nil 53 56 return 54 57 } 55 58 let isDraft = snapshot.pullRequestIsDraft 56 - let prefix = "PR #\(number)\(isDraft ? " (Drafted)" : "") ↗ - " 59 + let prefix = "\(isDraft ? "(Drafted) " : "")↗ - " 57 60 let checks = snapshot.pullRequestStatusChecks 58 61 if checks.isEmpty { 59 - self.label = prefix + "Checks unavailable" 60 - self.url = url 62 + self.detailText = prefix + "Checks unavailable" 61 63 self.checkBreakdown = nil 62 64 return 63 65 } ··· 79 81 if breakdown.total > 0 { 80 82 parts.append("\(breakdown.passed) successful") 81 83 } 82 - self.label = prefix + parts.joined(separator: ", ") + " \(checksLabel)" 83 - self.url = url 84 + self.detailText = prefix + parts.joined(separator: ", ") + " \(checksLabel)" 84 85 self.checkBreakdown = breakdown 86 + } 87 + 88 + var badgeText: String { 89 + PullRequestBadgeStyle.style(state: state, number: number)?.text ?? "#\(number)" 90 + } 91 + 92 + var badgeColor: Color { 93 + PullRequestBadgeStyle.style(state: state, number: number)?.color ?? .secondary 94 + } 95 + 96 + var helpText: String { 97 + "Open pull request on GitHub" 85 98 } 86 99 87 100 static func shouldDisplay(state: String?, number: Int?) -> Bool {
+16 -41
supacode/Features/Repositories/Views/WorktreeRow.swift
··· 29 29 let pullRequestState = displayPullRequest?.state.uppercased() 30 30 let pullRequestNumber = displayPullRequest?.number 31 31 let pullRequestURL = displayPullRequest.flatMap { URL(string: $0.url) } 32 - let isMerged = pullRequestState == "MERGED" 33 - let isOpen = pullRequestState == "OPEN" 34 - let mergedHelp = pullRequestURL == nil ? "Pull request merged" : "Open merged pull request on GitHub" 35 - let openHelp = pullRequestURL == nil ? "Pull request open" : "Open pull request on GitHub" 36 - let mergedColor = Color(red: 137.0 / 255.0, green: 87.0 / 255.0, blue: 229.0 / 255.0) 37 - let openColor = Color(red: 35.0 / 255.0, green: 134.0 / 255.0, blue: 54.0 / 255.0) 32 + let pullRequestBadgeStyle = PullRequestBadgeStyle.style( 33 + state: pullRequestState, 34 + number: pullRequestNumber 35 + ) 36 + let pullRequestHelp = PullRequestBadgeStyle.helpText(state: pullRequestState, url: pullRequestURL) 38 37 HStack(alignment: .center) { 39 38 ZStack { 40 39 if showsNotificationIndicator { ··· 78 77 .help("Run script active") 79 78 .accessibilityLabel("Run script active") 80 79 } 81 - if isMerged { 82 - if let pullRequestNumber { 83 - pullRequestBadge(text: "#\(pullRequestNumber)", color: mergedColor, help: mergedHelp, url: pullRequestURL) 84 - } else { 85 - pullRequestBadge(text: "MERGED", color: mergedColor, help: mergedHelp, url: pullRequestURL) 86 - } 87 - } else if isOpen { 88 - if let pullRequestNumber { 89 - pullRequestBadge(text: "#\(pullRequestNumber)", color: openColor, help: openHelp, url: pullRequestURL) 90 - } else { 91 - pullRequestBadge(text: "OPEN", color: openColor, help: openHelp, url: pullRequestURL) 92 - } 80 + if let pullRequestBadgeStyle { 81 + pullRequestBadge( 82 + text: pullRequestBadgeStyle.text, 83 + color: pullRequestBadgeStyle.color, 84 + help: pullRequestHelp, 85 + url: pullRequestURL 86 + ) 93 87 } 94 88 if let shortcutHint { 95 89 ShortcutHintView(text: shortcutHint, color: .secondary) ··· 103 97 Button { 104 98 openURL(url) 105 99 } label: { 106 - WorktreePullRequestBadge(text: text, color: color, help: help) 100 + PullRequestBadgeView(text: text, color: color) 107 101 } 108 102 .buttonStyle(.plain) 103 + .help(help) 109 104 } else { 110 - WorktreePullRequestBadge(text: text, color: color, help: help) 105 + PullRequestBadgeView(text: text, color: color) 106 + .help(help) 111 107 } 112 - } 113 - } 114 - 115 - private struct WorktreePullRequestBadge: View { 116 - let text: String 117 - let color: Color 118 - let help: String 119 - 120 - var body: some View { 121 - Text(text) 122 - .font(.caption2) 123 - .monospaced() 124 - .foregroundStyle(color) 125 - .padding(.horizontal, 6) 126 - .padding(.vertical, 2) 127 - .overlay { 128 - RoundedRectangle(cornerRadius: 4) 129 - .stroke(color, lineWidth: 1) 130 - } 131 - .help(help) 132 - .accessibilityLabel(text) 133 108 } 134 109 } 135 110