summaryrefslogtreecommitdiff
path: root/Hutch/App
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-13 13:09:57 -0500
committerChristian Cleberg <[email protected]>2026-04-13 13:09:57 -0500
commitf5f5757d0e1b78470429ae7cb9f742c95662849b (patch)
tree758f67965a985f4f1f52a456d9b672f8256851de /Hutch/App
parent0e461a382257979037e8927e5f6b468635b0a7fe (diff)
downloadhutch-3.0.0.tar.gz
hutch-3.0.0.tar.bz2
hutch-3.0.0.zip
release: v3.0.0 — navigation overhaul, Work view, and multi-pin supportv3.0.0
Reworks the app's core navigation and home screen for v3.0.0: - Replace Inbox with Work view: unified dashboard showing unread threads and assigned tickets, with All/Unread/Assigned scope picker - Overhaul Home screen: redesigned with pinned items grid (trackers, repos, mailing lists, users), recent activity section, and system status banner; backed by HomePinStore supporting all resource types - Simplify navigation bars across list screens: default toolbar shows only the primary action (+) and an overflow menu (…); pin, share, and select moved into the overflow menu; selection mode gets its own nav bar with Cancel / "N Selected" / All - Consolidate repo detail toolbars: pin and share moved into the existing actions menu for both Git and Mercurial detail views - Add recent activity tracking via RecentActivityStore - Add work and inbox deep link aliases (hutch://work, hutch://inbox) Implements: https://todo.sr.ht/~ccleberg/hutch/55
Diffstat (limited to 'Hutch/App')
-rw-r--r--Hutch/App/AppStorageKeys.swift2
-rw-r--r--Hutch/App/DeepLink.swift4
-rw-r--r--Hutch/App/HutchApp.swift2
-rw-r--r--Hutch/App/HutchIntents.swift4
-rw-r--r--Hutch/App/RootView.swift14
5 files changed, 23 insertions, 3 deletions
diff --git a/Hutch/App/AppStorageKeys.swift b/Hutch/App/AppStorageKeys.swift
index 4be8004..94e1310 100644
--- a/Hutch/App/AppStorageKeys.swift
+++ b/Hutch/App/AppStorageKeys.swift
@@ -5,12 +5,14 @@ enum AppStorageKeys {
static let activeAccountID = "activeAccountID"
static let wrapRepositoryFileLines = "wrapRepositoryFileLines"
static let lookupHistory = "lookupHistory"
+ static let recentActivity = "recentActivity"
static let scopedSearchHistory = "scopedSearchHistory"
static let hutchStatsBaseURL = "hutchStatsBaseURL"
static let systemStatusSnapshotCache = "systemStatusSnapshotCache"
static let systemStatusIncidentCache = "systemStatusIncidentCache"
static let homeProjectsExpanded = "homeProjectsExpanded"
static let pinnedHomeProjects = "pinnedHomeProjects"
+ static let pinnedHomeItems = "pinnedHomeItems"
static let homeAssignedTicketsExpanded = "homeAssignedTicketsExpanded"
static let homeBuildsExpanded = "homeBuildsExpanded"
static let buildsAutoRefreshInterval = "buildsAutoRefreshInterval"
diff --git a/Hutch/App/DeepLink.swift b/Hutch/App/DeepLink.swift
index bbf8885..786891d 100644
--- a/Hutch/App/DeepLink.swift
+++ b/Hutch/App/DeepLink.swift
@@ -3,6 +3,7 @@ import Foundation
/// Represents a parsed `hutch://` deep link.
enum DeepLink: Equatable {
case home
+ case work
/// hutch://git/<owner>/<repo>
case repository(owner: String, repo: String)
/// hutch://todo/<owner>/<tracker>/<ticketId>
@@ -33,6 +34,9 @@ enum DeepLink: Equatable {
case "home", nil:
self = .home
+ case "work", "inbox":
+ self = .work
+
case "git" where components.count >= 3:
let owner = components[1]
let repo = components[2]
diff --git a/Hutch/App/HutchApp.swift b/Hutch/App/HutchApp.swift
index 853b1c2..0fb1875 100644
--- a/Hutch/App/HutchApp.swift
+++ b/Hutch/App/HutchApp.swift
@@ -26,7 +26,7 @@ struct HutchApp: App {
let link: DeepLink
switch destination {
case .home: link = .home
- case .inbox: link = .home
+ case .work: link = .work
case .builds: link = .buildsTab
case .repositories: link = .repositoriesTab
case .trackers: link = .trackersTab
diff --git a/Hutch/App/HutchIntents.swift b/Hutch/App/HutchIntents.swift
index 652c07b..a7a33b3 100644
--- a/Hutch/App/HutchIntents.swift
+++ b/Hutch/App/HutchIntents.swift
@@ -5,7 +5,7 @@ import Foundation
enum HutchDestination: String, AppEnum {
case home
- case inbox
+ case work
case builds
case repositories
case trackers
@@ -16,7 +16,7 @@ enum HutchDestination: String, AppEnum {
static var caseDisplayRepresentations: [HutchDestination: DisplayRepresentation] = [
.home: "Home",
- .inbox: "Inbox",
+ .work: "Work",
.builds: "Builds",
.repositories: "Repositories",
.trackers: "Trackers",
diff --git a/Hutch/App/RootView.swift b/Hutch/App/RootView.swift
index f65bced..b4cf3bd 100644
--- a/Hutch/App/RootView.swift
+++ b/Hutch/App/RootView.swift
@@ -69,6 +69,12 @@ struct RootView: View {
return TabView(selection: $appState.selectedTab) {
NavigationStack(path: $homePath) {
HomeView()
+ .navigationDestination(for: HomeRoute.self) { route in
+ switch route {
+ case .work:
+ WorkView()
+ }
+ }
}
.tag(AppState.Tab.home)
.tabItem {
@@ -196,6 +202,14 @@ struct RootView: View {
case .ticket(let owner, let tracker, let ticketId):
resolveTicketLink(owner: owner, tracker: tracker, ticketId: ticketId)
+ case .work:
+ homePath = NavigationPath()
+ appState.selectedTab = .home
+ Task {
+ await settleNavigationTransition()
+ homePath.append(HomeRoute.work)
+ }
+
case .buildsTab:
buildsPath = NavigationPath()
appState.selectedTab = .builds