summaryrefslogtreecommitdiff
path: root/Hutch/Views/Home/HomeViewModel.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-13 13:26:08 -0500
committerChristian Cleberg <[email protected]>2026-04-13 13:26:08 -0500
commit06b24715cd244475ded5482e926721a57278a3cf (patch)
tree62eb3017a6bf42eb1bd061f09fcf231421ecc107 /Hutch/Views/Home/HomeViewModel.swift
parentf5f5757d0e1b78470429ae7cb9f742c95662849b (diff)
downloadhutch-06b24715cd244475ded5482e926721a57278a3cf.tar.gz
hutch-06b24715cd244475ded5482e926721a57278a3cf.tar.bz2
hutch-06b24715cd244475ded5482e926721a57278a3cf.zip
perf: reduce redundant fetches and improve list render efficiency
- Remove no-op per-row task from RepositoryListView; loadMoreIfNeeded is a stub for repos so each row was allocating a Task that did nothing - Fix BuildListView auto-refresh stopping permanently after navigating away; startAutoRefresh now runs unconditionally on task so it restarts on every reappear, not just first load - Add lastRefreshed tracking to HomeViewModel with a needsRefresh(after:) helper; HomeView and WorkView scene-activation handlers now skip loadDashboard() if the data is less than 60 seconds old - Add 120-second TTL to repository build status refresh; statuses are no longer re-fetched on every tab appear, only when stale or when the user explicitly pulls to refresh (forceRefresh: true) Implements: https://todo.sr.ht/~ccleberg/hutch/56
Diffstat (limited to 'Hutch/Views/Home/HomeViewModel.swift')
-rw-r--r--Hutch/Views/Home/HomeViewModel.swift8
1 files changed, 8 insertions, 0 deletions
diff --git a/Hutch/Views/Home/HomeViewModel.swift b/Hutch/Views/Home/HomeViewModel.swift
index f0c14dd..ec54759 100644
--- a/Hutch/Views/Home/HomeViewModel.swift
+++ b/Hutch/Views/Home/HomeViewModel.swift
@@ -188,6 +188,7 @@ final class HomeViewModel {
private(set) var projectsError: String?
private(set) var assignedTicketsError: String?
private(set) var recentBuildsError: String?
+ private(set) var lastRefreshed: Date?
private let currentUser: User
private let client: SRHTClient
@@ -405,10 +406,17 @@ final class HomeViewModel {
systemStatusErrorMessage = error.userFacingMessage
}
isLoadingSystemStatus = false
+ lastRefreshed = Date()
persistNeedsAttentionSnapshot()
persistSystemStatusWidgetSnapshot()
}
+ /// Returns true if sufficient time has elapsed since the last dashboard refresh.
+ func needsRefresh(after interval: TimeInterval = 60) -> Bool {
+ guard let lastRefreshed else { return true }
+ return Date().timeIntervalSince(lastRefreshed) > interval
+ }
+
var hasDashboardContent: Bool {
!pinnedProjects.isEmpty || !assignedTickets.isEmpty || !recentBuilds.isEmpty || !unreadInboxThreads.isEmpty || systemStatusSnapshot != nil
}