krz/hutch

an ios client for sourcehut

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

v2.1: 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)
11                }
12                .task {
13                    await viewModel.loadMoreCommitsIfNeeded(currentItem: commit)
14                }
15            }
16
17            if viewModel.isLoadingMoreCommits {
18                HStack {
19                    Spacer()
20                    ProgressView()
21                    Spacer()
22                }
23                .listRowSeparator(.hidden)
24            }
25        }
26        .listStyle(.plain)
27        .overlay {
28            if viewModel.isLoadingCommits, viewModel.commits.isEmpty {
29                SRHTLoadingStateView(message: "Loading commits…")
30            } else if let error = viewModel.error, viewModel.commits.isEmpty {
31                SRHTErrorStateView(
32                    title: "Couldn't Load Commits",
33                    message: error,
34                    retryAction: { await viewModel.loadCommits() }
35                )
36            } else if viewModel.commits.isEmpty {
37                ContentUnavailableView(
38                    "No Commits",
39                    systemImage: "clock.arrow.trianglehead.counterclockwise.rotate.90",
40                    description: Text("This repository has no commit history.")
41                )
42            }
43        }
44        .task {
45            if viewModel.commits.isEmpty {
46                await viewModel.loadCommits()
47            }
48        }
49        .refreshable {
50            await viewModel.loadCommits()
51        }
52        .navigationDestination(for: CommitSummary.self) { commit in
53            CommitDetailView(
54                commitSummary: commit,
55                repository: viewModel.repository
56            )
57        }
58    }
59}