krz/hutch

an ios client for sourcehut

clone: git clone https://gitbay.org/krz/hutch.git

v3.8.2: 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}