aboutsummaryrefslogtreecommitdiff
path: root/Hutch/Views/Repositories/CommitLogView.swift
blob: 85e4d7a527638a2ebaf003d2035382a0c457838e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import SwiftUI

struct CommitLogView: View {
    let viewModel: RepositoryDetailViewModel

    var body: some View {
        List {
            ForEach(viewModel.commits) { commit in
                NavigationLink(value: commit) {
                    CommitRowView(commit: commit, repository: viewModel.repository)
                }
                .task {
                    await viewModel.loadMoreCommitsIfNeeded(currentItem: commit)
                }
            }
            .themedRow()

            if viewModel.isLoadingMoreCommits {
                HStack {
                    Spacer()
                    ProgressView()
                    Spacer()
                }
                .listRowSeparator(.hidden)
                .themedRow()
            }
        }
        .themedList()
        .listStyle(.plain)
        .overlay {
            if viewModel.isLoadingCommits, viewModel.commits.isEmpty {
                SRHTLoadingStateView(message: "Loading commits…")
            } else if let error = viewModel.error, viewModel.commits.isEmpty {
                SRHTErrorStateView(
                    title: "Couldn't Load Commits",
                    message: error,
                    retryAction: { await viewModel.loadCommits() }
                )
            } else if viewModel.commits.isEmpty {
                ContentUnavailableView(
                    "No Commits",
                    systemImage: "clock.arrow.trianglehead.counterclockwise.rotate.90",
                    description: Text("This repository has no commit history.")
                )
            }
        }
        .task {
            if viewModel.commits.isEmpty {
                await viewModel.loadCommits()
            }
        }
        .refreshable {
            await viewModel.loadCommits()
        }
        .navigationDestination(for: CommitSummary.self) { commit in
            CommitDetailView(
                commitSummary: commit,
                repository: viewModel.repository
            )
        }
    }
}