From f5f5757d0e1b78470429ae7cb9f742c95662849b Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Mon, 13 Apr 2026 13:09:57 -0500 Subject: release: v3.0.0 — navigation overhaul, Work view, and multi-pin support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- Hutch/Views/Builds/BuildDetailView.swift | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'Hutch/Views/Builds/BuildDetailView.swift') diff --git a/Hutch/Views/Builds/BuildDetailView.swift b/Hutch/Views/Builds/BuildDetailView.swift index f8ab90d..5895f48 100644 --- a/Hutch/Views/Builds/BuildDetailView.swift +++ b/Hutch/Views/Builds/BuildDetailView.swift @@ -331,6 +331,13 @@ struct BuildDetailView: View { } } } + .task(id: job.id) { + RecentActivityStore.recordBuild( + jobId: job.id, + title: recentActivityTitle(for: job), + defaults: appState.accountDefaults + ) + } .refreshable { await reloadDetail(viewModel) } @@ -367,6 +374,16 @@ struct BuildDetailView: View { await viewModel.loadJob() } } + + private func recentActivityTitle(for job: JobDetail) -> String { + if let note = job.note?.trimmingCharacters(in: .whitespacesAndNewlines), !note.isEmpty { + return note + } + if !job.tags.isEmpty { + return job.tags.joined(separator: ", ") + } + return "Job #\(job.id)" + } } private struct BuildArtifactRow: View { -- cgit v1.2.3