krz/hutch
an ios client for sourcehut
clone: git clone https://gitbay.org/krz/hutch.git
v3.9.0: Hutch/Views/Repositories/CommitLogView.swift · raw
1import SwiftUI
2
3struct CommitLogView: View {
4 let viewModel: RepositoryDetailViewModel
5
6 var body: some View {
7 List {
8 ForEach(viewModel.commits) { commit in
9 NavigationLink(value: commit) {
10 CommitRowView(commit: commit, repository: viewModel.repository)
11 }
12 .task {
13 await viewModel.loadMoreCommitsIfNeeded(currentItem: commit)
14 }
15 }
16 .themedRow()
17
18 if viewModel.isLoadingMoreCommits {
19 HStack {
20 Spacer()
21 ProgressView()
22 Spacer()
23 }
24 .listRowSeparator(.hidden)
25 .themedRow()
26 }
27 }
28 .themedList()
29 .listStyle(.plain)
30 .overlay {
31 if viewModel.isLoadingCommits, viewModel.commits.isEmpty {
32 SRHTLoadingStateView(message: "Loading commits…")
33 } else if let error = viewModel.error, viewModel.commits.isEmpty {
34 SRHTErrorStateView(
35 title: "Couldn't Load Commits",
36 message: error,
37 retryAction: { await viewModel.loadCommits() }
38 )
39 } else if viewModel.commits.isEmpty {
40 ContentUnavailableView(
41 "No Commits",
42 systemImage: "clock.arrow.trianglehead.counterclockwise.rotate.90",
43 description: Text("This repository has no commit history.")
44 )
45 }
46 }
47 .task {
48 if viewModel.commits.isEmpty {
49 await viewModel.loadCommits()
50 }
51 }
52 .refreshable {
53 await viewModel.loadCommits()
54 }
55 .navigationDestination(for: CommitSummary.self) { commit in
56 CommitDetailView(
57 commitSummary: commit,
58 repository: viewModel.repository
59 )
60 }
61 }
62}