Hutch/Views/Repositories/RepositoryRowView.swift

b5af561d68e7535726b79d4ceec0d0a45abf0042
hutch/Hutch/Views/Repositories/RepositoryRowView.swift history · blame · raw

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}