Hutch/Views/Repositories/RepositoryRowView.swift
85 lines · 2382 bytes
1import SwiftUI
2
3struct RepositoryRowView: View {
4 let repository: RepositorySummary
5
6 var body: some View {
7 VStack(alignment: .leading, spacing: 4) {
8 HStack(alignment: .firstTextBaseline) {
9 Text(repository.name)
10 .font(.headline)
11
12 Spacer()
13
14 if repository.service == .hg {
15 Text("HG")
16 .font(.caption2.weight(.medium))
17 .padding(.horizontal, 6)
18 .padding(.vertical, 2)
19 .background(Color.cyan.opacity(0.15), in: Capsule())
20 .foregroundStyle(.cyan)
21 }
22
23 VisibilityBadge(visibility: repository.visibility)
24 }
25
26 Text(repository.owner.canonicalName)
27 .font(.subheadline)
28 .foregroundStyle(.secondary)
29
30 if let description = repository.description,
31 !description.isEmpty {
32 Text(description)
33 .font(.subheadline)
34 .foregroundStyle(.secondary)
35 .lineLimit(2)
36 }
37
38 HStack(spacing: 12) {
39 if let head = repository.head {
40 Label(head.name, systemImage: "arrow.triangle.branch")
41 .font(.caption)
42 .foregroundStyle(.secondary)
43 }
44
45 Spacer()
46
47 Text(repository.updated.relativeDescription)
48 .font(.caption)
49 .foregroundStyle(.tertiary)
50 }
51 }
52 .padding(.vertical, 2)
53 }
54}
55
56// MARK: - VisibilityBadge
57
58struct VisibilityBadge: View {
59 let visibility: Visibility
60
61 var body: some View {
62 Text(label)
63 .font(.caption2.weight(.medium))
64 .padding(.horizontal, 6)
65 .padding(.vertical, 2)
66 .background(color.opacity(0.15), in: Capsule())
67 .foregroundStyle(color)
68 }
69
70 private var label: String {
71 switch visibility {
72 case .public: "PUBLIC"
73 case .unlisted: "UNLISTED"
74 case .private: "PRIVATE"
75 }
76 }
77
78 private var color: Color {
79 switch visibility {
80 case .public: .green
81 case .unlisted: .orange
82 case .private: .red
83 }
84 }
85}