summaryrefslogtreecommitdiff
path: root/Hutch/Views/Builds/BuildListViewModel.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-23 17:39:13 -0500
committerChristian Cleberg <[email protected]>2026-04-23 17:39:13 -0500
commit66601a8091a73f3e31f4fb534c38b3eca4756e93 (patch)
treef85cd883e63177d25dfe5993a4d545efa4812923 /Hutch/Views/Builds/BuildListViewModel.swift
parent380fb866d090c5f13b2ad3f88f1fe23c4ade4801 (diff)
downloadhutch-3.2.1.tar.gz
hutch-3.2.1.tar.bz2
hutch-3.2.1.zip
fix: profile loading error and user-timeline prefs updatev3.2.1
Diffstat (limited to 'Hutch/Views/Builds/BuildListViewModel.swift')
-rw-r--r--Hutch/Views/Builds/BuildListViewModel.swift28
1 files changed, 25 insertions, 3 deletions
diff --git a/Hutch/Views/Builds/BuildListViewModel.swift b/Hutch/Views/Builds/BuildListViewModel.swift
index cf5d786..14f50fd 100644
--- a/Hutch/Views/Builds/BuildListViewModel.swift
+++ b/Hutch/Views/Builds/BuildListViewModel.swift
@@ -45,6 +45,7 @@ enum AutoRefreshInterval: Int, CaseIterable, Sendable {
@MainActor
final class BuildListViewModel {
private static let searchHistoryScopeID = "builds"
+ nonisolated static let defaultLookbackDays = HomeViewModel.defaultFailedBuildLookbackDays
private(set) var jobs: [JobSummary] = [] {
didSet { updateFilteredJobs() }
@@ -68,6 +69,9 @@ final class BuildListViewModel {
updateFilteredJobs()
}
}
+ var lookbackDays = defaultLookbackDays {
+ didSet { updateFilteredJobs() }
+ }
// Cached filtered result. Updated whenever jobs, filter, searchText, or
// repoFilter changes. Only notifies observers when the content actually
// differs, which prevents the list from re-rendering on auto-refresh when
@@ -99,7 +103,7 @@ final class BuildListViewModel {
}
private func updateFilteredJobs() {
- var result = Self.filterJobs(jobs, filter: filter)
+ var result = Self.filterJobs(jobs, filter: filter, lookbackDays: lookbackDays)
if !repoFilter.isEmpty {
result = result.filter { $0.tags.contains(repoFilter) }
}
@@ -382,8 +386,14 @@ final class BuildListViewModel {
let cancel: CancelResult
}
- nonisolated static func filterJobs(_ jobs: [JobSummary], filter: BuildListFilter) -> [JobSummary] {
- jobs.filter { job in
+ nonisolated static func filterJobs(
+ _ jobs: [JobSummary],
+ filter: BuildListFilter,
+ lookbackDays: Int,
+ now: Date = .now,
+ calendar: Calendar = .current
+ ) -> [JobSummary] {
+ let filteredByStatus = jobs.filter { job in
switch filter {
case .attention:
switch job.status {
@@ -403,6 +413,18 @@ final class BuildListViewModel {
return true
}
}
+
+ let normalizedLookbackDays = HomeViewModel.allowedFailedBuildLookbackDays.contains(lookbackDays)
+ ? lookbackDays
+ : defaultLookbackDays
+ let startOfToday = calendar.startOfDay(for: now)
+ let windowStart = calendar.date(
+ byAdding: .day,
+ value: -(normalizedLookbackDays - 1),
+ to: startOfToday
+ ) ?? startOfToday
+
+ return filteredByStatus.filter { $0.updated >= windowStart }
}
nonisolated static func searchJobs(_ jobs: [JobSummary], matching query: String) -> [JobSummary] {