diff options
| author | Christian Cleberg <[email protected]> | 2026-04-13 13:26:08 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-04-13 13:26:08 -0500 |
| commit | 06b24715cd244475ded5482e926721a57278a3cf (patch) | |
| tree | 62eb3017a6bf42eb1bd061f09fcf231421ecc107 /Hutch/Views/Home/HomeViewModel.swift | |
| parent | f5f5757d0e1b78470429ae7cb9f742c95662849b (diff) | |
| download | hutch-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.swift | 8 |
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 } |
