summaryrefslogtreecommitdiff
path: root/Hutch/Views
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-07-15 21:56:56 -0500
committerChristian Cleberg <[email protected]>2026-07-15 21:56:56 -0500
commit575e62f6dab44b0c9836623fe8b7d17a219f8e0f (patch)
treeef1740b6841259193e01e868da1dd1df683ae844 /Hutch/Views
parent22c7a0e45a5cc344e2fa0635431d95c23024ad63 (diff)
downloadhutch-575e62f6dab44b0c9836623fe8b7d17a219f8e0f.tar.gz
hutch-575e62f6dab44b0c9836623fe8b7d17a219f8e0f.tar.bz2
hutch-575e62f6dab44b0c9836623fe8b7d17a219f8e0f.zip
fix: push patchset views directly instead of by route
Tapping a patch failed with "no matching navigationDestination declaration visible from the location of the link". MailingListDetailView is presented from four places, but only the More tab and Lookup declare a MoreRoute destination. Reached from a project, via ProjectMailingListView, there is no such destination in the surrounding stack, so a NavigationLink carrying MoreRoute.patchset had nowhere to resolve. The thread rows beside it already use the closure form for exactly this reason. Push PatchsetDetailView directly, from the rows and from the version-chain links inside the detail view, which inherits whatever stack presented it. That leaves MoreRoute.patchset with no users, so it and its two destinations are removed rather than left as a route nothing links to. Neither the compiler nor the tests catch this: it is a runtime SwiftUI resolution failure.
Diffstat (limited to 'Hutch/Views')
-rw-r--r--Hutch/Views/Lookup/LookupView.swift2
-rw-r--r--Hutch/Views/Patchsets/PatchsetDetailView.swift12
-rw-r--r--Hutch/Views/Projects/ProjectMailingListView.swift6
3 files changed, 15 insertions, 5 deletions
diff --git a/Hutch/Views/Lookup/LookupView.swift b/Hutch/Views/Lookup/LookupView.swift
index b52bb3f..2a26282 100644
--- a/Hutch/Views/Lookup/LookupView.swift
+++ b/Hutch/Views/Lookup/LookupView.swift
@@ -465,8 +465,6 @@ struct LookupView: View {
ProjectDashboardDeepLinkView(projectID: id, title: title)
case .mailingList(let mailingList):
MailingListDetailView(mailingList: mailingList)
- case .patchset(let id, let listName):
- PatchsetDetailView(patchsetID: id, listName: listName)
case .thread(let thread):
ThreadDetailView(
thread: thread,
diff --git a/Hutch/Views/Patchsets/PatchsetDetailView.swift b/Hutch/Views/Patchsets/PatchsetDetailView.swift
index d76aab4..7bc5630 100644
--- a/Hutch/Views/Patchsets/PatchsetDetailView.swift
+++ b/Hutch/Views/Patchsets/PatchsetDetailView.swift
@@ -122,8 +122,14 @@ struct PatchsetDetailView: View {
// The version chain matters during review: a superseded series should
// usually be read at its newest version instead.
+ //
+ // Pushed directly rather than by value, for the same reason as the rows
+ // that lead here — this view inherits whatever stack presented it, and
+ // not all of them declare a MoreRoute destination.
if let supersededBy = patchset.supersededBy {
- NavigationLink(value: MoreRoute.patchset(id: supersededBy, listName: listName)) {
+ NavigationLink {
+ PatchsetDetailView(patchsetID: supersededBy, listName: listName)
+ } label: {
SwiftUI.Label("Superseded by a newer version", systemImage: "arrow.right.circle")
.font(.subheadline)
}
@@ -131,7 +137,9 @@ struct PatchsetDetailView: View {
}
if let supersedes = patchset.supersedes {
- NavigationLink(value: MoreRoute.patchset(id: supersedes, listName: listName)) {
+ NavigationLink {
+ PatchsetDetailView(patchsetID: supersedes, listName: listName)
+ } label: {
SwiftUI.Label("Revises an earlier version", systemImage: "arrow.left.circle")
.font(.subheadline)
}
diff --git a/Hutch/Views/Projects/ProjectMailingListView.swift b/Hutch/Views/Projects/ProjectMailingListView.swift
index 3933bf3..696cf6b 100644
--- a/Hutch/Views/Projects/ProjectMailingListView.swift
+++ b/Hutch/Views/Projects/ProjectMailingListView.swift
@@ -420,7 +420,11 @@ struct MailingListDetailView: View {
if showingPatches(viewModel) {
ForEach(viewModel.filteredPatchsets) { patchset in
- NavigationLink(value: MoreRoute.patchset(id: patchset.id, listName: mailingList.name)) {
+ // Pushed directly rather than by value: this view is also shown
+ // from a project, whose stack declares no MoreRoute destination.
+ NavigationLink {
+ PatchsetDetailView(patchsetID: patchset.id, listName: mailingList.name)
+ } label: {
PatchsetRow(patchset: patchset)
}
.themedRow()