summaryrefslogtreecommitdiff
path: root/DomainDig/HistoryView.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-22 11:28:28 -0500
committerChristian Cleberg <[email protected]>2026-04-22 11:28:28 -0500
commitceac99c05f180d9008b75c9329822466ff60255b (patch)
tree073ea7cc959613479391020dc849c0705d98c0f5 /DomainDig/HistoryView.swift
parent9384a668bf36f23f71e25d05b490d1040d308845 (diff)
downloaddomain-dig-ceac99c05f180d9008b75c9329822466ff60255b.tar.gz
domain-dig-ceac99c05f180d9008b75c9329822466ff60255b.tar.bz2
domain-dig-ceac99c05f180d9008b75c9329822466ff60255b.zip
feat(v2.9.0): add risk scoring and deterministic insight engine
* introduce domain risk assessment with transparent factors * add insight engine for actionable observations * implement cross-domain insights for workflows * improve DNS, subdomain, email, and TLS interpretation * classify change impact severity * include insights and risk in export
Diffstat (limited to 'DomainDig/HistoryView.swift')
-rw-r--r--DomainDig/HistoryView.swift20
1 files changed, 18 insertions, 2 deletions
diff --git a/DomainDig/HistoryView.swift b/DomainDig/HistoryView.swift
index 3bda59d..e3a77f4 100644
--- a/DomainDig/HistoryView.swift
+++ b/DomainDig/HistoryView.swift
@@ -167,12 +167,24 @@ struct HistoryDetailView: View {
entry.snapshot
}
+ private var report: DomainReport {
+ DomainReportBuilder().build(from: entry, previousSnapshot: viewModel.comparisonSnapshot(for: entry))
+ }
+
+ private var trackedDomain: TrackedDomain? {
+ viewModel.trackedDomains.first { $0.domain.caseInsensitiveCompare(entry.domain) == .orderedSame }
+ }
+
var body: some View {
ScrollView(.vertical) {
VStack(alignment: .leading, spacing: 0) {
snapshotBanner
SummaryView(fields: DomainViewModel.summaryFields(from: snapshot))
.padding(.top, 8)
+ RiskSummaryCardView(report: report)
+ .padding(.top, 8)
+ InsightsSummaryCardView(insights: report.insights)
+ .padding(.top, 8)
DomainSectionView(
isCollapsed: .constant(false),
rows: DomainViewModel.domainRows(from: snapshot),
@@ -183,14 +195,14 @@ struct HistoryDetailView: View {
provenance: snapshot.provenanceBySection[.availability],
confidence: snapshot.availabilityConfidence,
snapshotNote: entry.note,
- trackedDomain: viewModel.trackedDomains.first(where: { $0.domain.lowercased() == entry.domain.lowercased() }),
+ trackedDomain: trackedDomain,
workflows: viewModel.workflowsContaining(domain: entry.domain),
trackingLimitMessage: nil,
onTrack: {
_ = viewModel.trackDomain(domain: entry.domain, availabilityStatus: entry.availabilityResult?.status)
},
onTogglePinned: {
- guard let trackedDomain = viewModel.trackedDomains.first(where: { $0.domain.lowercased() == entry.domain.lowercased() }) else { return }
+ guard let trackedDomain else { return }
viewModel.togglePinned(for: trackedDomain)
},
onEditNote: nil,
@@ -212,6 +224,7 @@ struct HistoryDetailView: View {
SubdomainsSectionView(
isCollapsed: .constant(false),
rows: DomainViewModel.subdomainRows(from: snapshot),
+ groups: report.subdomainGroups,
loading: false,
error: snapshot.subdomainsError,
provenance: snapshot.provenanceBySection[.subdomains],
@@ -235,6 +248,7 @@ struct HistoryDetailView: View {
DNSSectionView(
isCollapsed: .constant(false),
dnssecLabel: DomainViewModel.dnssecLabel(from: snapshot),
+ patternSummary: report.dns.patternSummary,
sections: DomainViewModel.dnsRows(from: snapshot),
ptrMessage: DomainViewModel.ptrMessage(from: snapshot),
loading: false,
@@ -247,6 +261,7 @@ struct HistoryDetailView: View {
isCollapsed: .constant(false),
certificateRows: DomainViewModel.webCertificateRows(from: snapshot),
sslInfo: snapshot.sslInfo,
+ tlsSummary: report.web,
sslLoading: false,
sslError: snapshot.sslError,
tlsProvenance: snapshot.provenanceBySection[.ssl],
@@ -265,6 +280,7 @@ struct HistoryDetailView: View {
EmailSectionView(
isCollapsed: .constant(false),
rows: DomainViewModel.emailRows(from: snapshot),
+ assessment: report.email,
loading: false,
provenance: snapshot.provenanceBySection[.emailSecurity],
confidence: snapshot.emailSecurityConfidence,