summaryrefslogtreecommitdiff
path: root/Hutch/Views/Home
diff options
context:
space:
mode:
Diffstat (limited to 'Hutch/Views/Home')
-rw-r--r--Hutch/Views/Home/HomeView.swift38
-rw-r--r--Hutch/Views/Home/HomeViewModel.swift14
2 files changed, 19 insertions, 33 deletions
diff --git a/Hutch/Views/Home/HomeView.swift b/Hutch/Views/Home/HomeView.swift
index bbae296..da58587 100644
--- a/Hutch/Views/Home/HomeView.swift
+++ b/Hutch/Views/Home/HomeView.swift
@@ -69,11 +69,11 @@ struct HomeView: View {
.listStyle(.insetGrouped)
.overlay {
if viewModel.isLoadingProjects && viewModel.isLoadingAssignedTickets && viewModel.isLoadingRecentBuilds &&
- viewModel.projects.isEmpty && viewModel.assignedTickets.isEmpty && viewModel.recentBuilds.isEmpty &&
+ viewModel.pinnedProjects.isEmpty && viewModel.assignedTickets.isEmpty && viewModel.recentBuilds.isEmpty &&
viewModel.unreadInboxThreads.isEmpty {
SRHTLoadingStateView(message: "Loading Home…")
} else if !viewModel.isLoadingProjects && !viewModel.isLoadingAssignedTickets && !viewModel.isLoadingRecentBuilds &&
- viewModel.projects.isEmpty && viewModel.assignedTickets.isEmpty && viewModel.recentBuilds.isEmpty &&
+ viewModel.pinnedProjects.isEmpty && viewModel.assignedTickets.isEmpty && viewModel.recentBuilds.isEmpty &&
viewModel.unreadInboxThreads.isEmpty &&
viewModel.assignedTicketsError == nil && viewModel.recentBuildsError == nil {
ContentUnavailableView(
@@ -179,17 +179,17 @@ struct HomeView: View {
@ViewBuilder
private func projectsSection(_ viewModel: HomeViewModel) -> some View {
- if !viewModel.projects.isEmpty {
- HomeSectionView("Projects", isExpanded: $projectsExpanded) {
+ if !viewModel.pinnedProjects.isEmpty {
+ HomeSectionView("Pinned Projects", isExpanded: $projectsExpanded) {
NavigationLink {
- HomeProjectsListView(viewModel: viewModel)
+ ProjectsListView()
} label: {
Text("See All")
.font(.caption.weight(.medium))
}
.buttonStyle(.plain)
} content: {
- ForEach(viewModel.projects.prefix(projectPreviewLimit)) { project in
+ ForEach(viewModel.pinnedProjects.prefix(projectPreviewLimit)) { project in
NavigationLink {
ProjectDetailView(project: project)
} label: {
@@ -411,32 +411,6 @@ private struct HomeProjectRow: View {
}
}
-private struct HomeProjectsListView: View {
- let viewModel: HomeViewModel
-
- var body: some View {
- List {
- ForEach(viewModel.projects) { project in
- NavigationLink {
- ProjectDetailView(project: project)
- } label: {
- HomeProjectRow(project: project)
- }
- }
- }
- .navigationTitle("Projects")
- .navigationBarTitleDisplayMode(.inline)
- .refreshable {
- await viewModel.loadDashboard()
- }
- .overlay {
- if viewModel.isLoadingProjects && viewModel.projects.isEmpty {
- SRHTLoadingStateView(message: "Loading projects…")
- }
- }
- }
-}
-
private struct HomeBuildRow: View {
@Environment(AppState.self) private var appState
let build: HomeBuildItem
diff --git a/Hutch/Views/Home/HomeViewModel.swift b/Hutch/Views/Home/HomeViewModel.swift
index ec2b324..e9f0f50 100644
--- a/Hutch/Views/Home/HomeViewModel.swift
+++ b/Hutch/Views/Home/HomeViewModel.swift
@@ -195,6 +195,10 @@ final class HomeViewModel {
private let ticketFetchConcurrencyLimit = 6
private let inboxUnreadConcurrencyLimit = 4
+ private var currentUserKey: String {
+ currentUser.canonicalName
+ }
+
private static let jobsQuery = """
query jobs {
jobs {
@@ -392,7 +396,15 @@ final class HomeViewModel {
}
var hasDashboardContent: Bool {
- !projects.isEmpty || !assignedTickets.isEmpty || !recentBuilds.isEmpty || !unreadInboxThreads.isEmpty || systemStatusSnapshot != nil
+ !pinnedProjects.isEmpty || !assignedTickets.isEmpty || !recentBuilds.isEmpty || !unreadInboxThreads.isEmpty || systemStatusSnapshot != nil
+ }
+
+ var pinnedProjects: [Project] {
+ let pinnedIDs = ProjectPinStore.loadPinnedProjectIDs(for: currentUserKey)
+ guard !pinnedIDs.isEmpty else { return [] }
+
+ let projectsByID = Dictionary(uniqueKeysWithValues: projects.map { ($0.id, $0) })
+ return pinnedIDs.compactMap { projectsByID[$0] }
}
var failedBuildCount: Int {