diff options
| author | Christian Cleberg <[email protected]> | 2026-07-17 16:06:47 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-07-17 16:06:47 -0500 |
| commit | d8862a9b78b0d6cf4e11cf537be7678794e08811 (patch) | |
| tree | 4af615370bb122e6706bbefc6deaa044e02b477b /octosentry/SecurityEventRow.swift | |
| download | octosentry-d8862a9b78b0d6cf4e11cf537be7678794e08811.tar.gz octosentry-d8862a9b78b0d6cf4e11cf537be7678794e08811.tar.bz2 octosentry-d8862a9b78b0d6cf4e11cf537be7678794e08811.zip | |
Scaffold octosentry MVP: unified GitHub security alert feed0.1.0
MenuBarExtra popover aggregating Dependabot, code scanning, and secret
scanning alerts for a single repo into one severity-ranked stream. Swift 6
strict concurrency, zero third-party dependencies, PAT-via-env-var auth as
a dev-only shortcut ahead of the device authorization flow.
Diffstat (limited to 'octosentry/SecurityEventRow.swift')
| -rw-r--r-- | octosentry/SecurityEventRow.swift | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/octosentry/SecurityEventRow.swift b/octosentry/SecurityEventRow.swift new file mode 100644 index 0000000..9a73037 --- /dev/null +++ b/octosentry/SecurityEventRow.swift @@ -0,0 +1,73 @@ +// +// SecurityEventRow.swift +// octosentry +// + +import AppKit +import SwiftUI + +struct SecurityEventRow: View { + let event: SecurityEvent + + private static let relativeFormatter: RelativeDateTimeFormatter = { + let formatter = RelativeDateTimeFormatter() + formatter.unitsStyle = .abbreviated + return formatter + }() + + var body: some View { + Button { + NSWorkspace.shared.open(event.detailURL) + } label: { + VStack(alignment: .leading, spacing: 3) { + HStack(spacing: 6) { + Text(event.nativeSeverityLabel.uppercased()) + .font(.caption2.weight(.bold)) + .foregroundStyle(event.severity.color) + .padding(.horizontal, 6) + .padding(.vertical, 2) + .background(event.severity.color.opacity(0.18), in: Capsule()) + + Text(event.source.displayName) + .font(.caption2.weight(.semibold)) + .padding(.horizontal, 6) + .padding(.vertical, 2) + .background(.secondary.opacity(0.15), in: Capsule()) + + Text(event.repoFullName) + .font(.caption) + .foregroundStyle(.secondary) + + Spacer() + + Text(Self.relativeFormatter.localizedString(for: event.createdAt, relativeTo: .now)) + .font(.caption2) + .foregroundStyle(.secondary) + } + + Text(event.summary) + .font(.callout) + .lineLimit(1) + .foregroundStyle(.primary) + } + .padding(10) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + } +} + +#Preview { + SecurityEventRow(event: SecurityEvent( + id: "preview-1", + source: .dependabot, + repoFullName: "zerolabsco/octosentry", + severity: .critical, + nativeSeverityLabel: "Critical", + summary: "Denial of service in some-package", + detailURL: URL(string: "https://github.com")!, + createdAt: .now.addingTimeInterval(-3600 * 26), + updatedAt: .now, + seenLocally: false + )) +} |
